'use strict'; var obsidian = require('obsidian'); var require$$0 = require('crypto'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ function __awaiter(thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); } const DEFAULT_SETTINGS = { timelineTag: 'timeline', sortDirection: true }; const RENDER_TIMELINE = /<!--TIMELINE BEGIN tags=['"]([^"]*?)['"]-->(.*)+?<!--TIMELINE END-->/im; class TimelinesSettingTab extends obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { let { containerEl } = this; containerEl.empty(); containerEl.createEl('h2', { text: 'Obsidian Timelines Settings' }); new obsidian.Setting(containerEl) .setName('Default timeline tag') .setDesc("Tag to specify which notes to include in created timelines e.g. timeline for #timeline tag") .addText(text => text .setPlaceholder(this.plugin.settings.timelineTag) .onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.timelineTag = value; yield this.plugin.saveSettings(); }))); new obsidian.Setting(containerEl) .setName('Chronological Direction') .setDesc('Default: OLD -> NEW. Turn this setting off: NEW -> OLD') .addToggle((toggle) => { toggle.setValue(this.plugin.settings.sortDirection); toggle.onChange((value) => __awaiter(this, void 0, void 0, function* () { this.plugin.settings.sortDirection = value; yield this.plugin.saveSettings(); })); }); } } var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function createCommonjsModule(fn, basedir, module) { return module = { path: basedir, exports: {}, require: function (path, base) { return commonjsRequire(path, (base === undefined || base === null) ? module.path : base); } }, fn(module, module.exports), module.exports; } function commonjsRequire () { throw new Error('Dynamic requires are not currently supported by @rollup/plugin-commonjs'); } var moment = createCommonjsModule(function (module, exports) { (function (global, factory) { module.exports = factory() ; }(commonjsGlobal, (function () { var hookCallback; function hooks() { return hookCallback.apply(null, arguments); } // This is done to register the method called with moment() // without creating circular dependencies. function setHookCallback(callback) { hookCallback = callback; } function isArray(input) { return ( input instanceof Array || Object.prototype.toString.call(input) === '[object Array]' ); } function isObject(input) { // IE8 will treat undefined and null as object if it wasn't for // input != null return ( input != null && Object.prototype.toString.call(input) === '[object Object]' ); } function hasOwnProp(a, b) { return Object.prototype.hasOwnProperty.call(a, b); } function isObjectEmpty(obj) { if (Object.getOwnPropertyNames) { return Object.getOwnPropertyNames(obj).length === 0; } else { var k; for (k in obj) { if (hasOwnProp(obj, k)) { return false; } } return true; } } function isUndefined(input) { return input === void 0; } function isNumber(input) { return ( typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]' ); } function isDate(input) { return ( input instanceof Date || Object.prototype.toString.call(input) === '[object Date]' ); } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function createUTC(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, true).utc(); } function defaultParsingFlags() { // We need to deep clone this object. return { empty: false, unusedTokens: [], unusedInput: [], overflow: -2, charsLeftOver: 0, nullInput: false, invalidEra: null, invalidMonth: null, invalidFormat: false, userInvalidated: false, iso: false, parsedDateParts: [], era: null, meridiem: null, rfc2822: false, weekdayMismatch: false, }; } function getParsingFlags(m) { if (m._pf == null) { m._pf = defaultParsingFlags(); } return m._pf; } var some; if (Array.prototype.some) { some = Array.prototype.some; } else { some = function (fun) { var t = Object(this), len = t.length >>> 0, i; for (i = 0; i < len; i++) { if (i in t && fun.call(this, t[i], i, t)) { return true; } } return false; }; } function isValid(m) { if (m._isValid == null) { var flags = getParsingFlags(m), parsedParts = some.call(flags.parsedDateParts, function (i) { return i != null; }), isNowValid = !isNaN(m._d.getTime()) && flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || (flags.meridiem && parsedParts)); if (m._strict) { isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined; } if (Object.isFrozen == null || !Object.isFrozen(m)) { m._isValid = isNowValid; } else { return isNowValid; } } return m._isValid; } function createInvalid(flags) { var m = createUTC(NaN); if (flags != null) { extend(getParsingFlags(m), flags); } else { getParsingFlags(m).userInvalidated = true; } return m; } // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. var momentProperties = (hooks.momentProperties = []), updateInProgress = false; function copyConfig(to, from) { var i, prop, val; if (!isUndefined(from._isAMomentObject)) { to._isAMomentObject = from._isAMomentObject; } if (!isUndefined(from._i)) { to._i = from._i; } if (!isUndefined(from._f)) { to._f = from._f; } if (!isUndefined(from._l)) { to._l = from._l; } if (!isUndefined(from._strict)) { to._strict = from._strict; } if (!isUndefined(from._tzm)) { to._tzm = from._tzm; } if (!isUndefined(from._isUTC)) { to._isUTC = from._isUTC; } if (!isUndefined(from._offset)) { to._offset = from._offset; } if (!isUndefined(from._pf)) { to._pf = getParsingFlags(from); } if (!isUndefined(from._locale)) { to._locale = from._locale; } if (momentProperties.length > 0) { for (i = 0; i < momentProperties.length; i++) { prop = momentProperties[i]; val = from[prop]; if (!isUndefined(val)) { to[prop] = val; } } } return to; } // Moment prototype object function Moment(config) { copyConfig(this, config); this._d = new Date(config._d != null ? config._d.getTime() : NaN); if (!this.isValid()) { this._d = new Date(NaN); } // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; hooks.updateOffset(this); updateInProgress = false; } } function isMoment(obj) { return ( obj instanceof Moment || (obj != null && obj._isAMomentObject != null) ); } function warn(msg) { if ( hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn ) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(null, msg); } if (firstTime) { var args = [], arg, i, key; for (i = 0; i < arguments.length; i++) { arg = ''; if (typeof arguments[i] === 'object') { arg += '\n[' + i + '] '; for (key in arguments[0]) { if (hasOwnProp(arguments[0], key)) { arg += key + ': ' + arguments[0][key] + ', '; } } arg = arg.slice(0, -2); // Remove trailing comma and space } else { arg = arguments[i]; } args.push(arg); } warn( msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + new Error().stack ); firstTime = false; } return fn.apply(this, arguments); }, fn); } var deprecations = {}; function deprecateSimple(name, msg) { if (hooks.deprecationHandler != null) { hooks.deprecationHandler(name, msg); } if (!deprecations[name]) { warn(msg); deprecations[name] = true; } } hooks.suppressDeprecationWarnings = false; hooks.deprecationHandler = null; function isFunction(input) { return ( (typeof Function !== 'undefined' && input instanceof Function) || Object.prototype.toString.call(input) === '[object Function]' ); } function set(config) { var prop, i; for (i in config) { if (hasOwnProp(config, i)) { prop = config[i]; if (isFunction(prop)) { this[i] = prop; } else { this['_' + i] = prop; } } } this._config = config; // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. // TODO: Remove "ordinalParse" fallback in next major release. this._dayOfMonthOrdinalParseLenient = new RegExp( (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\d{1,2}/.source ); } function mergeConfigs(parentConfig, childConfig) { var res = extend({}, parentConfig), prop; for (prop in childConfig) { if (hasOwnProp(childConfig, prop)) { if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { res[prop] = {}; extend(res[prop], parentConfig[prop]); extend(res[prop], childConfig[prop]); } else if (childConfig[prop] != null) { res[prop] = childConfig[prop]; } else { delete res[prop]; } } } for (prop in parentConfig) { if ( hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop]) ) { // make sure changes to properties don't modify parent config res[prop] = extend({}, res[prop]); } } return res; } function Locale(config) { if (config != null) { this.set(config); } } var keys; if (Object.keys) { keys = Object.keys; } else { keys = function (obj) { var i, res = []; for (i in obj) { if (hasOwnProp(obj, i)) { res.push(i); } } return res; }; } var defaultCalendar = { sameDay: '[Today at] LT', nextDay: '[Tomorrow at] LT', nextWeek: 'dddd [at] LT', lastDay: '[Yesterday at] LT', lastWeek: '[Last] dddd [at] LT', sameElse: 'L', }; function calendar(key, mom, now) { var output = this._calendar[key] || this._calendar['sameElse']; return isFunction(output) ? output.call(mom, now) : output; } function zeroFill(number, targetLength, forceSign) { var absNumber = '' + Math.abs(number), zerosToFill = targetLength - absNumber.length, sign = number >= 0; return ( (sign ? (forceSign ? '+' : '') : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber ); } var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, formatFunctions = {}, formatTokenFunctions = {}; // token: 'M' // padded: ['MM', 2] // ordinal: 'Mo' // callback: function () { this.month() + 1 } function addFormatToken(token, padded, ordinal, callback) { var func = callback; if (typeof callback === 'string') { func = function () { return this[callback](); }; } if (token) { formatTokenFunctions[token] = func; } if (padded) { formatTokenFunctions[padded[0]] = function () { return zeroFill(func.apply(this, arguments), padded[1], padded[2]); }; } if (ordinal) { formatTokenFunctions[ordinal] = function () { return this.localeData().ordinal( func.apply(this, arguments), token ); }; } } function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = '', i; for (i = 0; i < length; i++) { output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace( localFormattingTokens, replaceLongDateFormatTokens ); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } var defaultLongDateFormat = { LTS: 'h:mm:ss A', LT: 'h:mm A', L: 'MM/DD/YYYY', LL: 'MMMM D, YYYY', LLL: 'MMMM D, YYYY h:mm A', LLLL: 'dddd, MMMM D, YYYY h:mm A', }; function longDateFormat(key) { var format = this._longDateFormat[key], formatUpper = this._longDateFormat[key.toUpperCase()]; if (format || !formatUpper) { return format; } this._longDateFormat[key] = formatUpper .match(formattingTokens) .map(function (tok) { if ( tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd' ) { return tok.slice(1); } return tok; }) .join(''); return this._longDateFormat[key]; } var defaultInvalidDate = 'Invalid date'; function invalidDate() { return this._invalidDate; } var defaultOrdinal = '%d', defaultDayOfMonthOrdinalParse = /\d{1,2}/; function ordinal(number) { return this._ordinal.replace('%d', number); } var defaultRelativeTime = { future: 'in %s', past: '%s ago', s: 'a few seconds', ss: '%d seconds', m: 'a minute', mm: '%d minutes', h: 'an hour', hh: '%d hours', d: 'a day', dd: '%d days', w: 'a week', ww: '%d weeks', M: 'a month', MM: '%d months', y: 'a year', yy: '%d years', }; function relativeTime(number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); } function pastFuture(diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return isFunction(format) ? format(output) : format.replace(/%s/i, output); } var aliases = {}; function addUnitAlias(unit, shorthand) { var lowerCase = unit.toLowerCase(); aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; } function normalizeUnits(units) { return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } var priorities = {}; function addUnitPriority(unit, priority) { priorities[unit] = priority; } function getPrioritizedUnits(unitsObj) { var units = [], u; for (u in unitsObj) { if (hasOwnProp(unitsObj, u)) { units.push({ unit: u, priority: priorities[u] }); } } units.sort(function (a, b) { return a.priority - b.priority; }); return units; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } function absFloor(number) { if (number < 0) { // -0 -> 0 return Math.ceil(number) || 0; } else { return Math.floor(number); } } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { value = absFloor(coercedNumber); } return value; } function makeGetSet(unit, keepTime) { return function (value) { if (value != null) { set$1(this, unit, value); hooks.updateOffset(this, keepTime); return this; } else { return get(this, unit); } }; } function get(mom, unit) { return mom.isValid() ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; } function set$1(mom, unit, value) { if (mom.isValid() && !isNaN(value)) { if ( unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29 ) { value = toInt(value); mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( value, mom.month(), daysInMonth(value, mom.month()) ); } else { mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } } // MOMENTS function stringGet(units) { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](); } return this; } function stringSet(units, value) { if (typeof units === 'object') { units = normalizeObjectUnits(units); var prioritized = getPrioritizedUnits(units), i; for (i = 0; i < prioritized.length; i++) { this[prioritized[i].unit](units[prioritized[i].unit]); } } else { units = normalizeUnits(units); if (isFunction(this[units])) { return this[units](value); } } return this; } var match1 = /\d/, // 0 - 9 match2 = /\d\d/, // 00 - 99 match3 = /\d{3}/, // 000 - 999 match4 = /\d{4}/, // 0000 - 9999 match6 = /[+-]?\d{6}/, // -999999 - 999999 match1to2 = /\d\d?/, // 0 - 99 match3to4 = /\d\d\d\d?/, // 999 - 9999 match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 match1to3 = /\d{1,3}/, // 0 - 999 match1to4 = /\d{1,4}/, // 0 - 9999 match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 matchUnsigned = /\d+/, // 0 - inf matchSigned = /[+-]?\d+/, // -inf - inf matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 // any word (or two) characters or numbers including two/three word month in arabic. // includes scottish gaelic two word and hyphenated months matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, regexes; regexes = {}; function addRegexToken(token, regex, strictRegex) { regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { return isStrict && strictRegex ? strictRegex : regex; }; } function getParseRegexForToken(token, config) { if (!hasOwnProp(regexes, token)) { return new RegExp(unescapeFormat(token)); } return regexes[token](config._strict, config._locale); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function unescapeFormat(s) { return regexEscape( s .replace('\\', '') .replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function ( matched, p1, p2, p3, p4 ) { return p1 || p2 || p3 || p4; }) ); } function regexEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } var tokens = {}; function addParseToken(token, callback) { var i, func = callback; if (typeof token === 'string') { token = [token]; } if (isNumber(callback)) { func = function (input, array) { array[callback] = toInt(input); }; } for (i = 0; i < token.length; i++) { tokens[token[i]] = func; } } function addWeekParseToken(token, callback) { addParseToken(token, function (input, array, config, token) { config._w = config._w || {}; callback(input, config._w, config, token); }); } function addTimeToArrayFromToken(token, input, config) { if (input != null && hasOwnProp(tokens, token)) { tokens[token](input, config._a, config, token); } } var YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, WEEK = 7, WEEKDAY = 8; function mod(n, x) { return ((n % x) + x) % x; } var indexOf; if (Array.prototype.indexOf) { indexOf = Array.prototype.indexOf; } else { indexOf = function (o) { // I know var i; for (i = 0; i < this.length; ++i) { if (this[i] === o) { return i; } } return -1; }; } function daysInMonth(year, month) { if (isNaN(year) || isNaN(month)) { return NaN; } var modMonth = mod(month, 12); year += (month - modMonth) / 12; return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - ((modMonth % 7) % 2); } // FORMATTING addFormatToken('M', ['MM', 2], 'Mo', function () { return this.month() + 1; }); addFormatToken('MMM', 0, 0, function (format) { return this.localeData().monthsShort(this, format); }); addFormatToken('MMMM', 0, 0, function (format) { return this.localeData().months(this, format); }); // ALIASES addUnitAlias('month', 'M'); // PRIORITY addUnitPriority('month', 8); // PARSING addRegexToken('M', match1to2); addRegexToken('MM', match1to2, match2); addRegexToken('MMM', function (isStrict, locale) { return locale.monthsShortRegex(isStrict); }); addRegexToken('MMMM', function (isStrict, locale) { return locale.monthsRegex(isStrict); }); addParseToken(['M', 'MM'], function (input, array) { array[MONTH] = toInt(input) - 1; }); addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { var month = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (month != null) { array[MONTH] = month; } else { getParsingFlags(config).invalidMonth = input; } }); // LOCALES var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split( '_' ), defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split( '_' ), MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, defaultMonthsShortRegex = matchWord, defaultMonthsRegex = matchWord; function localeMonths(m, format) { if (!m) { return isArray(this._months) ? this._months : this._months['standalone']; } return isArray(this._months) ? this._months[m.month()] : this._months[ (this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone' ][m.month()]; } function localeMonthsShort(m, format) { if (!m) { return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone']; } return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[ MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' ][m.month()]; } function handleStrictParse(monthName, format, strict) { var i, ii, mom, llc = monthName.toLocaleLowerCase(); if (!this._monthsParse) { // this is not used this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; for (i = 0; i < 12; ++i) { mom = createUTC([2000, i]); this._shortMonthsParse[i] = this.monthsShort( mom, '' ).toLocaleLowerCase(); this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'MMM') { ii = indexOf.call(this._shortMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._longMonthsParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._longMonthsParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortMonthsParse, llc); return ii !== -1 ? ii : null; } } } function localeMonthsParse(monthName, format, strict) { var i, mom, regex; if (this._monthsParseExact) { return handleStrictParse.call(this, monthName, format, strict); } if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } // TODO: add sorting // Sorting makes sure if one month (or abbr) is a prefix of another // see sorting in computeMonthsParse for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp( '^' + this.months(mom, '').replace('.', '') + '$', 'i' ); this._shortMonthsParse[i] = new RegExp( '^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i' ); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName) ) { return i; } else if ( strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName) ) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } } // MOMENTS function setMonth(mom, value) { var dayOfMonth; if (!mom.isValid()) { // No op return mom; } if (typeof value === 'string') { if (/^\d+$/.test(value)) { value = toInt(value); } else { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (!isNumber(value)) { return mom; } } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function getSetMonth(value) { if (value != null) { setMonth(this, value); hooks.updateOffset(this, true); return this; } else { return get(this, 'Month'); } } function getDaysInMonth() { return daysInMonth(this.year(), this.month()); } function monthsShortRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsShortStrictRegex; } else { return this._monthsShortRegex; } } else { if (!hasOwnProp(this, '_monthsShortRegex')) { this._monthsShortRegex = defaultMonthsShortRegex; } return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex; } } function monthsRegex(isStrict) { if (this._monthsParseExact) { if (!hasOwnProp(this, '_monthsRegex')) { computeMonthsParse.call(this); } if (isStrict) { return this._monthsStrictRegex; } else { return this._monthsRegex; } } else { if (!hasOwnProp(this, '_monthsRegex')) { this._monthsRegex = defaultMonthsRegex; } return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex; } } function computeMonthsParse() { function cmpLenRev(a, b) { return b.length - a.length; } var shortPieces = [], longPieces = [], mixedPieces = [], i, mom; for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = createUTC([2000, i]); shortPieces.push(this.monthsShort(mom, '')); longPieces.push(this.months(mom, '')); mixedPieces.push(this.months(mom, '')); mixedPieces.push(this.monthsShort(mom, '')); } // Sorting makes sure if one month (or abbr) is a prefix of another it // will match the longer piece. shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); for (i = 0; i < 12; i++) { shortPieces[i] = regexEscape(shortPieces[i]); longPieces[i] = regexEscape(longPieces[i]); } for (i = 0; i < 24; i++) { mixedPieces[i] = regexEscape(mixedPieces[i]); } this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._monthsShortRegex = this._monthsRegex; this._monthsStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._monthsShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken('Y', 0, 0, function () { var y = this.year(); return y <= 9999 ? zeroFill(y, 4) : '+' + y; }); addFormatToken(0, ['YY', 2], 0, function () { return this.year() % 100; }); addFormatToken(0, ['YYYY', 4], 0, 'year'); addFormatToken(0, ['YYYYY', 5], 0, 'year'); addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); // ALIASES addUnitAlias('year', 'y'); // PRIORITIES addUnitPriority('year', 1); // PARSING addRegexToken('Y', matchSigned); addRegexToken('YY', match1to2, match2); addRegexToken('YYYY', match1to4, match4); addRegexToken('YYYYY', match1to6, match6); addRegexToken('YYYYYY', match1to6, match6); addParseToken(['YYYYY', 'YYYYYY'], YEAR); addParseToken('YYYY', function (input, array) { array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); }); addParseToken('YY', function (input, array) { array[YEAR] = hooks.parseTwoDigitYear(input); }); addParseToken('Y', function (input, array) { array[YEAR] = parseInt(input, 10); }); // HELPERS function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } // HOOKS hooks.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; // MOMENTS var getSetYear = makeGetSet('FullYear', true); function getIsLeapYear() { return isLeapYear(this.year()); } function createDate(y, m, d, h, M, s, ms) { // can't just apply() to create a date: // https://stackoverflow.com/q/181348 var date; // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset date = new Date(y + 400, m, d, h, M, s, ms); if (isFinite(date.getFullYear())) { date.setFullYear(y); } } else { date = new Date(y, m, d, h, M, s, ms); } return date; } function createUTCDate(y) { var date, args; // the Date.UTC function remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { args = Array.prototype.slice.call(arguments); // preserve leap years using a full 400 year cycle, then reset args[0] = y + 400; date = new Date(Date.UTC.apply(null, args)); if (isFinite(date.getUTCFullYear())) { date.setUTCFullYear(y); } } else { date = new Date(Date.UTC.apply(null, arguments)); } return date; } // start-of-first-week - start-of-year function firstWeekOffset(year, dow, doy) { var // first-week day -- which january is always in the first week (4 for iso, 1 for other) fwd = 7 + dow - doy, // first-week day local weekday -- which local weekday is fwd fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; return -fwdlw + fwd - 1; } // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, dow, doy) { var localWeekday = (7 + weekday - dow) % 7, weekOffset = firstWeekOffset(year, dow, doy), dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, resYear, resDayOfYear; if (dayOfYear <= 0) { resYear = year - 1; resDayOfYear = daysInYear(resYear) + dayOfYear; } else if (dayOfYear > daysInYear(year)) { resYear = year + 1; resDayOfYear = dayOfYear - daysInYear(year); } else { resYear = year; resDayOfYear = dayOfYear; } return { year: resYear, dayOfYear: resDayOfYear, }; } function weekOfYear(mom, dow, doy) { var weekOffset = firstWeekOffset(mom.year(), dow, doy), week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, resWeek, resYear; if (week < 1) { resYear = mom.year() - 1; resWeek = week + weeksInYear(resYear, dow, doy); } else if (week > weeksInYear(mom.year(), dow, doy)) { resWeek = week - weeksInYear(mom.year(), dow, doy); resYear = mom.year() + 1; } else { resYear = mom.year(); resWeek = week; } return { week: resWeek, year: resYear, }; } function weeksInYear(year, dow, doy) { var weekOffset = firstWeekOffset(year, dow, doy), weekOffsetNext = firstWeekOffset(year + 1, dow, doy); return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; } // FORMATTING addFormatToken('w', ['ww', 2], 'wo', 'week'); addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); // ALIASES addUnitAlias('week', 'w'); addUnitAlias('isoWeek', 'W'); // PRIORITIES addUnitPriority('week', 5); addUnitPriority('isoWeek', 5); // PARSING addRegexToken('w', match1to2); addRegexToken('ww', match1to2, match2); addRegexToken('W', match1to2); addRegexToken('WW', match1to2, match2); addWeekParseToken(['w', 'ww', 'W', 'WW'], function ( input, week, config, token ) { week[token.substr(0, 1)] = toInt(input); }); // HELPERS // LOCALES function localeWeek(mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; } var defaultLocaleWeek = { dow: 0, // Sunday is the first day of the week. doy: 6, // The week that contains Jan 6th is the first week of the year. }; function localeFirstDayOfWeek() { return this._week.dow; } function localeFirstDayOfYear() { return this._week.doy; } // MOMENTS function getSetWeek(input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); } function getSetISOWeek(input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); } // FORMATTING addFormatToken('d', 0, 'do', 'day'); addFormatToken('dd', 0, 0, function (format) { return this.localeData().weekdaysMin(this, format); }); addFormatToken('ddd', 0, 0, function (format) { return this.localeData().weekdaysShort(this, format); }); addFormatToken('dddd', 0, 0, function (format) { return this.localeData().weekdays(this, format); }); addFormatToken('e', 0, 0, 'weekday'); addFormatToken('E', 0, 0, 'isoWeekday'); // ALIASES addUnitAlias('day', 'd'); addUnitAlias('weekday', 'e'); addUnitAlias('isoWeekday', 'E'); // PRIORITY addUnitPriority('day', 11); addUnitPriority('weekday', 11); addUnitPriority('isoWeekday', 11); // PARSING addRegexToken('d', match1to2); addRegexToken('e', match1to2); addRegexToken('E', match1to2); addRegexToken('dd', function (isStrict, locale) { return locale.weekdaysMinRegex(isStrict); }); addRegexToken('ddd', function (isStrict, locale) { return locale.weekdaysShortRegex(isStrict); }); addRegexToken('dddd', function (isStrict, locale) { return locale.weekdaysRegex(isStrict); }); addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { var weekday = config._locale.weekdaysParse(input, token, config._strict); // if we didn't get a weekday name, mark the date as invalid if (weekday != null) { week.d = weekday; } else { getParsingFlags(config).invalidWeekday = input; } }); addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { week[token] = toInt(input); }); // HELPERS function parseWeekday(input, locale) { if (typeof input !== 'string') { return input; } if (!isNaN(input)) { return parseInt(input, 10); } input = locale.weekdaysParse(input); if (typeof input === 'number') { return input; } return null; } function parseIsoWeekday(input, locale) { if (typeof input === 'string') { return locale.weekdaysParse(input) % 7 || 7; } return isNaN(input) ? null : input; } // LOCALES function shiftWeekdays(ws, n) { return ws.slice(n, 7).concat(ws.slice(0, n)); } var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split( '_' ), defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), defaultWeekdaysRegex = matchWord, defaultWeekdaysShortRegex = matchWord, defaultWeekdaysMinRegex = matchWord; function localeWeekdays(m, format) { var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[ m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone' ]; return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays; } function localeWeekdaysShort(m) { return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort; } function localeWeekdaysMin(m) { return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin; } function handleStrictParse$1(weekdayName, format, strict) { var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); if (!this._weekdaysParse) { this._weekdaysParse = []; this._shortWeekdaysParse = []; this._minWeekdaysParse = []; for (i = 0; i < 7; ++i) { mom = createUTC([2000, 1]).day(i); this._minWeekdaysParse[i] = this.weekdaysMin( mom, '' ).toLocaleLowerCase(); this._shortWeekdaysParse[i] = this.weekdaysShort( mom, '' ).toLocaleLowerCase(); this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); } } if (strict) { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } } else { if (format === 'dddd') { ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else if (format === 'ddd') { ii = indexOf.call(this._shortWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._minWeekdaysParse, llc); return ii !== -1 ? ii : null; } else { ii = indexOf.call(this._minWeekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._weekdaysParse, llc); if (ii !== -1) { return ii; } ii = indexOf.call(this._shortWeekdaysParse, llc); return ii !== -1 ? ii : null; } } } function localeWeekdaysParse(weekdayName, format, strict) { var i, mom, regex; if (this._weekdaysParseExact) { return handleStrictParse$1.call(this, weekdayName, format, strict); } if (!this._weekdaysParse) { this._weekdaysParse = []; this._minWeekdaysParse = []; this._shortWeekdaysParse = []; this._fullWeekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); if (strict && !this._fullWeekdaysParse[i]) { this._fullWeekdaysParse[i] = new RegExp( '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i' ); this._shortWeekdaysParse[i] = new RegExp( '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i' ); this._minWeekdaysParse[i] = new RegExp( '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i' ); } if (!this._weekdaysParse[i]) { regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if ( strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName) ) { return i; } else if ( strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName) ) { return i; } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { return i; } } } // MOMENTS function getSetDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } } function getSetLocaleDayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); } function getSetISODayOfWeek(input) { if (!this.isValid()) { return input != null ? this : NaN; } // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. if (input != null) { var weekday = parseIsoWeekday(input, this.localeData()); return this.day(this.day() % 7 ? weekday : weekday - 7); } else { return this.day() || 7; } } function weekdaysRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysStrictRegex; } else { return this._weekdaysRegex; } } else { if (!hasOwnProp(this, '_weekdaysRegex')) { this._weekdaysRegex = defaultWeekdaysRegex; } return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex; } } function weekdaysShortRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysShortStrictRegex; } else { return this._weekdaysShortRegex; } } else { if (!hasOwnProp(this, '_weekdaysShortRegex')) { this._weekdaysShortRegex = defaultWeekdaysShortRegex; } return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex; } } function weekdaysMinRegex(isStrict) { if (this._weekdaysParseExact) { if (!hasOwnProp(this, '_weekdaysRegex')) { computeWeekdaysParse.call(this); } if (isStrict) { return this._weekdaysMinStrictRegex; } else { return this._weekdaysMinRegex; } } else { if (!hasOwnProp(this, '_weekdaysMinRegex')) { this._weekdaysMinRegex = defaultWeekdaysMinRegex; } return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex; } } function computeWeekdaysParse() { function cmpLenRev(a, b) { return b.length - a.length; } var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], i, mom, minp, shortp, longp; for (i = 0; i < 7; i++) { // make the regex if we don't have it already mom = createUTC([2000, 1]).day(i); minp = regexEscape(this.weekdaysMin(mom, '')); shortp = regexEscape(this.weekdaysShort(mom, '')); longp = regexEscape(this.weekdays(mom, '')); minPieces.push(minp); shortPieces.push(shortp); longPieces.push(longp); mixedPieces.push(minp); mixedPieces.push(shortp); mixedPieces.push(longp); } // Sorting makes sure if one weekday (or abbr) is a prefix of another it // will match the longer piece. minPieces.sort(cmpLenRev); shortPieces.sort(cmpLenRev); longPieces.sort(cmpLenRev); mixedPieces.sort(cmpLenRev); this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._weekdaysShortRegex = this._weekdaysRegex; this._weekdaysMinRegex = this._weekdaysRegex; this._weekdaysStrictRegex = new RegExp( '^(' + longPieces.join('|') + ')', 'i' ); this._weekdaysShortStrictRegex = new RegExp( '^(' + shortPieces.join('|') + ')', 'i' ); this._weekdaysMinStrictRegex = new RegExp( '^(' + minPieces.join('|') + ')', 'i' ); } // FORMATTING function hFormat() { return this.hours() % 12 || 12; } function kFormat() { return this.hours() || 24; } addFormatToken('H', ['HH', 2], 0, 'hour'); addFormatToken('h', ['hh', 2], 0, hFormat); addFormatToken('k', ['kk', 2], 0, kFormat); addFormatToken('hmm', 0, 0, function () { return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); }); addFormatToken('hmmss', 0, 0, function () { return ( '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); addFormatToken('Hmm', 0, 0, function () { return '' + this.hours() + zeroFill(this.minutes(), 2); }); addFormatToken('Hmmss', 0, 0, function () { return ( '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2) ); }); function meridiem(token, lowercase) { addFormatToken(token, 0, 0, function () { return this.localeData().meridiem( this.hours(), this.minutes(), lowercase ); }); } meridiem('a', true); meridiem('A', false); // ALIASES addUnitAlias('hour', 'h'); // PRIORITY addUnitPriority('hour', 13); // PARSING function matchMeridiem(isStrict, locale) { return locale._meridiemParse; } addRegexToken('a', matchMeridiem); addRegexToken('A', matchMeridiem); addRegexToken('H', match1to2); addRegexToken('h', match1to2); addRegexToken('k', match1to2); addRegexToken('HH', match1to2, match2); addRegexToken('hh', match1to2, match2); addRegexToken('kk', match1to2, match2); addRegexToken('hmm', match3to4); addRegexToken('hmmss', match5to6); addRegexToken('Hmm', match3to4); addRegexToken('Hmmss', match5to6); addParseToken(['H', 'HH'], HOUR); addParseToken(['k', 'kk'], function (input, array, config) { var kInput = toInt(input); array[HOUR] = kInput === 24 ? 0 : kInput; }); addParseToken(['a', 'A'], function (input, array, config) { config._isPm = config._locale.isPM(input); config._meridiem = input; }); addParseToken(['h', 'hh'], function (input, array, config) { array[HOUR] = toInt(input); getParsingFlags(config).bigHour = true; }); addParseToken('hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); getParsingFlags(config).bigHour = true; }); addParseToken('hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); getParsingFlags(config).bigHour = true; }); addParseToken('Hmm', function (input, array, config) { var pos = input.length - 2; array[HOUR] = toInt(input.substr(0, pos)); array[MINUTE] = toInt(input.substr(pos)); }); addParseToken('Hmmss', function (input, array, config) { var pos1 = input.length - 4, pos2 = input.length - 2; array[HOUR] = toInt(input.substr(0, pos1)); array[MINUTE] = toInt(input.substr(pos1, 2)); array[SECOND] = toInt(input.substr(pos2)); }); // LOCALES function localeIsPM(input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return (input + '').toLowerCase().charAt(0) === 'p'; } var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, // Setting the hour should keep the time, because the user explicitly // specified which hour they want. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. getSetHour = makeGetSet('Hours', true); function localeMeridiem(hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } } var baseConfig = { calendar: defaultCalendar, longDateFormat: defaultLongDateFormat, invalidDate: defaultInvalidDate, ordinal: defaultOrdinal, dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, relativeTime: defaultRelativeTime, months: defaultLocaleMonths, monthsShort: defaultLocaleMonthsShort, week: defaultLocaleWeek, weekdays: defaultLocaleWeekdays, weekdaysMin: defaultLocaleWeekdaysMin, weekdaysShort: defaultLocaleWeekdaysShort, meridiemParse: defaultLocaleMeridiemParse, }; // internal storage for locale config files var locales = {}, localeFamilies = {}, globalLocale; function commonPrefix(arr1, arr2) { var i, minl = Math.min(arr1.length, arr2.length); for (i = 0; i < minl; i += 1) { if (arr1[i] !== arr2[i]) { return i; } } return minl; } function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if ( next && next.length >= j && commonPrefix(split, next) >= j - 1 ) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return globalLocale; } function loadLocale(name) { var oldLocale = null, aliasedRequire; // TODO: Find a better way to register and load all the locales in Node if ( locales[name] === undefined && 'object' !== 'undefined' && module && module.exports ) { try { oldLocale = globalLocale._abbr; aliasedRequire = commonjsRequire; aliasedRequire('./locale/' + name); getSetGlobalLocale(oldLocale); } catch (e) { // mark as not found to avoid repeating expensive file require call causing high CPU // when trying to find en-US, en_US, en-us for every format call locales[name] = null; // null means not found } } return locales[name]; } // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. function getSetGlobalLocale(key, values) { var data; if (key) { if (isUndefined(values)) { data = getLocale(key); } else { data = defineLocale(key, values); } if (data) { // moment.duration._locale = moment._locale = data; globalLocale = data; } else { if (typeof console !== 'undefined' && console.warn) { //warn user if arguments are passed but the locale could not be set console.warn( 'Locale ' + key + ' not found. Did you forget to load it?' ); } } } return globalLocale._abbr; } function defineLocale(name, config) { if (config !== null) { var locale, parentConfig = baseConfig; config.abbr = name; if (locales[name] != null) { deprecateSimple( 'defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' ); parentConfig = locales[name]._config; } else if (config.parentLocale != null) { if (locales[config.parentLocale] != null) { parentConfig = locales[config.parentLocale]._config; } else { locale = loadLocale(config.parentLocale); if (locale != null) { parentConfig = locale._config; } else { if (!localeFamilies[config.parentLocale]) { localeFamilies[config.parentLocale] = []; } localeFamilies[config.parentLocale].push({ name: name, config: config, }); return null; } } } locales[name] = new Locale(mergeConfigs(parentConfig, config)); if (localeFamilies[name]) { localeFamilies[name].forEach(function (x) { defineLocale(x.name, x.config); }); } // backwards compat for now: also set the locale // make sure we set the locale AFTER all child locales have been // created, so we won't end up with the child locale set. getSetGlobalLocale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } } function updateLocale(name, config) { if (config != null) { var locale, tmpLocale, parentConfig = baseConfig; if (locales[name] != null && locales[name].parentLocale != null) { // Update existing child locale in-place to avoid memory-leaks locales[name].set(mergeConfigs(locales[name]._config, config)); } else { // MERGE tmpLocale = loadLocale(name); if (tmpLocale != null) { parentConfig = tmpLocale._config; } config = mergeConfigs(parentConfig, config); if (tmpLocale == null) { // updateLocale is called for creating a new locale // Set abbr so it will have a name (getters return // undefined otherwise). config.abbr = name; } locale = new Locale(config); locale.parentLocale = locales[name]; locales[name] = locale; } // backwards compat for now: also set the locale getSetGlobalLocale(name); } else { // pass null for config to unupdate, useful for tests if (locales[name] != null) { if (locales[name].parentLocale != null) { locales[name] = locales[name].parentLocale; if (name === getSetGlobalLocale()) { getSetGlobalLocale(name); } } else if (locales[name] != null) { delete locales[name]; } } } return locales[name]; } // returns locale data function getLocale(key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return globalLocale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); } function listLocales() { return keys(locales); } function checkOverflow(m) { var overflow, a = m._a; if (a && getParsingFlags(m).overflow === -2) { overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1; if ( getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE) ) { overflow = DATE; } if (getParsingFlags(m)._overflowWeeks && overflow === -1) { overflow = WEEK; } if (getParsingFlags(m)._overflowWeekday && overflow === -1) { overflow = WEEKDAY; } getParsingFlags(m).overflow = overflow; } return m; } // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], ['GGGG-[W]WW', /\d{4}-W\d\d/, false], ['YYYY-DDD', /\d{4}-\d{3}/], ['YYYY-MM', /\d{4}-\d\d/, false], ['YYYYYYMMDD', /[+-]\d{10}/], ['YYYYMMDD', /\d{8}/], ['GGGG[W]WWE', /\d{4}W\d{3}/], ['GGGG[W]WW', /\d{4}W\d{2}/, false], ['YYYYDDD', /\d{7}/], ['YYYYMM', /\d{6}/, false], ['YYYY', /\d{4}/, false], ], // iso time formats and regexes isoTimes = [ ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], ['HH:mm:ss', /\d\d:\d\d:\d\d/], ['HH:mm', /\d\d:\d\d/], ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], ['HHmmss', /\d\d\d\d\d\d/], ['HHmm', /\d\d\d\d/], ['HH', /\d\d/], ], aspNetJsonRegex = /^\/?Date\((-?\d+)/i, // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, obsOffsets = { UT: 0, GMT: 0, EDT: -4 * 60, EST: -5 * 60, CDT: -5 * 60, CST: -6 * 60, MDT: -6 * 60, MST: -7 * 60, PDT: -7 * 60, PST: -8 * 60, }; // date from iso format function configFromISO(config) { var i, l, string = config._i, match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), allowTime, dateFormat, timeFormat, tzFormat; if (match) { getParsingFlags(config).iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(match[1])) { dateFormat = isoDates[i][0]; allowTime = isoDates[i][2] !== false; break; } } if (dateFormat == null) { config._isValid = false; return; } if (match[3]) { for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(match[3])) { // match[2] should be 'T' or space timeFormat = (match[2] || ' ') + isoTimes[i][0]; break; } } if (timeFormat == null) { config._isValid = false; return; } } if (!allowTime && timeFormat != null) { config._isValid = false; return; } if (match[4]) { if (tzRegex.exec(match[4])) { tzFormat = 'Z'; } else { config._isValid = false; return; } } config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); configFromStringAndFormat(config); } else { config._isValid = false; } } function extractFromRFC2822Strings( yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr ) { var result = [ untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10), ]; if (secondStr) { result.push(parseInt(secondStr, 10)); } return result; } function untruncateYear(yearStr) { var year = parseInt(yearStr, 10); if (year <= 49) { return 2000 + year; } else if (year <= 999) { return 1900 + year; } return year; } function preprocessRFC2822(s) { // Remove comments and folding whitespace and replace multiple-spaces with a single space return s .replace(/\([^)]*\)|[\n\t]/g, ' ') .replace(/(\s\s+)/g, ' ') .replace(/^\s\s*/, '') .replace(/\s\s*$/, ''); } function checkWeekday(weekdayStr, parsedInput, config) { if (weekdayStr) { // TODO: Replace the vanilla JS Date object with an independent day-of-week check. var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), weekdayActual = new Date( parsedInput[0], parsedInput[1], parsedInput[2] ).getDay(); if (weekdayProvided !== weekdayActual) { getParsingFlags(config).weekdayMismatch = true; config._isValid = false; return false; } } return true; } function calculateOffset(obsOffset, militaryOffset, numOffset) { if (obsOffset) { return obsOffsets[obsOffset]; } else if (militaryOffset) { // the only allowed military tz is Z return 0; } else { var hm = parseInt(numOffset, 10), m = hm % 100, h = (hm - m) / 100; return h * 60 + m; } } // date and time from ref 2822 format function configFromRFC2822(config) { var match = rfc2822.exec(preprocessRFC2822(config._i)), parsedArray; if (match) { parsedArray = extractFromRFC2822Strings( match[4], match[3], match[2], match[5], match[6], match[7] ); if (!checkWeekday(match[1], parsedArray, config)) { return; } config._a = parsedArray; config._tzm = calculateOffset(match[8], match[9], match[10]); config._d = createUTCDate.apply(null, config._a); config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); getParsingFlags(config).rfc2822 = true; } else { config._isValid = false; } } // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict function configFromString(config) { var matched = aspNetJsonRegex.exec(config._i); if (matched !== null) { config._d = new Date(+matched[1]); return; } configFromISO(config); if (config._isValid === false) { delete config._isValid; } else { return; } configFromRFC2822(config); if (config._isValid === false) { delete config._isValid; } else { return; } if (config._strict) { config._isValid = false; } else { // Final attempt, use Input Fallback hooks.createFromInputFallback(config); } } hooks.createFromInputFallback = deprecate( 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // Pick the first defined of two or three arguments. function defaults(a, b, c) { if (a != null) { return a; } if (b != null) { return b; } return c; } function currentDateArray(config) { // hooks is actually the exported moment object var nowValue = new Date(hooks.now()); if (config._useUTC) { return [ nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate(), ]; } return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function configFromArray(config) { var i, date, input = [], currentDate, expectedWeekday, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear != null) { yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); if ( config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0 ) { getParsingFlags(config)._overflowDayOfYear = true; } date = createUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if ( config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0 ) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? createUTCDate : createDate).apply( null, input ); expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } // check for mismatching day of week if ( config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday ) { getParsingFlags(config).weekdayMismatch = true; } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = defaults( w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year ); week = defaults(w.W, 1); weekday = defaults(w.E, 1); if (weekday < 1 || weekday > 7) { weekdayOverflow = true; } } else { dow = config._locale._week.dow; doy = config._locale._week.doy; curWeek = weekOfYear(createLocal(), dow, doy); weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); // Default to current week. week = defaults(w.w, curWeek.week); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < 0 || weekday > 6) { weekdayOverflow = true; } } else if (w.e != null) { // local weekday -- counting starts from beginning of week weekday = w.e + dow; if (w.e < 0 || w.e > 6) { weekdayOverflow = true; } } else { // default to beginning of week weekday = dow; } } if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { getParsingFlags(config)._overflowWeeks = true; } else if (weekdayOverflow != null) { getParsingFlags(config)._overflowWeekday = true; } else { temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } } // constant that refers to the ISO standard hooks.ISO_8601 = function () {}; // constant that refers to the RFC 2822 form hooks.RFC_2822 = function () {}; // date from string and format string function configFromStringAndFormat(config) { // TODO: Move this to another part of the creation flow to prevent circular deps if (config._f === hooks.ISO_8601) { configFromISO(config); return; } if (config._f === hooks.RFC_2822) { configFromRFC2822(config); return; } config._a = []; getParsingFlags(config).empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0, era; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { getParsingFlags(config).unusedInput.push(skipped); } string = string.slice( string.indexOf(parsedInput) + parsedInput.length ); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { getParsingFlags(config).empty = false; } else { getParsingFlags(config).unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { getParsingFlags(config).unusedTokens.push(token); } } // add remaining unparsed input length to the string getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { getParsingFlags(config).unusedInput.push(string); } // clear _12h flag if hour is <= 12 if ( config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0 ) { getParsingFlags(config).bigHour = undefined; } getParsingFlags(config).parsedDateParts = config._a.slice(0); getParsingFlags(config).meridiem = config._meridiem; // handle meridiem config._a[HOUR] = meridiemFixWrap( config._locale, config._a[HOUR], config._meridiem ); // handle era era = getParsingFlags(config).era; if (era !== null) { config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); } configFromArray(config); checkOverflow(config); } function meridiemFixWrap(locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // this is not supposed to happen return hour; } } // date from string and array of format strings function configFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore, validFormatFound, bestFormatIsValid = false; if (config._f.length === 0) { getParsingFlags(config).invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; validFormatFound = false; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._f = config._f[i]; configFromStringAndFormat(tempConfig); if (isValid(tempConfig)) { validFormatFound = true; } // if there is any input that was not parsed add a penalty for that format currentScore += getParsingFlags(tempConfig).charsLeftOver; //or tokens currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; getParsingFlags(tempConfig).score = currentScore; if (!bestFormatIsValid) { if ( scoreToBeat == null || currentScore < scoreToBeat || validFormatFound ) { scoreToBeat = currentScore; bestMoment = tempConfig; if (validFormatFound) { bestFormatIsValid = true; } } } else { if (currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } } extend(config, bestMoment || tempConfig); } function configFromObject(config) { if (config._d) { return; } var i = normalizeObjectUnits(config._i), dayOrDate = i.day === undefined ? i.date : i.day; config._a = map( [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) { return obj && parseInt(obj, 10); } ); configFromArray(config); } function createFromConfig(config) { var res = new Moment(checkOverflow(prepareConfig(config))); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } function prepareConfig(config) { var input = config._i, format = config._f; config._locale = config._locale || getLocale(config._l); if (input === null || (format === undefined && input === '')) { return createInvalid({ nullInput: true }); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (isMoment(input)) { return new Moment(checkOverflow(input)); } else if (isDate(input)) { config._d = input; } else if (isArray(format)) { configFromStringAndArray(config); } else if (format) { configFromStringAndFormat(config); } else { configFromInput(config); } if (!isValid(config)) { config._d = null; } return config; } function configFromInput(config) { var input = config._i; if (isUndefined(input)) { config._d = new Date(hooks.now()); } else if (isDate(input)) { config._d = new Date(input.valueOf()); } else if (typeof input === 'string') { configFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); configFromArray(config); } else if (isObject(input)) { configFromObject(config); } else if (isNumber(input)) { // from milliseconds config._d = new Date(input); } else { hooks.createFromInputFallback(config); } } function createLocalOrUTC(input, format, locale, strict, isUTC) { var c = {}; if (format === true || format === false) { strict = format; format = undefined; } if (locale === true || locale === false) { strict = locale; locale = undefined; } if ( (isObject(input) && isObjectEmpty(input)) || (isArray(input) && input.length === 0) ) { input = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c._isAMomentObject = true; c._useUTC = c._isUTC = isUTC; c._l = locale; c._i = input; c._f = format; c._strict = strict; return createFromConfig(c); } function createLocal(input, format, locale, strict) { return createLocalOrUTC(input, format, locale, strict, false); } var prototypeMin = deprecate( 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other < this ? this : other; } else { return createInvalid(); } } ), prototypeMax = deprecate( 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () { var other = createLocal.apply(null, arguments); if (this.isValid() && other.isValid()) { return other > this ? this : other; } else { return createInvalid(); } } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return createLocal(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (!moments[i].isValid() || moments[i][fn](res)) { res = moments[i]; } } return res; } // TODO: Use [].sort instead? function min() { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); } function max() { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); } var now = function () { return Date.now ? Date.now() : +new Date(); }; var ordering = [ 'year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond', ]; function isDurationValid(m) { var key, unitHasDecimal = false, i; for (key in m) { if ( hasOwnProp(m, key) && !( indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])) ) ) { return false; } } for (i = 0; i < ordering.length; ++i) { if (m[ordering[i]]) { if (unitHasDecimal) { return false; // only allow non-integers for smallest unit } if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { unitHasDecimal = true; } } } return true; } function isValid$1() { return this._isValid; } function createInvalid$1() { return createDuration(NaN); } function Duration(duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || normalizedInput.isoWeek || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; this._isValid = isDurationValid(normalizedInput); // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible to translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = getLocale(); this._bubble(); } function isDuration(obj) { return obj instanceof Duration; } function absRound(number) { if (number < 0) { return Math.round(-1 * number) * -1; } else { return Math.round(number); } } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ( (dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) ) { diffs++; } } return diffs + lengthDiff; } // FORMATTING function offset(token, separator) { addFormatToken(token, 0, 0, function () { var offset = this.utcOffset(), sign = '+'; if (offset < 0) { offset = -offset; sign = '-'; } return ( sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2) ); }); } offset('Z', ':'); offset('ZZ', ''); // PARSING addRegexToken('Z', matchShortOffset); addRegexToken('ZZ', matchShortOffset); addParseToken(['Z', 'ZZ'], function (input, array, config) { config._useUTC = true; config._tzm = offsetFromString(matchShortOffset, input); }); // HELPERS // timezone chunker // '+10:00' > ['10', '00'] // '-1530' > ['-15', '30'] var chunkOffset = /([\+\-]|\d\d)/gi; function offsetFromString(matcher, string) { var matches = (string || '').match(matcher), chunk, parts, minutes; if (matches === null) { return null; } chunk = matches[matches.length - 1] || []; parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; minutes = +(parts[1] * 60) + toInt(parts[2]); return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; } // Return a moment from input, that is local/utc/zone equivalent to model. function cloneWithOffset(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); // Use low-level api, because this fn is low-level api. res._d.setTime(res._d.valueOf() + diff); hooks.updateOffset(res, false); return res; } else { return createLocal(input).local(); } } function getDateOffset(m) { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(m._d.getTimezoneOffset()); } // HOOKS // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. hooks.updateOffset = function () {}; // MOMENTS // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. function getSetOffset(input, keepLocalTime, keepMinutes) { var offset = this._offset || 0, localAdjust; if (!this.isValid()) { return input != null ? this : NaN; } if (input != null) { if (typeof input === 'string') { input = offsetFromString(matchShortOffset, input); if (input === null) { return this; } } else if (Math.abs(input) < 16 && !keepMinutes) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = getDateOffset(this); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addSubtract( this, createDuration(input - offset, 'm'), 1, false ); } else if (!this._changeInProgress) { this._changeInProgress = true; hooks.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : getDateOffset(this); } } function getSetZone(input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } function setOffsetToUTC(keepLocalTime) { return this.utcOffset(0, keepLocalTime); } function setOffsetToLocal(keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(getDateOffset(this), 'm'); } } return this; } function setOffsetToParsedOffset() { if (this._tzm != null) { this.utcOffset(this._tzm, false, true); } else if (typeof this._i === 'string') { var tZone = offsetFromString(matchOffset, this._i); if (tZone != null) { this.utcOffset(tZone); } else { this.utcOffset(0, true); } } return this; } function hasAlignedHourOffset(input) { if (!this.isValid()) { return false; } input = input ? createLocal(input).utcOffset() : 0; return (this.utcOffset() - input) % 60 === 0; } function isDaylightSavingTime() { return ( this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() ); } function isDaylightSavingTimeShifted() { if (!isUndefined(this._isDSTShifted)) { return this._isDSTShifted; } var c = {}, other; copyConfig(c, this); c = prepareConfig(c); if (c._a) { other = c._isUTC ? createUTC(c._a) : createLocal(c._a); this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0; } else { this._isDSTShifted = false; } return this._isDSTShifted; } function isLocal() { return this.isValid() ? !this._isUTC : false; } function isUtcOffset() { return this.isValid() ? this._isUTC : false; } function isUtc() { return this.isValid() ? this._isUTC && this._offset === 0 : false; } // ASP.NET json date format regex var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere // and further modified to allow for strings containing both week and day isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; function createDuration(input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, diffRes; if (isDuration(input)) { duration = { ms: input._milliseconds, d: input._days, M: input._months, }; } else if (isNumber(input) || !isNaN(+input)) { duration = {}; if (key) { duration[key] = +input; } else { duration.milliseconds = +input; } } else if ((match = aspNetRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: 0, d: toInt(match[DATE]) * sign, h: toInt(match[HOUR]) * sign, m: toInt(match[MINUTE]) * sign, s: toInt(match[SECOND]) * sign, ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match }; } else if ((match = isoRegex.exec(input))) { sign = match[1] === '-' ? -1 : 1; duration = { y: parseIso(match[2], sign), M: parseIso(match[3], sign), w: parseIso(match[4], sign), d: parseIso(match[5], sign), h: parseIso(match[6], sign), m: parseIso(match[7], sign), s: parseIso(match[8], sign), }; } else if (duration == null) { // checks for null or undefined duration = {}; } else if ( typeof duration === 'object' && ('from' in duration || 'to' in duration) ) { diffRes = momentsDifference( createLocal(duration.from), createLocal(duration.to) ); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } if (isDuration(input) && hasOwnProp(input, '_isValid')) { ret._isValid = input._isValid; } return ret; } createDuration.fn = Duration.prototype; createDuration.invalid = createInvalid$1; function parseIso(inp, sign) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; } function positiveMomentsDifference(base, other) { var res = {}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +base.clone().add(res.months, 'M'); return res; } function momentsDifference(base, other) { var res; if (!(base.isValid() && other.isValid())) { return { milliseconds: 0, months: 0 }; } other = cloneWithOffset(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple( name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' ); tmp = val; val = period; period = tmp; } dur = createDuration(val, period); addSubtract(this, dur, direction); return this; }; } function addSubtract(mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = absRound(duration._days), months = absRound(duration._months); if (!mom.isValid()) { // No op return; } updateOffset = updateOffset == null ? true : updateOffset; if (months) { setMonth(mom, get(mom, 'Month') + months * isAdding); } if (days) { set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); } if (milliseconds) { mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); } if (updateOffset) { hooks.updateOffset(mom, days || months); } } var add = createAdder(1, 'add'), subtract = createAdder(-1, 'subtract'); function isString(input) { return typeof input === 'string' || input instanceof String; } // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined function isMomentInput(input) { return ( isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined ); } function isMomentInputObject(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function isNumberOrStringArray(input) { var arrayTest = isArray(input), dataTypeTest = false; if (arrayTest) { dataTypeTest = input.filter(function (item) { return !isNumber(item) && isString(input); }).length === 0; } return arrayTest && dataTypeTest; } function isCalendarSpec(input) { var objectTest = isObject(input) && !isObjectEmpty(input), propertyTest = false, properties = [ 'sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse', ], i, property; for (i = 0; i < properties.length; i += 1) { property = properties[i]; propertyTest = propertyTest || hasOwnProp(input, property); } return objectTest && propertyTest; } function getCalendarFormat(myMoment, now) { var diff = myMoment.diff(now, 'days', true); return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; } function calendar$1(time, formats) { // Support for single parameter, formats only overload to the calendar function if (arguments.length === 1) { if (!arguments[0]) { time = undefined; formats = undefined; } else if (isMomentInput(arguments[0])) { time = arguments[0]; formats = undefined; } else if (isCalendarSpec(arguments[0])) { formats = arguments[0]; time = undefined; } } // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're local/utc/offset or not. var now = time || createLocal(), sod = cloneWithOffset(now, this).startOf('day'), format = hooks.calendarFormat(this, sod) || 'sameElse', output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); return this.format( output || this.localeData().calendar(format, this, createLocal(now)) ); } function clone() { return new Moment(this); } function isAfter(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() > localInput.valueOf(); } else { return localInput.valueOf() < this.clone().startOf(units).valueOf(); } } function isBefore(input, units) { var localInput = isMoment(input) ? input : createLocal(input); if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() < localInput.valueOf(); } else { return this.clone().endOf(units).valueOf() < localInput.valueOf(); } } function isBetween(from, to, units, inclusivity) { var localFrom = isMoment(from) ? from : createLocal(from), localTo = isMoment(to) ? to : createLocal(to); if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { return false; } inclusivity = inclusivity || '()'; return ( (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)) ); } function isSame(input, units) { var localInput = isMoment(input) ? input : createLocal(input), inputMs; if (!(this.isValid() && localInput.isValid())) { return false; } units = normalizeUnits(units) || 'millisecond'; if (units === 'millisecond') { return this.valueOf() === localInput.valueOf(); } else { inputMs = localInput.valueOf(); return ( this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf() ); } } function isSameOrAfter(input, units) { return this.isSame(input, units) || this.isAfter(input, units); } function isSameOrBefore(input, units) { return this.isSame(input, units) || this.isBefore(input, units); } function diff(input, units, asFloat) { var that, zoneDelta, output; if (!this.isValid()) { return NaN; } that = cloneWithOffset(input, this); if (!that.isValid()) { return NaN; } zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; units = normalizeUnits(units); switch (units) { case 'year': output = monthDiff(this, that) / 12; break; case 'month': output = monthDiff(this, that); break; case 'quarter': output = monthDiff(this, that) / 3; break; case 'second': output = (this - that) / 1e3; break; // 1000 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst default: output = this - that; } return asFloat ? output : absFloor(output); } function monthDiff(a, b) { if (a.date() < b.date()) { // end-of-month calculations work correct when the start month has more // days than the end month. return -monthDiff(b, a); } // difference in months var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } //check for negative zero, return zero if negative zero return -(wholeMonthDiff + adjust) || 0; } hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; function toString() { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); } function toISOString(keepOffset) { if (!this.isValid()) { return null; } var utc = keepOffset !== true, m = utc ? this.clone().utc() : this; if (m.year() < 0 || m.year() > 9999) { return formatMoment( m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } if (isFunction(Date.prototype.toISOString)) { // native implementation is ~50x faster, use it when we can if (utc) { return this.toDate().toISOString(); } else { return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) .toISOString() .replace('Z', formatMoment(m, 'Z')); } } return formatMoment( m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' ); } /** * Return a human readable representation of a moment that can * also be evaluated to get a new moment which is the same * * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects */ function inspect() { if (!this.isValid()) { return 'moment.invalid(/* ' + this._i + ' */)'; } var func = 'moment', zone = '', prefix, year, datetime, suffix; if (!this.isLocal()) { func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; zone = 'Z'; } prefix = '[' + func + '("]'; year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; datetime = '-MM-DD[T]HH:mm:ss.SSS'; suffix = zone + '[")]'; return this.format(prefix + year + datetime + suffix); } function format(inputString) { if (!inputString) { inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; } var output = formatMoment(this, inputString); return this.localeData().postformat(output); } function from(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ to: this, from: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function fromNow(withoutSuffix) { return this.from(createLocal(), withoutSuffix); } function to(time, withoutSuffix) { if ( this.isValid() && ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) ) { return createDuration({ from: this, to: time }) .locale(this.locale()) .humanize(!withoutSuffix); } else { return this.localeData().invalidDate(); } } function toNow(withoutSuffix) { return this.to(createLocal(), withoutSuffix); } // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. function locale(key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = getLocale(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } } var lang = deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ); function localeData() { return this._locale; } var MS_PER_SECOND = 1000, MS_PER_MINUTE = 60 * MS_PER_SECOND, MS_PER_HOUR = 60 * MS_PER_MINUTE, MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; // actual modulo - handles negative numbers (for dates before 1970): function mod$1(dividend, divisor) { return ((dividend % divisor) + divisor) % divisor; } function localStartOfDate(y, m, d) { // the date constructor remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return new Date(y + 400, m, d) - MS_PER_400_YEARS; } else { return new Date(y, m, d).valueOf(); } } function utcStartOfDate(y, m, d) { // Date.UTC remaps years 0-99 to 1900-1999 if (y < 100 && y >= 0) { // preserve leap years using a full 400 year cycle, then reset return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; } else { return Date.UTC(y, m, d); } } function startOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year(), 0, 1); break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3), 1 ); break; case 'month': time = startOfDate(this.year(), this.month(), 1); break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() ); break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) ); break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date()); break; case 'hour': time = this._d.valueOf(); time -= mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ); break; case 'minute': time = this._d.valueOf(); time -= mod$1(time, MS_PER_MINUTE); break; case 'second': time = this._d.valueOf(); time -= mod$1(time, MS_PER_SECOND); break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function endOf(units) { var time, startOfDate; units = normalizeUnits(units); if (units === undefined || units === 'millisecond' || !this.isValid()) { return this; } startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; switch (units) { case 'year': time = startOfDate(this.year() + 1, 0, 1) - 1; break; case 'quarter': time = startOfDate( this.year(), this.month() - (this.month() % 3) + 3, 1 ) - 1; break; case 'month': time = startOfDate(this.year(), this.month() + 1, 1) - 1; break; case 'week': time = startOfDate( this.year(), this.month(), this.date() - this.weekday() + 7 ) - 1; break; case 'isoWeek': time = startOfDate( this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7 ) - 1; break; case 'day': case 'date': time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; break; case 'hour': time = this._d.valueOf(); time += MS_PER_HOUR - mod$1( time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR ) - 1; break; case 'minute': time = this._d.valueOf(); time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; break; case 'second': time = this._d.valueOf(); time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; break; } this._d.setTime(time); hooks.updateOffset(this, true); return this; } function valueOf() { return this._d.valueOf() - (this._offset || 0) * 60000; } function unix() { return Math.floor(this.valueOf() / 1000); } function toDate() { return new Date(this.valueOf()); } function toArray() { var m = this; return [ m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond(), ]; } function toObject() { var m = this; return { years: m.year(), months: m.month(), date: m.date(), hours: m.hours(), minutes: m.minutes(), seconds: m.seconds(), milliseconds: m.milliseconds(), }; } function toJSON() { // new Date(NaN).toJSON() === null return this.isValid() ? this.toISOString() : null; } function isValid$2() { return isValid(this); } function parsingFlags() { return extend({}, getParsingFlags(this)); } function invalidAt() { return getParsingFlags(this).overflow; } function creationData() { return { input: this._i, format: this._f, locale: this._locale, isUTC: this._isUTC, strict: this._strict, }; } addFormatToken('N', 0, 0, 'eraAbbr'); addFormatToken('NN', 0, 0, 'eraAbbr'); addFormatToken('NNN', 0, 0, 'eraAbbr'); addFormatToken('NNNN', 0, 0, 'eraName'); addFormatToken('NNNNN', 0, 0, 'eraNarrow'); addFormatToken('y', ['y', 1], 'yo', 'eraYear'); addFormatToken('y', ['yy', 2], 0, 'eraYear'); addFormatToken('y', ['yyy', 3], 0, 'eraYear'); addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); addRegexToken('N', matchEraAbbr); addRegexToken('NN', matchEraAbbr); addRegexToken('NNN', matchEraAbbr); addRegexToken('NNNN', matchEraName); addRegexToken('NNNNN', matchEraNarrow); addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function ( input, array, config, token ) { var era = config._locale.erasParse(input, token, config._strict); if (era) { getParsingFlags(config).era = era; } else { getParsingFlags(config).invalidEra = input; } }); addRegexToken('y', matchUnsigned); addRegexToken('yy', matchUnsigned); addRegexToken('yyy', matchUnsigned); addRegexToken('yyyy', matchUnsigned); addRegexToken('yo', matchEraYearOrdinal); addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); addParseToken(['yo'], function (input, array, config, token) { var match; if (config._locale._eraYearOrdinalRegex) { match = input.match(config._locale._eraYearOrdinalRegex); } if (config._locale.eraYearOrdinalParse) { array[YEAR] = config._locale.eraYearOrdinalParse(input, match); } else { array[YEAR] = parseInt(input, 10); } }); function localeEras(m, format) { var i, l, date, eras = this._eras || getLocale('en')._eras; for (i = 0, l = eras.length; i < l; ++i) { switch (typeof eras[i].since) { case 'string': // truncate time date = hooks(eras[i].since).startOf('day'); eras[i].since = date.valueOf(); break; } switch (typeof eras[i].until) { case 'undefined': eras[i].until = +Infinity; break; case 'string': // truncate time date = hooks(eras[i].until).startOf('day').valueOf(); eras[i].until = date.valueOf(); break; } } return eras; } function localeErasParse(eraName, format, strict) { var i, l, eras = this.eras(), name, abbr, narrow; eraName = eraName.toUpperCase(); for (i = 0, l = eras.length; i < l; ++i) { name = eras[i].name.toUpperCase(); abbr = eras[i].abbr.toUpperCase(); narrow = eras[i].narrow.toUpperCase(); if (strict) { switch (format) { case 'N': case 'NN': case 'NNN': if (abbr === eraName) { return eras[i]; } break; case 'NNNN': if (name === eraName) { return eras[i]; } break; case 'NNNNN': if (narrow === eraName) { return eras[i]; } break; } } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { return eras[i]; } } } function localeErasConvertYear(era, year) { var dir = era.since <= era.until ? +1 : -1; if (year === undefined) { return hooks(era.since).year(); } else { return hooks(era.since).year() + (year - era.offset) * dir; } } function getEraName() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].name; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].name; } } return ''; } function getEraNarrow() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].narrow; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].narrow; } } return ''; } function getEraAbbr() { var i, l, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { // truncate time val = this.clone().startOf('day').valueOf(); if (eras[i].since <= val && val <= eras[i].until) { return eras[i].abbr; } if (eras[i].until <= val && val <= eras[i].since) { return eras[i].abbr; } } return ''; } function getEraYear() { var i, l, dir, val, eras = this.localeData().eras(); for (i = 0, l = eras.length; i < l; ++i) { dir = eras[i].since <= eras[i].until ? +1 : -1; // truncate time val = this.clone().startOf('day').valueOf(); if ( (eras[i].since <= val && val <= eras[i].until) || (eras[i].until <= val && val <= eras[i].since) ) { return ( (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset ); } } return this.year(); } function erasNameRegex(isStrict) { if (!hasOwnProp(this, '_erasNameRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNameRegex : this._erasRegex; } function erasAbbrRegex(isStrict) { if (!hasOwnProp(this, '_erasAbbrRegex')) { computeErasParse.call(this); } return isStrict ? this._erasAbbrRegex : this._erasRegex; } function erasNarrowRegex(isStrict) { if (!hasOwnProp(this, '_erasNarrowRegex')) { computeErasParse.call(this); } return isStrict ? this._erasNarrowRegex : this._erasRegex; } function matchEraAbbr(isStrict, locale) { return locale.erasAbbrRegex(isStrict); } function matchEraName(isStrict, locale) { return locale.erasNameRegex(isStrict); } function matchEraNarrow(isStrict, locale) { return locale.erasNarrowRegex(isStrict); } function matchEraYearOrdinal(isStrict, locale) { return locale._eraYearOrdinalRegex || matchUnsigned; } function computeErasParse() { var abbrPieces = [], namePieces = [], narrowPieces = [], mixedPieces = [], i, l, eras = this.eras(); for (i = 0, l = eras.length; i < l; ++i) { namePieces.push(regexEscape(eras[i].name)); abbrPieces.push(regexEscape(eras[i].abbr)); narrowPieces.push(regexEscape(eras[i].narrow)); mixedPieces.push(regexEscape(eras[i].name)); mixedPieces.push(regexEscape(eras[i].abbr)); mixedPieces.push(regexEscape(eras[i].narrow)); } this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); this._erasNarrowRegex = new RegExp( '^(' + narrowPieces.join('|') + ')', 'i' ); } // FORMATTING addFormatToken(0, ['gg', 2], 0, function () { return this.weekYear() % 100; }); addFormatToken(0, ['GG', 2], 0, function () { return this.isoWeekYear() % 100; }); function addWeekYearFormatToken(token, getter) { addFormatToken(0, [token, token.length], 0, getter); } addWeekYearFormatToken('gggg', 'weekYear'); addWeekYearFormatToken('ggggg', 'weekYear'); addWeekYearFormatToken('GGGG', 'isoWeekYear'); addWeekYearFormatToken('GGGGG', 'isoWeekYear'); // ALIASES addUnitAlias('weekYear', 'gg'); addUnitAlias('isoWeekYear', 'GG'); // PRIORITY addUnitPriority('weekYear', 1); addUnitPriority('isoWeekYear', 1); // PARSING addRegexToken('G', matchSigned); addRegexToken('g', matchSigned); addRegexToken('GG', match1to2, match2); addRegexToken('gg', match1to2, match2); addRegexToken('GGGG', match1to4, match4); addRegexToken('gggg', match1to4, match4); addRegexToken('GGGGG', match1to6, match6); addRegexToken('ggggg', match1to6, match6); addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function ( input, week, config, token ) { week[token.substr(0, 2)] = toInt(input); }); addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { week[token] = hooks.parseTwoDigitYear(input); }); // MOMENTS function getSetWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy ); } function getSetISOWeekYear(input) { return getSetWeekYearHelper.call( this, input, this.isoWeek(), this.isoWeekday(), 1, 4 ); } function getISOWeeksInYear() { return weeksInYear(this.year(), 1, 4); } function getISOWeeksInISOWeekYear() { return weeksInYear(this.isoWeekYear(), 1, 4); } function getWeeksInYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); } function getWeeksInWeekYear() { var weekInfo = this.localeData()._week; return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); } function getSetWeekYearHelper(input, week, weekday, dow, doy) { var weeksTarget; if (input == null) { return weekOfYear(this, dow, doy).year; } else { weeksTarget = weeksInYear(input, dow, doy); if (week > weeksTarget) { week = weeksTarget; } return setWeekAll.call(this, input, week, weekday, dow, doy); } } function setWeekAll(weekYear, week, weekday, dow, doy) { var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); this.year(date.getUTCFullYear()); this.month(date.getUTCMonth()); this.date(date.getUTCDate()); return this; } // FORMATTING addFormatToken('Q', 0, 'Qo', 'quarter'); // ALIASES addUnitAlias('quarter', 'Q'); // PRIORITY addUnitPriority('quarter', 7); // PARSING addRegexToken('Q', match1); addParseToken('Q', function (input, array) { array[MONTH] = (toInt(input) - 1) * 3; }); // MOMENTS function getSetQuarter(input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + (this.month() % 3)); } // FORMATTING addFormatToken('D', ['DD', 2], 'Do', 'date'); // ALIASES addUnitAlias('date', 'D'); // PRIORITY addUnitPriority('date', 9); // PARSING addRegexToken('D', match1to2); addRegexToken('DD', match1to2, match2); addRegexToken('Do', function (isStrict, locale) { // TODO: Remove "ordinalParse" fallback in next major release. return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient; }); addParseToken(['D', 'DD'], DATE); addParseToken('Do', function (input, array) { array[DATE] = toInt(input.match(match1to2)[0]); }); // MOMENTS var getSetDayOfMonth = makeGetSet('Date', true); // FORMATTING addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); // ALIASES addUnitAlias('dayOfYear', 'DDD'); // PRIORITY addUnitPriority('dayOfYear', 4); // PARSING addRegexToken('DDD', match1to3); addRegexToken('DDDD', match3); addParseToken(['DDD', 'DDDD'], function (input, array, config) { config._dayOfYear = toInt(input); }); // HELPERS // MOMENTS function getSetDayOfYear(input) { var dayOfYear = Math.round( (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 ) + 1; return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); } // FORMATTING addFormatToken('m', ['mm', 2], 0, 'minute'); // ALIASES addUnitAlias('minute', 'm'); // PRIORITY addUnitPriority('minute', 14); // PARSING addRegexToken('m', match1to2); addRegexToken('mm', match1to2, match2); addParseToken(['m', 'mm'], MINUTE); // MOMENTS var getSetMinute = makeGetSet('Minutes', false); // FORMATTING addFormatToken('s', ['ss', 2], 0, 'second'); // ALIASES addUnitAlias('second', 's'); // PRIORITY addUnitPriority('second', 15); // PARSING addRegexToken('s', match1to2); addRegexToken('ss', match1to2, match2); addParseToken(['s', 'ss'], SECOND); // MOMENTS var getSetSecond = makeGetSet('Seconds', false); // FORMATTING addFormatToken('S', 0, 0, function () { return ~~(this.millisecond() / 100); }); addFormatToken(0, ['SS', 2], 0, function () { return ~~(this.millisecond() / 10); }); addFormatToken(0, ['SSS', 3], 0, 'millisecond'); addFormatToken(0, ['SSSS', 4], 0, function () { return this.millisecond() * 10; }); addFormatToken(0, ['SSSSS', 5], 0, function () { return this.millisecond() * 100; }); addFormatToken(0, ['SSSSSS', 6], 0, function () { return this.millisecond() * 1000; }); addFormatToken(0, ['SSSSSSS', 7], 0, function () { return this.millisecond() * 10000; }); addFormatToken(0, ['SSSSSSSS', 8], 0, function () { return this.millisecond() * 100000; }); addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { return this.millisecond() * 1000000; }); // ALIASES addUnitAlias('millisecond', 'ms'); // PRIORITY addUnitPriority('millisecond', 16); // PARSING addRegexToken('S', match1to3, match1); addRegexToken('SS', match1to3, match2); addRegexToken('SSS', match1to3, match3); var token, getSetMillisecond; for (token = 'SSSS'; token.length <= 9; token += 'S') { addRegexToken(token, matchUnsigned); } function parseMs(input, array) { array[MILLISECOND] = toInt(('0.' + input) * 1000); } for (token = 'S'; token.length <= 9; token += 'S') { addParseToken(token, parseMs); } getSetMillisecond = makeGetSet('Milliseconds', false); // FORMATTING addFormatToken('z', 0, 0, 'zoneAbbr'); addFormatToken('zz', 0, 0, 'zoneName'); // MOMENTS function getZoneAbbr() { return this._isUTC ? 'UTC' : ''; } function getZoneName() { return this._isUTC ? 'Coordinated Universal Time' : ''; } var proto = Moment.prototype; proto.add = add; proto.calendar = calendar$1; proto.clone = clone; proto.diff = diff; proto.endOf = endOf; proto.format = format; proto.from = from; proto.fromNow = fromNow; proto.to = to; proto.toNow = toNow; proto.get = stringGet; proto.invalidAt = invalidAt; proto.isAfter = isAfter; proto.isBefore = isBefore; proto.isBetween = isBetween; proto.isSame = isSame; proto.isSameOrAfter = isSameOrAfter; proto.isSameOrBefore = isSameOrBefore; proto.isValid = isValid$2; proto.lang = lang; proto.locale = locale; proto.localeData = localeData; proto.max = prototypeMax; proto.min = prototypeMin; proto.parsingFlags = parsingFlags; proto.set = stringSet; proto.startOf = startOf; proto.subtract = subtract; proto.toArray = toArray; proto.toObject = toObject; proto.toDate = toDate; proto.toISOString = toISOString; proto.inspect = inspect; if (typeof Symbol !== 'undefined' && Symbol.for != null) { proto[Symbol.for('nodejs.util.inspect.custom')] = function () { return 'Moment<' + this.format() + '>'; }; } proto.toJSON = toJSON; proto.toString = toString; proto.unix = unix; proto.valueOf = valueOf; proto.creationData = creationData; proto.eraName = getEraName; proto.eraNarrow = getEraNarrow; proto.eraAbbr = getEraAbbr; proto.eraYear = getEraYear; proto.year = getSetYear; proto.isLeapYear = getIsLeapYear; proto.weekYear = getSetWeekYear; proto.isoWeekYear = getSetISOWeekYear; proto.quarter = proto.quarters = getSetQuarter; proto.month = getSetMonth; proto.daysInMonth = getDaysInMonth; proto.week = proto.weeks = getSetWeek; proto.isoWeek = proto.isoWeeks = getSetISOWeek; proto.weeksInYear = getWeeksInYear; proto.weeksInWeekYear = getWeeksInWeekYear; proto.isoWeeksInYear = getISOWeeksInYear; proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; proto.date = getSetDayOfMonth; proto.day = proto.days = getSetDayOfWeek; proto.weekday = getSetLocaleDayOfWeek; proto.isoWeekday = getSetISODayOfWeek; proto.dayOfYear = getSetDayOfYear; proto.hour = proto.hours = getSetHour; proto.minute = proto.minutes = getSetMinute; proto.second = proto.seconds = getSetSecond; proto.millisecond = proto.milliseconds = getSetMillisecond; proto.utcOffset = getSetOffset; proto.utc = setOffsetToUTC; proto.local = setOffsetToLocal; proto.parseZone = setOffsetToParsedOffset; proto.hasAlignedHourOffset = hasAlignedHourOffset; proto.isDST = isDaylightSavingTime; proto.isLocal = isLocal; proto.isUtcOffset = isUtcOffset; proto.isUtc = isUtc; proto.isUTC = isUtc; proto.zoneAbbr = getZoneAbbr; proto.zoneName = getZoneName; proto.dates = deprecate( 'dates accessor is deprecated. Use date instead.', getSetDayOfMonth ); proto.months = deprecate( 'months accessor is deprecated. Use month instead', getSetMonth ); proto.years = deprecate( 'years accessor is deprecated. Use year instead', getSetYear ); proto.zone = deprecate( 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone ); proto.isDSTShifted = deprecate( 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted ); function createUnix(input) { return createLocal(input * 1000); } function createInZone() { return createLocal.apply(null, arguments).parseZone(); } function preParsePostFormat(string) { return string; } var proto$1 = Locale.prototype; proto$1.calendar = calendar; proto$1.longDateFormat = longDateFormat; proto$1.invalidDate = invalidDate; proto$1.ordinal = ordinal; proto$1.preparse = preParsePostFormat; proto$1.postformat = preParsePostFormat; proto$1.relativeTime = relativeTime; proto$1.pastFuture = pastFuture; proto$1.set = set; proto$1.eras = localeEras; proto$1.erasParse = localeErasParse; proto$1.erasConvertYear = localeErasConvertYear; proto$1.erasAbbrRegex = erasAbbrRegex; proto$1.erasNameRegex = erasNameRegex; proto$1.erasNarrowRegex = erasNarrowRegex; proto$1.months = localeMonths; proto$1.monthsShort = localeMonthsShort; proto$1.monthsParse = localeMonthsParse; proto$1.monthsRegex = monthsRegex; proto$1.monthsShortRegex = monthsShortRegex; proto$1.week = localeWeek; proto$1.firstDayOfYear = localeFirstDayOfYear; proto$1.firstDayOfWeek = localeFirstDayOfWeek; proto$1.weekdays = localeWeekdays; proto$1.weekdaysMin = localeWeekdaysMin; proto$1.weekdaysShort = localeWeekdaysShort; proto$1.weekdaysParse = localeWeekdaysParse; proto$1.weekdaysRegex = weekdaysRegex; proto$1.weekdaysShortRegex = weekdaysShortRegex; proto$1.weekdaysMinRegex = weekdaysMinRegex; proto$1.isPM = localeIsPM; proto$1.meridiem = localeMeridiem; function get$1(format, index, field, setter) { var locale = getLocale(), utc = createUTC().set(setter, index); return locale[field](utc, format); } function listMonthsImpl(format, index, field) { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; if (index != null) { return get$1(format, index, field, 'month'); } var i, out = []; for (i = 0; i < 12; i++) { out[i] = get$1(format, i, field, 'month'); } return out; } // () // (5) // (fmt, 5) // (fmt) // (true) // (true, 5) // (true, fmt, 5) // (true, fmt) function listWeekdaysImpl(localeSorted, format, index, field) { if (typeof localeSorted === 'boolean') { if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } else { format = localeSorted; index = format; localeSorted = false; if (isNumber(format)) { index = format; format = undefined; } format = format || ''; } var locale = getLocale(), shift = localeSorted ? locale._week.dow : 0, i, out = []; if (index != null) { return get$1(format, (index + shift) % 7, field, 'day'); } for (i = 0; i < 7; i++) { out[i] = get$1(format, (i + shift) % 7, field, 'day'); } return out; } function listMonths(format, index) { return listMonthsImpl(format, index, 'months'); } function listMonthsShort(format, index) { return listMonthsImpl(format, index, 'monthsShort'); } function listWeekdays(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); } function listWeekdaysShort(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); } function listWeekdaysMin(localeSorted, format, index) { return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); } getSetGlobalLocale('en', { eras: [ { since: '0001-01-01', until: +Infinity, offset: 1, name: 'Anno Domini', narrow: 'AD', abbr: 'AD', }, { since: '0000-12-31', until: -Infinity, offset: 1, name: 'Before Christ', narrow: 'BC', abbr: 'BC', }, ], dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (number) { var b = number % 10, output = toInt((number % 100) / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th'; return number + output; }, }); // Side effect imports hooks.lang = deprecate( 'moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale ); hooks.langData = deprecate( 'moment.langData is deprecated. Use moment.localeData instead.', getLocale ); var mathAbs = Math.abs; function abs() { var data = this._data; this._milliseconds = mathAbs(this._milliseconds); this._days = mathAbs(this._days); this._months = mathAbs(this._months); data.milliseconds = mathAbs(data.milliseconds); data.seconds = mathAbs(data.seconds); data.minutes = mathAbs(data.minutes); data.hours = mathAbs(data.hours); data.months = mathAbs(data.months); data.years = mathAbs(data.years); return this; } function addSubtract$1(duration, input, value, direction) { var other = createDuration(input, value); duration._milliseconds += direction * other._milliseconds; duration._days += direction * other._days; duration._months += direction * other._months; return duration._bubble(); } // supports only 2.0-style add(1, 's') or add(duration) function add$1(input, value) { return addSubtract$1(this, input, value, 1); } // supports only 2.0-style subtract(1, 's') or subtract(duration) function subtract$1(input, value) { return addSubtract$1(this, input, value, -1); } function absCeil(number) { if (number < 0) { return Math.floor(number); } else { return Math.ceil(number); } } function bubble() { var milliseconds = this._milliseconds, days = this._days, months = this._months, data = this._data, seconds, minutes, hours, years, monthsFromDays; // if we have a mix of positive and negative values, bubble down first // check: https://github.com/moment/moment/issues/2166 if ( !( (milliseconds >= 0 && days >= 0 && months >= 0) || (milliseconds <= 0 && days <= 0 && months <= 0) ) ) { milliseconds += absCeil(monthsToDays(months) + days) * 864e5; days = 0; months = 0; } // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absFloor(milliseconds / 1000); data.seconds = seconds % 60; minutes = absFloor(seconds / 60); data.minutes = minutes % 60; hours = absFloor(minutes / 60); data.hours = hours % 24; days += absFloor(hours / 24); // convert days to months monthsFromDays = absFloor(daysToMonths(days)); months += monthsFromDays; days -= absCeil(monthsToDays(monthsFromDays)); // 12 months -> 1 year years = absFloor(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; return this; } function daysToMonths(days) { // 400 years have 146097 days (taking into account leap year rules) // 400 years have 12 months === 4800 return (days * 4800) / 146097; } function monthsToDays(months) { // the reverse of daysToMonths return (months * 146097) / 4800; } function as(units) { if (!this.isValid()) { return NaN; } var days, months, milliseconds = this._milliseconds; units = normalizeUnits(units); if (units === 'month' || units === 'quarter' || units === 'year') { days = this._days + milliseconds / 864e5; months = this._months + daysToMonths(days); switch (units) { case 'month': return months; case 'quarter': return months / 3; case 'year': return months / 12; } } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(monthsToDays(this._months)); switch (units) { case 'week': return days / 7 + milliseconds / 6048e5; case 'day': return days + milliseconds / 864e5; case 'hour': return days * 24 + milliseconds / 36e5; case 'minute': return days * 1440 + milliseconds / 6e4; case 'second': return days * 86400 + milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 864e5) + milliseconds; default: throw new Error('Unknown unit ' + units); } } } // TODO: Use this.as('ms')? function valueOf$1() { if (!this.isValid()) { return NaN; } return ( this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6 ); } function makeAs(alias) { return function () { return this.as(alias); }; } var asMilliseconds = makeAs('ms'), asSeconds = makeAs('s'), asMinutes = makeAs('m'), asHours = makeAs('h'), asDays = makeAs('d'), asWeeks = makeAs('w'), asMonths = makeAs('M'), asQuarters = makeAs('Q'), asYears = makeAs('y'); function clone$1() { return createDuration(this); } function get$2(units) { units = normalizeUnits(units); return this.isValid() ? this[units + 's']() : NaN; } function makeGetter(name) { return function () { return this.isValid() ? this._data[name] : NaN; }; } var milliseconds = makeGetter('milliseconds'), seconds = makeGetter('seconds'), minutes = makeGetter('minutes'), hours = makeGetter('hours'), days = makeGetter('days'), months = makeGetter('months'), years = makeGetter('years'); function weeks() { return absFloor(this.days() / 7); } var round = Math.round, thresholds = { ss: 44, // a few seconds to seconds s: 45, // seconds to minute m: 45, // minutes to hour h: 22, // hours to day d: 26, // days to month/week w: null, // weeks to month M: 11, // months to year }; // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { var duration = createDuration(posNegDuration).abs(), seconds = round(duration.as('s')), minutes = round(duration.as('m')), hours = round(duration.as('h')), days = round(duration.as('d')), months = round(duration.as('M')), weeks = round(duration.as('w')), years = round(duration.as('y')), a = (seconds <= thresholds.ss && ['s', seconds]) || (seconds < thresholds.s && ['ss', seconds]) || (minutes <= 1 && ['m']) || (minutes < thresholds.m && ['mm', minutes]) || (hours <= 1 && ['h']) || (hours < thresholds.h && ['hh', hours]) || (days <= 1 && ['d']) || (days < thresholds.d && ['dd', days]); if (thresholds.w != null) { a = a || (weeks <= 1 && ['w']) || (weeks < thresholds.w && ['ww', weeks]); } a = a || (months <= 1 && ['M']) || (months < thresholds.M && ['MM', months]) || (years <= 1 && ['y']) || ['yy', years]; a[2] = withoutSuffix; a[3] = +posNegDuration > 0; a[4] = locale; return substituteTimeAgo.apply(null, a); } // This function allows you to set the rounding function for relative time strings function getSetRelativeTimeRounding(roundingFunction) { if (roundingFunction === undefined) { return round; } if (typeof roundingFunction === 'function') { round = roundingFunction; return true; } return false; } // This function allows you to set a threshold for relative time strings function getSetRelativeTimeThreshold(threshold, limit) { if (thresholds[threshold] === undefined) { return false; } if (limit === undefined) { return thresholds[threshold]; } thresholds[threshold] = limit; if (threshold === 's') { thresholds.ss = limit - 1; } return true; } function humanize(argWithSuffix, argThresholds) { if (!this.isValid()) { return this.localeData().invalidDate(); } var withSuffix = false, th = thresholds, locale, output; if (typeof argWithSuffix === 'object') { argThresholds = argWithSuffix; argWithSuffix = false; } if (typeof argWithSuffix === 'boolean') { withSuffix = argWithSuffix; } if (typeof argThresholds === 'object') { th = Object.assign({}, thresholds, argThresholds); if (argThresholds.s != null && argThresholds.ss == null) { th.ss = argThresholds.s - 1; } } locale = this.localeData(); output = relativeTime$1(this, !withSuffix, th, locale); if (withSuffix) { output = locale.pastFuture(+this, output); } return locale.postformat(output); } var abs$1 = Math.abs; function sign(x) { return (x > 0) - (x < 0) || +x; } function toISOString$1() { // for ISO strings we do not use the normal bubbling rules: // * milliseconds bubble up until they become hours // * days do not bubble at all // * months bubble up until they become years // This is because there is no context-free conversion between hours and days // (think of clock changes) // and also not between days and months (28-31 days per month) if (!this.isValid()) { return this.localeData().invalidDate(); } var seconds = abs$1(this._milliseconds) / 1000, days = abs$1(this._days), months = abs$1(this._months), minutes, hours, years, s, total = this.asSeconds(), totalSign, ymSign, daysSign, hmsSign; if (!total) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } // 3600 seconds -> 60 minutes -> 1 hour minutes = absFloor(seconds / 60); hours = absFloor(minutes / 60); seconds %= 60; minutes %= 60; // 12 months -> 1 year years = absFloor(months / 12); months %= 12; // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; totalSign = total < 0 ? '-' : ''; ymSign = sign(this._months) !== sign(total) ? '-' : ''; daysSign = sign(this._days) !== sign(total) ? '-' : ''; hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; return ( totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '') ); } var proto$2 = Duration.prototype; proto$2.isValid = isValid$1; proto$2.abs = abs; proto$2.add = add$1; proto$2.subtract = subtract$1; proto$2.as = as; proto$2.asMilliseconds = asMilliseconds; proto$2.asSeconds = asSeconds; proto$2.asMinutes = asMinutes; proto$2.asHours = asHours; proto$2.asDays = asDays; proto$2.asWeeks = asWeeks; proto$2.asMonths = asMonths; proto$2.asQuarters = asQuarters; proto$2.asYears = asYears; proto$2.valueOf = valueOf$1; proto$2._bubble = bubble; proto$2.clone = clone$1; proto$2.get = get$2; proto$2.milliseconds = milliseconds; proto$2.seconds = seconds; proto$2.minutes = minutes; proto$2.hours = hours; proto$2.days = days; proto$2.weeks = weeks; proto$2.months = months; proto$2.years = years; proto$2.humanize = humanize; proto$2.toISOString = toISOString$1; proto$2.toString = toISOString$1; proto$2.toJSON = toISOString$1; proto$2.locale = locale; proto$2.localeData = localeData; proto$2.toIsoString = deprecate( 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1 ); proto$2.lang = lang; // FORMATTING addFormatToken('X', 0, 0, 'unix'); addFormatToken('x', 0, 0, 'valueOf'); // PARSING addRegexToken('x', matchSigned); addRegexToken('X', matchTimestamp); addParseToken('X', function (input, array, config) { config._d = new Date(parseFloat(input) * 1000); }); addParseToken('x', function (input, array, config) { config._d = new Date(toInt(input)); }); //! moment.js hooks.version = '2.29.1'; setHookCallback(createLocal); hooks.fn = proto; hooks.min = min; hooks.max = max; hooks.now = now; hooks.utc = createUTC; hooks.unix = createUnix; hooks.months = listMonths; hooks.isDate = isDate; hooks.locale = getSetGlobalLocale; hooks.invalid = createInvalid; hooks.duration = createDuration; hooks.isMoment = isMoment; hooks.weekdays = listWeekdays; hooks.parseZone = createInZone; hooks.localeData = getLocale; hooks.isDuration = isDuration; hooks.monthsShort = listMonthsShort; hooks.weekdaysMin = listWeekdaysMin; hooks.defineLocale = defineLocale; hooks.updateLocale = updateLocale; hooks.locales = listLocales; hooks.weekdaysShort = listWeekdaysShort; hooks.normalizeUnits = normalizeUnits; hooks.relativeTimeRounding = getSetRelativeTimeRounding; hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; hooks.calendarFormat = getCalendarFormat; hooks.prototype = proto; // currently HTML5 input type only supports 24-hour formats hooks.HTML5_FMT = { DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> DATE: 'YYYY-MM-DD', // <input type="date" /> TIME: 'HH:mm', // <input type="time" /> TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> WEEK: 'GGGG-[W]WW', // <input type="week" /> MONTH: 'YYYY-MM', // <input type="month" /> }; return hooks; }))); }); var componentEmitter = createCommonjsModule(function (module) { /** * Expose `Emitter`. */ { module.exports = Emitter; } /** * Initialize a new `Emitter`. * * @api public */ function Emitter(obj) { if (obj) return mixin(obj); } /** * Mixin the emitter properties. * * @param {Object} obj * @return {Object} * @api private */ function mixin(obj) { for (var key in Emitter.prototype) { obj[key] = Emitter.prototype[key]; } return obj; } /** * Listen on the given `event` with `fn`. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.on = Emitter.prototype.addEventListener = function(event, fn){ this._callbacks = this._callbacks || {}; (this._callbacks['$' + event] = this._callbacks['$' + event] || []) .push(fn); return this; }; /** * Adds an `event` listener that will be invoked a single * time then automatically removed. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.once = function(event, fn){ function on() { this.off(event, on); fn.apply(this, arguments); } on.fn = fn; this.on(event, on); return this; }; /** * Remove the given callback for `event` or all * registered callbacks. * * @param {String} event * @param {Function} fn * @return {Emitter} * @api public */ Emitter.prototype.off = Emitter.prototype.removeListener = Emitter.prototype.removeAllListeners = Emitter.prototype.removeEventListener = function(event, fn){ this._callbacks = this._callbacks || {}; // all if (0 == arguments.length) { this._callbacks = {}; return this; } // specific event var callbacks = this._callbacks['$' + event]; if (!callbacks) return this; // remove all handlers if (1 == arguments.length) { delete this._callbacks['$' + event]; return this; } // remove specific handler var cb; for (var i = 0; i < callbacks.length; i++) { cb = callbacks[i]; if (cb === fn || cb.fn === fn) { callbacks.splice(i, 1); break; } } // Remove event specific arrays for event types that no // one is subscribed for to avoid memory leak. if (callbacks.length === 0) { delete this._callbacks['$' + event]; } return this; }; /** * Emit `event` with the given args. * * @param {String} event * @param {Mixed} ... * @return {Emitter} */ Emitter.prototype.emit = function(event){ this._callbacks = this._callbacks || {}; var args = new Array(arguments.length - 1) , callbacks = this._callbacks['$' + event]; for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } if (callbacks) { callbacks = callbacks.slice(0); for (var i = 0, len = callbacks.length; i < len; ++i) { callbacks[i].apply(this, args); } } return this; }; /** * Return array of callbacks for `event`. * * @param {String} event * @return {Array} * @api public */ Emitter.prototype.listeners = function(event){ this._callbacks = this._callbacks || {}; return this._callbacks['$' + event] || []; }; /** * Check if this emitter has `event` handlers. * * @param {String} event * @return {Boolean} * @api public */ Emitter.prototype.hasListeners = function(event){ return !! this.listeners(event).length; }; }); /*! Hammer.JS - v2.0.17-rc - 2019-12-16 * http://naver.github.io/egjs * * Forked By Naver egjs * Copyright (c) hammerjs * Licensed under the MIT license */ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } /** * @private * extend object. * means that properties in dest will be overwritten by the ones in src. * @param {Object} target * @param {...Object} objects_to_assign * @returns {Object} target */ var assign; if (typeof Object.assign !== 'function') { assign = function assign(target) { if (target === undefined || target === null) { throw new TypeError('Cannot convert undefined or null to object'); } var output = Object(target); for (var index = 1; index < arguments.length; index++) { var source = arguments[index]; if (source !== undefined && source !== null) { for (var nextKey in source) { if (source.hasOwnProperty(nextKey)) { output[nextKey] = source[nextKey]; } } } } return output; }; } else { assign = Object.assign; } var assign$1 = assign; var VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o']; var TEST_ELEMENT = typeof document === "undefined" ? { style: {} } : document.createElement('div'); var TYPE_FUNCTION = 'function'; var round = Math.round, abs = Math.abs; var now = Date.now; /** * @private * get the prefixed property * @param {Object} obj * @param {String} property * @returns {String|Undefined} prefixed */ function prefixed(obj, property) { var prefix; var prop; var camelProp = property[0].toUpperCase() + property.slice(1); var i = 0; while (i < VENDOR_PREFIXES.length) { prefix = VENDOR_PREFIXES[i]; prop = prefix ? prefix + camelProp : property; if (prop in obj) { return prop; } i++; } return undefined; } /* eslint-disable no-new-func, no-nested-ternary */ var win; if (typeof window === "undefined") { // window is undefined in node.js win = {}; } else { win = window; } var PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction'); var NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined; function getTouchActionProps() { if (!NATIVE_TOUCH_ACTION) { return false; } var touchMap = {}; var cssSupports = win.CSS && win.CSS.supports; ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function (val) { // If css.supports is not supported but there is native touch-action assume it supports // all values. This is the case for IE 10 and 11. return touchMap[val] = cssSupports ? win.CSS.supports('touch-action', val) : true; }); return touchMap; } var TOUCH_ACTION_COMPUTE = 'compute'; var TOUCH_ACTION_AUTO = 'auto'; var TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented var TOUCH_ACTION_NONE = 'none'; var TOUCH_ACTION_PAN_X = 'pan-x'; var TOUCH_ACTION_PAN_Y = 'pan-y'; var TOUCH_ACTION_MAP = getTouchActionProps(); var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i; var SUPPORT_TOUCH = 'ontouchstart' in win; var SUPPORT_POINTER_EVENTS = prefixed(win, 'PointerEvent') !== undefined; var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); var INPUT_TYPE_TOUCH = 'touch'; var INPUT_TYPE_PEN = 'pen'; var INPUT_TYPE_MOUSE = 'mouse'; var INPUT_TYPE_KINECT = 'kinect'; var COMPUTE_INTERVAL = 25; var INPUT_START = 1; var INPUT_MOVE = 2; var INPUT_END = 4; var INPUT_CANCEL = 8; var DIRECTION_NONE = 1; var DIRECTION_LEFT = 2; var DIRECTION_RIGHT = 4; var DIRECTION_UP = 8; var DIRECTION_DOWN = 16; var DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT; var DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN; var DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL; var PROPS_XY = ['x', 'y']; var PROPS_CLIENT_XY = ['clientX', 'clientY']; /** * @private * walk objects and arrays * @param {Object} obj * @param {Function} iterator * @param {Object} context */ function each(obj, iterator, context) { var i; if (!obj) { return; } if (obj.forEach) { obj.forEach(iterator, context); } else if (obj.length !== undefined) { i = 0; while (i < obj.length) { iterator.call(context, obj[i], i, obj); i++; } } else { for (i in obj) { obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj); } } } /** * @private * let a boolean value also be a function that must return a boolean * this first item in args will be used as the context * @param {Boolean|Function} val * @param {Array} [args] * @returns {Boolean} */ function boolOrFn(val, args) { if (typeof val === TYPE_FUNCTION) { return val.apply(args ? args[0] || undefined : undefined, args); } return val; } /** * @private * small indexOf wrapper * @param {String} str * @param {String} find * @returns {Boolean} found */ function inStr(str, find) { return str.indexOf(find) > -1; } /** * @private * when the touchActions are collected they are not a valid value, so we need to clean things up. * * @param {String} actions * @returns {*} */ function cleanTouchActions(actions) { // none if (inStr(actions, TOUCH_ACTION_NONE)) { return TOUCH_ACTION_NONE; } var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X); var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y); // if both pan-x and pan-y are set (different recognizers // for different directions, e.g. horizontal pan but vertical swipe?) // we need none (as otherwise with pan-x pan-y combined none of these // recognizers will work, since the browser would handle all panning if (hasPanX && hasPanY) { return TOUCH_ACTION_NONE; } // pan-x OR pan-y if (hasPanX || hasPanY) { return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y; } // manipulation if (inStr(actions, TOUCH_ACTION_MANIPULATION)) { return TOUCH_ACTION_MANIPULATION; } return TOUCH_ACTION_AUTO; } /** * @private * Touch Action * sets the touchAction property or uses the js alternative * @param {Manager} manager * @param {String} value * @constructor */ var TouchAction = /*#__PURE__*/ function () { function TouchAction(manager, value) { this.manager = manager; this.set(value); } /** * @private * set the touchAction value on the element or enable the polyfill * @param {String} value */ var _proto = TouchAction.prototype; _proto.set = function set(value) { // find out the touch-action by the event handlers if (value === TOUCH_ACTION_COMPUTE) { value = this.compute(); } if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) { this.manager.element.style[PREFIXED_TOUCH_ACTION] = value; } this.actions = value.toLowerCase().trim(); }; /** * @private * just re-set the touchAction value */ _proto.update = function update() { this.set(this.manager.options.touchAction); }; /** * @private * compute the value for the touchAction property based on the recognizer's settings * @returns {String} value */ _proto.compute = function compute() { var actions = []; each(this.manager.recognizers, function (recognizer) { if (boolOrFn(recognizer.options.enable, [recognizer])) { actions = actions.concat(recognizer.getTouchAction()); } }); return cleanTouchActions(actions.join(' ')); }; /** * @private * this method is called on each input cycle and provides the preventing of the browser behavior * @param {Object} input */ _proto.preventDefaults = function preventDefaults(input) { var srcEvent = input.srcEvent; var direction = input.offsetDirection; // if the touch action did prevented once this session if (this.manager.session.prevented) { srcEvent.preventDefault(); return; } var actions = this.actions; var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE]; var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y]; var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X]; if (hasNone) { // do not prevent defaults if this is a tap gesture var isTapPointer = input.pointers.length === 1; var isTapMovement = input.distance < 2; var isTapTouchTime = input.deltaTime < 250; if (isTapPointer && isTapMovement && isTapTouchTime) { return; } } if (hasPanX && hasPanY) { // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent return; } if (hasNone || hasPanY && direction & DIRECTION_HORIZONTAL || hasPanX && direction & DIRECTION_VERTICAL) { return this.preventSrc(srcEvent); } }; /** * @private * call preventDefault to prevent the browser's default behavior (scrolling in most cases) * @param {Object} srcEvent */ _proto.preventSrc = function preventSrc(srcEvent) { this.manager.session.prevented = true; srcEvent.preventDefault(); }; return TouchAction; }(); /** * @private * find if a node is in the given parent * @method hasParent * @param {HTMLElement} node * @param {HTMLElement} parent * @return {Boolean} found */ function hasParent(node, parent) { while (node) { if (node === parent) { return true; } node = node.parentNode; } return false; } /** * @private * get the center of all the pointers * @param {Array} pointers * @return {Object} center contains `x` and `y` properties */ function getCenter(pointers) { var pointersLength = pointers.length; // no need to loop when only one touch if (pointersLength === 1) { return { x: round(pointers[0].clientX), y: round(pointers[0].clientY) }; } var x = 0; var y = 0; var i = 0; while (i < pointersLength) { x += pointers[i].clientX; y += pointers[i].clientY; i++; } return { x: round(x / pointersLength), y: round(y / pointersLength) }; } /** * @private * create a simple clone from the input used for storage of firstInput and firstMultiple * @param {Object} input * @returns {Object} clonedInputData */ function simpleCloneInputData(input) { // make a simple copy of the pointers because we will get a reference if we don't // we only need clientXY for the calculations var pointers = []; var i = 0; while (i < input.pointers.length) { pointers[i] = { clientX: round(input.pointers[i].clientX), clientY: round(input.pointers[i].clientY) }; i++; } return { timeStamp: now(), pointers: pointers, center: getCenter(pointers), deltaX: input.deltaX, deltaY: input.deltaY }; } /** * @private * calculate the absolute distance between two points * @param {Object} p1 {x, y} * @param {Object} p2 {x, y} * @param {Array} [props] containing x and y keys * @return {Number} distance */ function getDistance(p1, p2, props) { if (!props) { props = PROPS_XY; } var x = p2[props[0]] - p1[props[0]]; var y = p2[props[1]] - p1[props[1]]; return Math.sqrt(x * x + y * y); } /** * @private * calculate the angle between two coordinates * @param {Object} p1 * @param {Object} p2 * @param {Array} [props] containing x and y keys * @return {Number} angle */ function getAngle(p1, p2, props) { if (!props) { props = PROPS_XY; } var x = p2[props[0]] - p1[props[0]]; var y = p2[props[1]] - p1[props[1]]; return Math.atan2(y, x) * 180 / Math.PI; } /** * @private * get the direction between two points * @param {Number} x * @param {Number} y * @return {Number} direction */ function getDirection(x, y) { if (x === y) { return DIRECTION_NONE; } if (abs(x) >= abs(y)) { return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; } return y < 0 ? DIRECTION_UP : DIRECTION_DOWN; } function computeDeltaXY(session, input) { var center = input.center; // let { offsetDelta:offset = {}, prevDelta = {}, prevInput = {} } = session; // jscs throwing error on defalut destructured values and without defaults tests fail var offset = session.offsetDelta || {}; var prevDelta = session.prevDelta || {}; var prevInput = session.prevInput || {}; if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) { prevDelta = session.prevDelta = { x: prevInput.deltaX || 0, y: prevInput.deltaY || 0 }; offset = session.offsetDelta = { x: center.x, y: center.y }; } input.deltaX = prevDelta.x + (center.x - offset.x); input.deltaY = prevDelta.y + (center.y - offset.y); } /** * @private * calculate the velocity between two points. unit is in px per ms. * @param {Number} deltaTime * @param {Number} x * @param {Number} y * @return {Object} velocity `x` and `y` */ function getVelocity(deltaTime, x, y) { return { x: x / deltaTime || 0, y: y / deltaTime || 0 }; } /** * @private * calculate the scale factor between two pointersets * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out * @param {Array} start array of pointers * @param {Array} end array of pointers * @return {Number} scale */ function getScale(start, end) { return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY); } /** * @private * calculate the rotation degrees between two pointersets * @param {Array} start array of pointers * @param {Array} end array of pointers * @return {Number} rotation */ function getRotation(start, end) { return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY); } /** * @private * velocity is calculated every x ms * @param {Object} session * @param {Object} input */ function computeIntervalInputData(session, input) { var last = session.lastInterval || input; var deltaTime = input.timeStamp - last.timeStamp; var velocity; var velocityX; var velocityY; var direction; if (input.eventType !== INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) { var deltaX = input.deltaX - last.deltaX; var deltaY = input.deltaY - last.deltaY; var v = getVelocity(deltaTime, deltaX, deltaY); velocityX = v.x; velocityY = v.y; velocity = abs(v.x) > abs(v.y) ? v.x : v.y; direction = getDirection(deltaX, deltaY); session.lastInterval = input; } else { // use latest velocity info if it doesn't overtake a minimum period velocity = last.velocity; velocityX = last.velocityX; velocityY = last.velocityY; direction = last.direction; } input.velocity = velocity; input.velocityX = velocityX; input.velocityY = velocityY; input.direction = direction; } /** * @private * extend the data with some usable properties like scale, rotate, velocity etc * @param {Object} manager * @param {Object} input */ function computeInputData(manager, input) { var session = manager.session; var pointers = input.pointers; var pointersLength = pointers.length; // store the first input to calculate the distance and direction if (!session.firstInput) { session.firstInput = simpleCloneInputData(input); } // to compute scale and rotation we need to store the multiple touches if (pointersLength > 1 && !session.firstMultiple) { session.firstMultiple = simpleCloneInputData(input); } else if (pointersLength === 1) { session.firstMultiple = false; } var firstInput = session.firstInput, firstMultiple = session.firstMultiple; var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center; var center = input.center = getCenter(pointers); input.timeStamp = now(); input.deltaTime = input.timeStamp - firstInput.timeStamp; input.angle = getAngle(offsetCenter, center); input.distance = getDistance(offsetCenter, center); computeDeltaXY(session, input); input.offsetDirection = getDirection(input.deltaX, input.deltaY); var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY); input.overallVelocityX = overallVelocity.x; input.overallVelocityY = overallVelocity.y; input.overallVelocity = abs(overallVelocity.x) > abs(overallVelocity.y) ? overallVelocity.x : overallVelocity.y; input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1; input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0; input.maxPointers = !session.prevInput ? input.pointers.length : input.pointers.length > session.prevInput.maxPointers ? input.pointers.length : session.prevInput.maxPointers; computeIntervalInputData(session, input); // find the correct target var target = manager.element; var srcEvent = input.srcEvent; var srcEventTarget; if (srcEvent.composedPath) { srcEventTarget = srcEvent.composedPath()[0]; } else if (srcEvent.path) { srcEventTarget = srcEvent.path[0]; } else { srcEventTarget = srcEvent.target; } if (hasParent(srcEventTarget, target)) { target = srcEventTarget; } input.target = target; } /** * @private * handle input events * @param {Manager} manager * @param {String} eventType * @param {Object} input */ function inputHandler(manager, eventType, input) { var pointersLen = input.pointers.length; var changedPointersLen = input.changedPointers.length; var isFirst = eventType & INPUT_START && pointersLen - changedPointersLen === 0; var isFinal = eventType & (INPUT_END | INPUT_CANCEL) && pointersLen - changedPointersLen === 0; input.isFirst = !!isFirst; input.isFinal = !!isFinal; if (isFirst) { manager.session = {}; } // source event is the normalized value of the domEvents // like 'touchstart, mouseup, pointerdown' input.eventType = eventType; // compute scale, rotation etc computeInputData(manager, input); // emit secret event manager.emit('hammer.input', input); manager.recognize(input); manager.session.prevInput = input; } /** * @private * split string on whitespace * @param {String} str * @returns {Array} words */ function splitStr(str) { return str.trim().split(/\s+/g); } /** * @private * addEventListener with multiple events at once * @param {EventTarget} target * @param {String} types * @param {Function} handler */ function addEventListeners(target, types, handler) { each(splitStr(types), function (type) { target.addEventListener(type, handler, false); }); } /** * @private * removeEventListener with multiple events at once * @param {EventTarget} target * @param {String} types * @param {Function} handler */ function removeEventListeners(target, types, handler) { each(splitStr(types), function (type) { target.removeEventListener(type, handler, false); }); } /** * @private * get the window object of an element * @param {HTMLElement} element * @returns {DocumentView|Window} */ function getWindowForElement(element) { var doc = element.ownerDocument || element; return doc.defaultView || doc.parentWindow || window; } /** * @private * create new input type manager * @param {Manager} manager * @param {Function} callback * @returns {Input} * @constructor */ var Input = /*#__PURE__*/ function () { function Input(manager, callback) { var self = this; this.manager = manager; this.callback = callback; this.element = manager.element; this.target = manager.options.inputTarget; // smaller wrapper around the handler, for the scope and the enabled state of the manager, // so when disabled the input events are completely bypassed. this.domHandler = function (ev) { if (boolOrFn(manager.options.enable, [manager])) { self.handler(ev); } }; this.init(); } /** * @private * should handle the inputEvent data and trigger the callback * @virtual */ var _proto = Input.prototype; _proto.handler = function handler() {}; /** * @private * bind the events */ _proto.init = function init() { this.evEl && addEventListeners(this.element, this.evEl, this.domHandler); this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler); this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); }; /** * @private * unbind the events */ _proto.destroy = function destroy() { this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler); this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler); this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler); }; return Input; }(); /** * @private * find if a array contains the object using indexOf or a simple polyFill * @param {Array} src * @param {String} find * @param {String} [findByKey] * @return {Boolean|Number} false when not found, or the index */ function inArray(src, find, findByKey) { if (src.indexOf && !findByKey) { return src.indexOf(find); } else { var i = 0; while (i < src.length) { if (findByKey && src[i][findByKey] == find || !findByKey && src[i] === find) { // do not use === here, test fails return i; } i++; } return -1; } } var POINTER_INPUT_MAP = { pointerdown: INPUT_START, pointermove: INPUT_MOVE, pointerup: INPUT_END, pointercancel: INPUT_CANCEL, pointerout: INPUT_CANCEL }; // in IE10 the pointer types is defined as an enum var IE10_POINTER_TYPE_ENUM = { 2: INPUT_TYPE_TOUCH, 3: INPUT_TYPE_PEN, 4: INPUT_TYPE_MOUSE, 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816 }; var POINTER_ELEMENT_EVENTS = 'pointerdown'; var POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel'; // IE10 has prefixed support, and case-sensitive if (win.MSPointerEvent && !win.PointerEvent) { POINTER_ELEMENT_EVENTS = 'MSPointerDown'; POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel'; } /** * @private * Pointer events input * @constructor * @extends Input */ var PointerEventInput = /*#__PURE__*/ function (_Input) { _inheritsLoose(PointerEventInput, _Input); function PointerEventInput() { var _this; var proto = PointerEventInput.prototype; proto.evEl = POINTER_ELEMENT_EVENTS; proto.evWin = POINTER_WINDOW_EVENTS; _this = _Input.apply(this, arguments) || this; _this.store = _this.manager.session.pointerEvents = []; return _this; } /** * @private * handle mouse events * @param {Object} ev */ var _proto = PointerEventInput.prototype; _proto.handler = function handler(ev) { var store = this.store; var removePointer = false; var eventTypeNormalized = ev.type.toLowerCase().replace('ms', ''); var eventType = POINTER_INPUT_MAP[eventTypeNormalized]; var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType; var isTouch = pointerType === INPUT_TYPE_TOUCH; // get index of the event in the store var storeIndex = inArray(store, ev.pointerId, 'pointerId'); // start and mouse must be down if (eventType & INPUT_START && (ev.button === 0 || isTouch)) { if (storeIndex < 0) { store.push(ev); storeIndex = store.length - 1; } } else if (eventType & (INPUT_END | INPUT_CANCEL)) { removePointer = true; } // it not found, so the pointer hasn't been down (so it's probably a hover) if (storeIndex < 0) { return; } // update the event in the store store[storeIndex] = ev; this.callback(this.manager, eventType, { pointers: store, changedPointers: [ev], pointerType: pointerType, srcEvent: ev }); if (removePointer) { // remove from the store store.splice(storeIndex, 1); } }; return PointerEventInput; }(Input); /** * @private * convert array-like objects to real arrays * @param {Object} obj * @returns {Array} */ function toArray(obj) { return Array.prototype.slice.call(obj, 0); } /** * @private * unique array with objects based on a key (like 'id') or just by the array's value * @param {Array} src [{id:1},{id:2},{id:1}] * @param {String} [key] * @param {Boolean} [sort=False] * @returns {Array} [{id:1},{id:2}] */ function uniqueArray(src, key, sort) { var results = []; var values = []; var i = 0; while (i < src.length) { var val = key ? src[i][key] : src[i]; if (inArray(values, val) < 0) { results.push(src[i]); } values[i] = val; i++; } if (sort) { if (!key) { results = results.sort(); } else { results = results.sort(function (a, b) { return a[key] > b[key]; }); } } return results; } var TOUCH_INPUT_MAP = { touchstart: INPUT_START, touchmove: INPUT_MOVE, touchend: INPUT_END, touchcancel: INPUT_CANCEL }; var TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel'; /** * @private * Multi-user touch events input * @constructor * @extends Input */ var TouchInput = /*#__PURE__*/ function (_Input) { _inheritsLoose(TouchInput, _Input); function TouchInput() { var _this; TouchInput.prototype.evTarget = TOUCH_TARGET_EVENTS; _this = _Input.apply(this, arguments) || this; _this.targetIds = {}; // this.evTarget = TOUCH_TARGET_EVENTS; return _this; } var _proto = TouchInput.prototype; _proto.handler = function handler(ev) { var type = TOUCH_INPUT_MAP[ev.type]; var touches = getTouches.call(this, ev, type); if (!touches) { return; } this.callback(this.manager, type, { pointers: touches[0], changedPointers: touches[1], pointerType: INPUT_TYPE_TOUCH, srcEvent: ev }); }; return TouchInput; }(Input); function getTouches(ev, type) { var allTouches = toArray(ev.touches); var targetIds = this.targetIds; // when there is only one touch, the process can be simplified if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) { targetIds[allTouches[0].identifier] = true; return [allTouches, allTouches]; } var i; var targetTouches; var changedTouches = toArray(ev.changedTouches); var changedTargetTouches = []; var target = this.target; // get target touches from touches targetTouches = allTouches.filter(function (touch) { return hasParent(touch.target, target); }); // collect touches if (type === INPUT_START) { i = 0; while (i < targetTouches.length) { targetIds[targetTouches[i].identifier] = true; i++; } } // filter changed touches to only contain touches that exist in the collected target ids i = 0; while (i < changedTouches.length) { if (targetIds[changedTouches[i].identifier]) { changedTargetTouches.push(changedTouches[i]); } // cleanup removed touches if (type & (INPUT_END | INPUT_CANCEL)) { delete targetIds[changedTouches[i].identifier]; } i++; } if (!changedTargetTouches.length) { return; } return [// merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel' uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true), changedTargetTouches]; } var MOUSE_INPUT_MAP = { mousedown: INPUT_START, mousemove: INPUT_MOVE, mouseup: INPUT_END }; var MOUSE_ELEMENT_EVENTS = 'mousedown'; var MOUSE_WINDOW_EVENTS = 'mousemove mouseup'; /** * @private * Mouse events input * @constructor * @extends Input */ var MouseInput = /*#__PURE__*/ function (_Input) { _inheritsLoose(MouseInput, _Input); function MouseInput() { var _this; var proto = MouseInput.prototype; proto.evEl = MOUSE_ELEMENT_EVENTS; proto.evWin = MOUSE_WINDOW_EVENTS; _this = _Input.apply(this, arguments) || this; _this.pressed = false; // mousedown state return _this; } /** * @private * handle mouse events * @param {Object} ev */ var _proto = MouseInput.prototype; _proto.handler = function handler(ev) { var eventType = MOUSE_INPUT_MAP[ev.type]; // on start we want to have the left mouse button down if (eventType & INPUT_START && ev.button === 0) { this.pressed = true; } if (eventType & INPUT_MOVE && ev.which !== 1) { eventType = INPUT_END; } // mouse must be down if (!this.pressed) { return; } if (eventType & INPUT_END) { this.pressed = false; } this.callback(this.manager, eventType, { pointers: [ev], changedPointers: [ev], pointerType: INPUT_TYPE_MOUSE, srcEvent: ev }); }; return MouseInput; }(Input); /** * @private * Combined touch and mouse input * * Touch has a higher priority then mouse, and while touching no mouse events are allowed. * This because touch devices also emit mouse events while doing a touch. * * @constructor * @extends Input */ var DEDUP_TIMEOUT = 2500; var DEDUP_DISTANCE = 25; function setLastTouch(eventData) { var _eventData$changedPoi = eventData.changedPointers, touch = _eventData$changedPoi[0]; if (touch.identifier === this.primaryTouch) { var lastTouch = { x: touch.clientX, y: touch.clientY }; var lts = this.lastTouches; this.lastTouches.push(lastTouch); var removeLastTouch = function removeLastTouch() { var i = lts.indexOf(lastTouch); if (i > -1) { lts.splice(i, 1); } }; setTimeout(removeLastTouch, DEDUP_TIMEOUT); } } function recordTouches(eventType, eventData) { if (eventType & INPUT_START) { this.primaryTouch = eventData.changedPointers[0].identifier; setLastTouch.call(this, eventData); } else if (eventType & (INPUT_END | INPUT_CANCEL)) { setLastTouch.call(this, eventData); } } function isSyntheticEvent(eventData) { var x = eventData.srcEvent.clientX; var y = eventData.srcEvent.clientY; for (var i = 0; i < this.lastTouches.length; i++) { var t = this.lastTouches[i]; var dx = Math.abs(x - t.x); var dy = Math.abs(y - t.y); if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) { return true; } } return false; } var TouchMouseInput = /*#__PURE__*/ function () { var TouchMouseInput = /*#__PURE__*/ function (_Input) { _inheritsLoose(TouchMouseInput, _Input); function TouchMouseInput(_manager, callback) { var _this; _this = _Input.call(this, _manager, callback) || this; _this.handler = function (manager, inputEvent, inputData) { var isTouch = inputData.pointerType === INPUT_TYPE_TOUCH; var isMouse = inputData.pointerType === INPUT_TYPE_MOUSE; if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) { return; } // when we're in a touch event, record touches to de-dupe synthetic mouse event if (isTouch) { recordTouches.call(_assertThisInitialized(_assertThisInitialized(_this)), inputEvent, inputData); } else if (isMouse && isSyntheticEvent.call(_assertThisInitialized(_assertThisInitialized(_this)), inputData)) { return; } _this.callback(manager, inputEvent, inputData); }; _this.touch = new TouchInput(_this.manager, _this.handler); _this.mouse = new MouseInput(_this.manager, _this.handler); _this.primaryTouch = null; _this.lastTouches = []; return _this; } /** * @private * handle mouse and touch events * @param {Hammer} manager * @param {String} inputEvent * @param {Object} inputData */ var _proto = TouchMouseInput.prototype; /** * @private * remove the event listeners */ _proto.destroy = function destroy() { this.touch.destroy(); this.mouse.destroy(); }; return TouchMouseInput; }(Input); return TouchMouseInput; }(); /** * @private * create new input type manager * called by the Manager constructor * @param {Hammer} manager * @returns {Input} */ function createInputInstance(manager) { var Type; // let inputClass = manager.options.inputClass; var inputClass = manager.options.inputClass; if (inputClass) { Type = inputClass; } else if (SUPPORT_POINTER_EVENTS) { Type = PointerEventInput; } else if (SUPPORT_ONLY_TOUCH) { Type = TouchInput; } else if (!SUPPORT_TOUCH) { Type = MouseInput; } else { Type = TouchMouseInput; } return new Type(manager, inputHandler); } /** * @private * if the argument is an array, we want to execute the fn on each entry * if it aint an array we don't want to do a thing. * this is used by all the methods that accept a single and array argument. * @param {*|Array} arg * @param {String} fn * @param {Object} [context] * @returns {Boolean} */ function invokeArrayArg(arg, fn, context) { if (Array.isArray(arg)) { each(arg, context[fn], context); return true; } return false; } var STATE_POSSIBLE = 1; var STATE_BEGAN = 2; var STATE_CHANGED = 4; var STATE_ENDED = 8; var STATE_RECOGNIZED = STATE_ENDED; var STATE_CANCELLED = 16; var STATE_FAILED = 32; /** * @private * get a unique id * @returns {number} uniqueId */ var _uniqueId = 1; function uniqueId() { return _uniqueId++; } /** * @private * get a recognizer by name if it is bound to a manager * @param {Recognizer|String} otherRecognizer * @param {Recognizer} recognizer * @returns {Recognizer} */ function getRecognizerByNameIfManager(otherRecognizer, recognizer) { var manager = recognizer.manager; if (manager) { return manager.get(otherRecognizer); } return otherRecognizer; } /** * @private * get a usable string, used as event postfix * @param {constant} state * @returns {String} state */ function stateStr(state) { if (state & STATE_CANCELLED) { return 'cancel'; } else if (state & STATE_ENDED) { return 'end'; } else if (state & STATE_CHANGED) { return 'move'; } else if (state & STATE_BEGAN) { return 'start'; } return ''; } /** * @private * Recognizer flow explained; * * All recognizers have the initial state of POSSIBLE when a input session starts. * The definition of a input session is from the first input until the last input, with all it's movement in it. * * Example session for mouse-input: mousedown -> mousemove -> mouseup * * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed * which determines with state it should be. * * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to * POSSIBLE to give it another change on the next cycle. * * Possible * | * +-----+---------------+ * | | * +-----+-----+ | * | | | * Failed Cancelled | * +-------+------+ * | | * Recognized Began * | * Changed * | * Ended/Recognized */ /** * @private * Recognizer * Every recognizer needs to extend from this class. * @constructor * @param {Object} options */ var Recognizer = /*#__PURE__*/ function () { function Recognizer(options) { if (options === void 0) { options = {}; } this.options = _extends({ enable: true }, options); this.id = uniqueId(); this.manager = null; // default is enable true this.state = STATE_POSSIBLE; this.simultaneous = {}; this.requireFail = []; } /** * @private * set options * @param {Object} options * @return {Recognizer} */ var _proto = Recognizer.prototype; _proto.set = function set(options) { assign$1(this.options, options); // also update the touchAction, in case something changed about the directions/enabled state this.manager && this.manager.touchAction.update(); return this; }; /** * @private * recognize simultaneous with an other recognizer. * @param {Recognizer} otherRecognizer * @returns {Recognizer} this */ _proto.recognizeWith = function recognizeWith(otherRecognizer) { if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) { return this; } var simultaneous = this.simultaneous; otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); if (!simultaneous[otherRecognizer.id]) { simultaneous[otherRecognizer.id] = otherRecognizer; otherRecognizer.recognizeWith(this); } return this; }; /** * @private * drop the simultaneous link. it doesnt remove the link on the other recognizer. * @param {Recognizer} otherRecognizer * @returns {Recognizer} this */ _proto.dropRecognizeWith = function dropRecognizeWith(otherRecognizer) { if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) { return this; } otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); delete this.simultaneous[otherRecognizer.id]; return this; }; /** * @private * recognizer can only run when an other is failing * @param {Recognizer} otherRecognizer * @returns {Recognizer} this */ _proto.requireFailure = function requireFailure(otherRecognizer) { if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) { return this; } var requireFail = this.requireFail; otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); if (inArray(requireFail, otherRecognizer) === -1) { requireFail.push(otherRecognizer); otherRecognizer.requireFailure(this); } return this; }; /** * @private * drop the requireFailure link. it does not remove the link on the other recognizer. * @param {Recognizer} otherRecognizer * @returns {Recognizer} this */ _proto.dropRequireFailure = function dropRequireFailure(otherRecognizer) { if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) { return this; } otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this); var index = inArray(this.requireFail, otherRecognizer); if (index > -1) { this.requireFail.splice(index, 1); } return this; }; /** * @private * has require failures boolean * @returns {boolean} */ _proto.hasRequireFailures = function hasRequireFailures() { return this.requireFail.length > 0; }; /** * @private * if the recognizer can recognize simultaneous with an other recognizer * @param {Recognizer} otherRecognizer * @returns {Boolean} */ _proto.canRecognizeWith = function canRecognizeWith(otherRecognizer) { return !!this.simultaneous[otherRecognizer.id]; }; /** * @private * You should use `tryEmit` instead of `emit` directly to check * that all the needed recognizers has failed before emitting. * @param {Object} input */ _proto.emit = function emit(input) { var self = this; var state = this.state; function emit(event) { self.manager.emit(event, input); } // 'panstart' and 'panmove' if (state < STATE_ENDED) { emit(self.options.event + stateStr(state)); } emit(self.options.event); // simple 'eventName' events if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...) emit(input.additionalEvent); } // panend and pancancel if (state >= STATE_ENDED) { emit(self.options.event + stateStr(state)); } }; /** * @private * Check that all the require failure recognizers has failed, * if true, it emits a gesture event, * otherwise, setup the state to FAILED. * @param {Object} input */ _proto.tryEmit = function tryEmit(input) { if (this.canEmit()) { return this.emit(input); } // it's failing anyway this.state = STATE_FAILED; }; /** * @private * can we emit? * @returns {boolean} */ _proto.canEmit = function canEmit() { var i = 0; while (i < this.requireFail.length) { if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) { return false; } i++; } return true; }; /** * @private * update the recognizer * @param {Object} inputData */ _proto.recognize = function recognize(inputData) { // make a new copy of the inputData // so we can change the inputData without messing up the other recognizers var inputDataClone = assign$1({}, inputData); // is is enabled and allow recognizing? if (!boolOrFn(this.options.enable, [this, inputDataClone])) { this.reset(); this.state = STATE_FAILED; return; } // reset when we've reached the end if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) { this.state = STATE_POSSIBLE; } this.state = this.process(inputDataClone); // the recognizer has recognized a gesture // so trigger an event if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) { this.tryEmit(inputDataClone); } }; /** * @private * return the state of the recognizer * the actual recognizing happens in this method * @virtual * @param {Object} inputData * @returns {constant} STATE */ /* jshint ignore:start */ _proto.process = function process(inputData) {}; /* jshint ignore:end */ /** * @private * return the preferred touch-action * @virtual * @returns {Array} */ _proto.getTouchAction = function getTouchAction() {}; /** * @private * called when the gesture isn't allowed to recognize * like when another is being recognized or it is disabled * @virtual */ _proto.reset = function reset() {}; return Recognizer; }(); /** * @private * A tap is recognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur * between the given interval and position. The delay option can be used to recognize multi-taps without firing * a single tap. * * The eventData from the emitted event contains the property `tapCount`, which contains the amount of * multi-taps being recognized. * @constructor * @extends Recognizer */ var TapRecognizer = /*#__PURE__*/ function (_Recognizer) { _inheritsLoose(TapRecognizer, _Recognizer); function TapRecognizer(options) { var _this; if (options === void 0) { options = {}; } _this = _Recognizer.call(this, _extends({ event: 'tap', pointers: 1, taps: 1, interval: 300, // max time between the multi-tap taps time: 250, // max time of the pointer to be down (like finger on the screen) threshold: 9, // a minimal movement is ok, but keep it low posThreshold: 10 }, options)) || this; // previous time and center, // used for tap counting _this.pTime = false; _this.pCenter = false; _this._timer = null; _this._input = null; _this.count = 0; return _this; } var _proto = TapRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { return [TOUCH_ACTION_MANIPULATION]; }; _proto.process = function process(input) { var _this2 = this; var options = this.options; var validPointers = input.pointers.length === options.pointers; var validMovement = input.distance < options.threshold; var validTouchTime = input.deltaTime < options.time; this.reset(); if (input.eventType & INPUT_START && this.count === 0) { return this.failTimeout(); } // we only allow little movement // and we've reached an end event, so a tap is possible if (validMovement && validTouchTime && validPointers) { if (input.eventType !== INPUT_END) { return this.failTimeout(); } var validInterval = this.pTime ? input.timeStamp - this.pTime < options.interval : true; var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold; this.pTime = input.timeStamp; this.pCenter = input.center; if (!validMultiTap || !validInterval) { this.count = 1; } else { this.count += 1; } this._input = input; // if tap count matches we have recognized it, // else it has began recognizing... var tapCount = this.count % options.taps; if (tapCount === 0) { // no failing requirements, immediately trigger the tap event // or wait as long as the multitap interval to trigger if (!this.hasRequireFailures()) { return STATE_RECOGNIZED; } else { this._timer = setTimeout(function () { _this2.state = STATE_RECOGNIZED; _this2.tryEmit(); }, options.interval); return STATE_BEGAN; } } } return STATE_FAILED; }; _proto.failTimeout = function failTimeout() { var _this3 = this; this._timer = setTimeout(function () { _this3.state = STATE_FAILED; }, this.options.interval); return STATE_FAILED; }; _proto.reset = function reset() { clearTimeout(this._timer); }; _proto.emit = function emit() { if (this.state === STATE_RECOGNIZED) { this._input.tapCount = this.count; this.manager.emit(this.options.event, this._input); } }; return TapRecognizer; }(Recognizer); /** * @private * This recognizer is just used as a base for the simple attribute recognizers. * @constructor * @extends Recognizer */ var AttrRecognizer = /*#__PURE__*/ function (_Recognizer) { _inheritsLoose(AttrRecognizer, _Recognizer); function AttrRecognizer(options) { if (options === void 0) { options = {}; } return _Recognizer.call(this, _extends({ pointers: 1 }, options)) || this; } /** * @private * Used to check if it the recognizer receives valid input, like input.distance > 10. * @memberof AttrRecognizer * @param {Object} input * @returns {Boolean} recognized */ var _proto = AttrRecognizer.prototype; _proto.attrTest = function attrTest(input) { var optionPointers = this.options.pointers; return optionPointers === 0 || input.pointers.length === optionPointers; }; /** * @private * Process the input and return the state for the recognizer * @memberof AttrRecognizer * @param {Object} input * @returns {*} State */ _proto.process = function process(input) { var state = this.state; var eventType = input.eventType; var isRecognized = state & (STATE_BEGAN | STATE_CHANGED); var isValid = this.attrTest(input); // on cancel input and we've recognized before, return STATE_CANCELLED if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) { return state | STATE_CANCELLED; } else if (isRecognized || isValid) { if (eventType & INPUT_END) { return state | STATE_ENDED; } else if (!(state & STATE_BEGAN)) { return STATE_BEGAN; } return state | STATE_CHANGED; } return STATE_FAILED; }; return AttrRecognizer; }(Recognizer); /** * @private * direction cons to string * @param {constant} direction * @returns {String} */ function directionStr(direction) { if (direction === DIRECTION_DOWN) { return 'down'; } else if (direction === DIRECTION_UP) { return 'up'; } else if (direction === DIRECTION_LEFT) { return 'left'; } else if (direction === DIRECTION_RIGHT) { return 'right'; } return ''; } /** * @private * Pan * Recognized when the pointer is down and moved in the allowed direction. * @constructor * @extends AttrRecognizer */ var PanRecognizer = /*#__PURE__*/ function (_AttrRecognizer) { _inheritsLoose(PanRecognizer, _AttrRecognizer); function PanRecognizer(options) { var _this; if (options === void 0) { options = {}; } _this = _AttrRecognizer.call(this, _extends({ event: 'pan', threshold: 10, pointers: 1, direction: DIRECTION_ALL }, options)) || this; _this.pX = null; _this.pY = null; return _this; } var _proto = PanRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { var direction = this.options.direction; var actions = []; if (direction & DIRECTION_HORIZONTAL) { actions.push(TOUCH_ACTION_PAN_Y); } if (direction & DIRECTION_VERTICAL) { actions.push(TOUCH_ACTION_PAN_X); } return actions; }; _proto.directionTest = function directionTest(input) { var options = this.options; var hasMoved = true; var distance = input.distance; var direction = input.direction; var x = input.deltaX; var y = input.deltaY; // lock to axis? if (!(direction & options.direction)) { if (options.direction & DIRECTION_HORIZONTAL) { direction = x === 0 ? DIRECTION_NONE : x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT; hasMoved = x !== this.pX; distance = Math.abs(input.deltaX); } else { direction = y === 0 ? DIRECTION_NONE : y < 0 ? DIRECTION_UP : DIRECTION_DOWN; hasMoved = y !== this.pY; distance = Math.abs(input.deltaY); } } input.direction = direction; return hasMoved && distance > options.threshold && direction & options.direction; }; _proto.attrTest = function attrTest(input) { return AttrRecognizer.prototype.attrTest.call(this, input) && ( // replace with a super call this.state & STATE_BEGAN || !(this.state & STATE_BEGAN) && this.directionTest(input)); }; _proto.emit = function emit(input) { this.pX = input.deltaX; this.pY = input.deltaY; var direction = directionStr(input.direction); if (direction) { input.additionalEvent = this.options.event + direction; } _AttrRecognizer.prototype.emit.call(this, input); }; return PanRecognizer; }(AttrRecognizer); /** * @private * Swipe * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction. * @constructor * @extends AttrRecognizer */ var SwipeRecognizer = /*#__PURE__*/ function (_AttrRecognizer) { _inheritsLoose(SwipeRecognizer, _AttrRecognizer); function SwipeRecognizer(options) { if (options === void 0) { options = {}; } return _AttrRecognizer.call(this, _extends({ event: 'swipe', threshold: 10, velocity: 0.3, direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL, pointers: 1 }, options)) || this; } var _proto = SwipeRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { return PanRecognizer.prototype.getTouchAction.call(this); }; _proto.attrTest = function attrTest(input) { var direction = this.options.direction; var velocity; if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) { velocity = input.overallVelocity; } else if (direction & DIRECTION_HORIZONTAL) { velocity = input.overallVelocityX; } else if (direction & DIRECTION_VERTICAL) { velocity = input.overallVelocityY; } return _AttrRecognizer.prototype.attrTest.call(this, input) && direction & input.offsetDirection && input.distance > this.options.threshold && input.maxPointers === this.options.pointers && abs(velocity) > this.options.velocity && input.eventType & INPUT_END; }; _proto.emit = function emit(input) { var direction = directionStr(input.offsetDirection); if (direction) { this.manager.emit(this.options.event + direction, input); } this.manager.emit(this.options.event, input); }; return SwipeRecognizer; }(AttrRecognizer); /** * @private * Pinch * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out). * @constructor * @extends AttrRecognizer */ var PinchRecognizer = /*#__PURE__*/ function (_AttrRecognizer) { _inheritsLoose(PinchRecognizer, _AttrRecognizer); function PinchRecognizer(options) { if (options === void 0) { options = {}; } return _AttrRecognizer.call(this, _extends({ event: 'pinch', threshold: 0, pointers: 2 }, options)) || this; } var _proto = PinchRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { return [TOUCH_ACTION_NONE]; }; _proto.attrTest = function attrTest(input) { return _AttrRecognizer.prototype.attrTest.call(this, input) && (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN); }; _proto.emit = function emit(input) { if (input.scale !== 1) { var inOut = input.scale < 1 ? 'in' : 'out'; input.additionalEvent = this.options.event + inOut; } _AttrRecognizer.prototype.emit.call(this, input); }; return PinchRecognizer; }(AttrRecognizer); /** * @private * Rotate * Recognized when two or more pointer are moving in a circular motion. * @constructor * @extends AttrRecognizer */ var RotateRecognizer = /*#__PURE__*/ function (_AttrRecognizer) { _inheritsLoose(RotateRecognizer, _AttrRecognizer); function RotateRecognizer(options) { if (options === void 0) { options = {}; } return _AttrRecognizer.call(this, _extends({ event: 'rotate', threshold: 0, pointers: 2 }, options)) || this; } var _proto = RotateRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { return [TOUCH_ACTION_NONE]; }; _proto.attrTest = function attrTest(input) { return _AttrRecognizer.prototype.attrTest.call(this, input) && (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN); }; return RotateRecognizer; }(AttrRecognizer); /** * @private * Press * Recognized when the pointer is down for x ms without any movement. * @constructor * @extends Recognizer */ var PressRecognizer = /*#__PURE__*/ function (_Recognizer) { _inheritsLoose(PressRecognizer, _Recognizer); function PressRecognizer(options) { var _this; if (options === void 0) { options = {}; } _this = _Recognizer.call(this, _extends({ event: 'press', pointers: 1, time: 251, // minimal time of the pointer to be pressed threshold: 9 }, options)) || this; _this._timer = null; _this._input = null; return _this; } var _proto = PressRecognizer.prototype; _proto.getTouchAction = function getTouchAction() { return [TOUCH_ACTION_AUTO]; }; _proto.process = function process(input) { var _this2 = this; var options = this.options; var validPointers = input.pointers.length === options.pointers; var validMovement = input.distance < options.threshold; var validTime = input.deltaTime > options.time; this._input = input; // we only allow little movement // and we've reached an end event, so a tap is possible if (!validMovement || !validPointers || input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime) { this.reset(); } else if (input.eventType & INPUT_START) { this.reset(); this._timer = setTimeout(function () { _this2.state = STATE_RECOGNIZED; _this2.tryEmit(); }, options.time); } else if (input.eventType & INPUT_END) { return STATE_RECOGNIZED; } return STATE_FAILED; }; _proto.reset = function reset() { clearTimeout(this._timer); }; _proto.emit = function emit(input) { if (this.state !== STATE_RECOGNIZED) { return; } if (input && input.eventType & INPUT_END) { this.manager.emit(this.options.event + "up", input); } else { this._input.timeStamp = now(); this.manager.emit(this.options.event, this._input); } }; return PressRecognizer; }(Recognizer); var defaults = { /** * @private * set if DOM events are being triggered. * But this is slower and unused by simple implementations, so disabled by default. * @type {Boolean} * @default false */ domEvents: false, /** * @private * The value for the touchAction property/fallback. * When set to `compute` it will magically set the correct value based on the added recognizers. * @type {String} * @default compute */ touchAction: TOUCH_ACTION_COMPUTE, /** * @private * @type {Boolean} * @default true */ enable: true, /** * @private * EXPERIMENTAL FEATURE -- can be removed/changed * Change the parent input target element. * If Null, then it is being set the to main element. * @type {Null|EventTarget} * @default null */ inputTarget: null, /** * @private * force an input class * @type {Null|Function} * @default null */ inputClass: null, /** * @private * Some CSS properties can be used to improve the working of Hammer. * Add them to this method and they will be set when creating a new Manager. * @namespace */ cssProps: { /** * @private * Disables text selection to improve the dragging gesture. Mainly for desktop browsers. * @type {String} * @default 'none' */ userSelect: "none", /** * @private * Disable the Windows Phone grippers when pressing an element. * @type {String} * @default 'none' */ touchSelect: "none", /** * @private * Disables the default callout shown when you touch and hold a touch target. * On iOS, when you touch and hold a touch target such as a link, Safari displays * a callout containing information about the link. This property allows you to disable that callout. * @type {String} * @default 'none' */ touchCallout: "none", /** * @private * Specifies whether zooming is enabled. Used by IE10> * @type {String} * @default 'none' */ contentZooming: "none", /** * @private * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers. * @type {String} * @default 'none' */ userDrag: "none", /** * @private * Overrides the highlight color shown when the user taps a link or a JavaScript * clickable element in iOS. This property obeys the alpha value, if specified. * @type {String} * @default 'rgba(0,0,0,0)' */ tapHighlightColor: "rgba(0,0,0,0)" } }; /** * @private * Default recognizer setup when calling `Hammer()` * When creating a new Manager these will be skipped. * This is separated with other defaults because of tree-shaking. * @type {Array} */ var preset = [[RotateRecognizer, { enable: false }], [PinchRecognizer, { enable: false }, ['rotate']], [SwipeRecognizer, { direction: DIRECTION_HORIZONTAL }], [PanRecognizer, { direction: DIRECTION_HORIZONTAL }, ['swipe']], [TapRecognizer], [TapRecognizer, { event: 'doubletap', taps: 2 }, ['tap']], [PressRecognizer]]; var STOP = 1; var FORCED_STOP = 2; /** * @private * add/remove the css properties as defined in manager.options.cssProps * @param {Manager} manager * @param {Boolean} add */ function toggleCssProps(manager, add) { var element = manager.element; if (!element.style) { return; } var prop; each(manager.options.cssProps, function (value, name) { prop = prefixed(element.style, name); if (add) { manager.oldCssProps[prop] = element.style[prop]; element.style[prop] = value; } else { element.style[prop] = manager.oldCssProps[prop] || ""; } }); if (!add) { manager.oldCssProps = {}; } } /** * @private * trigger dom event * @param {String} event * @param {Object} data */ function triggerDomEvent(event, data) { var gestureEvent = document.createEvent("Event"); gestureEvent.initEvent(event, true, true); gestureEvent.gesture = data; data.target.dispatchEvent(gestureEvent); } /** * @private * Manager * @param {HTMLElement} element * @param {Object} [options] * @constructor */ var Manager = /*#__PURE__*/ function () { function Manager(element, options) { var _this = this; this.options = assign$1({}, defaults, options || {}); this.options.inputTarget = this.options.inputTarget || element; this.handlers = {}; this.session = {}; this.recognizers = []; this.oldCssProps = {}; this.element = element; this.input = createInputInstance(this); this.touchAction = new TouchAction(this, this.options.touchAction); toggleCssProps(this, true); each(this.options.recognizers, function (item) { var recognizer = _this.add(new item[0](item[1])); item[2] && recognizer.recognizeWith(item[2]); item[3] && recognizer.requireFailure(item[3]); }, this); } /** * @private * set options * @param {Object} options * @returns {Manager} */ var _proto = Manager.prototype; _proto.set = function set(options) { assign$1(this.options, options); // Options that need a little more setup if (options.touchAction) { this.touchAction.update(); } if (options.inputTarget) { // Clean up existing event listeners and reinitialize this.input.destroy(); this.input.target = options.inputTarget; this.input.init(); } return this; }; /** * @private * stop recognizing for this session. * This session will be discarded, when a new [input]start event is fired. * When forced, the recognizer cycle is stopped immediately. * @param {Boolean} [force] */ _proto.stop = function stop(force) { this.session.stopped = force ? FORCED_STOP : STOP; }; /** * @private * run the recognizers! * called by the inputHandler function on every movement of the pointers (touches) * it walks through all the recognizers and tries to detect the gesture that is being made * @param {Object} inputData */ _proto.recognize = function recognize(inputData) { var session = this.session; if (session.stopped) { return; } // run the touch-action polyfill this.touchAction.preventDefaults(inputData); var recognizer; var recognizers = this.recognizers; // this holds the recognizer that is being recognized. // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED // if no recognizer is detecting a thing, it is set to `null` var curRecognizer = session.curRecognizer; // reset when the last recognizer is recognized // or when we're in a new session if (!curRecognizer || curRecognizer && curRecognizer.state & STATE_RECOGNIZED) { session.curRecognizer = null; curRecognizer = null; } var i = 0; while (i < recognizers.length) { recognizer = recognizers[i]; // find out if we are allowed try to recognize the input for this one. // 1. allow if the session is NOT forced stopped (see the .stop() method) // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one // that is being recognized. // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer. // this can be setup with the `recognizeWith()` method on the recognizer. if (session.stopped !== FORCED_STOP && ( // 1 !curRecognizer || recognizer === curRecognizer || // 2 recognizer.canRecognizeWith(curRecognizer))) { // 3 recognizer.recognize(inputData); } else { recognizer.reset(); } // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the // current active recognizer. but only if we don't already have an active recognizer if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) { session.curRecognizer = recognizer; curRecognizer = recognizer; } i++; } }; /** * @private * get a recognizer by its event name. * @param {Recognizer|String} recognizer * @returns {Recognizer|Null} */ _proto.get = function get(recognizer) { if (recognizer instanceof Recognizer) { return recognizer; } var recognizers = this.recognizers; for (var i = 0; i < recognizers.length; i++) { if (recognizers[i].options.event === recognizer) { return recognizers[i]; } } return null; }; /** * @private add a recognizer to the manager * existing recognizers with the same event name will be removed * @param {Recognizer} recognizer * @returns {Recognizer|Manager} */ _proto.add = function add(recognizer) { if (invokeArrayArg(recognizer, "add", this)) { return this; } // remove existing var existing = this.get(recognizer.options.event); if (existing) { this.remove(existing); } this.recognizers.push(recognizer); recognizer.manager = this; this.touchAction.update(); return recognizer; }; /** * @private * remove a recognizer by name or instance * @param {Recognizer|String} recognizer * @returns {Manager} */ _proto.remove = function remove(recognizer) { if (invokeArrayArg(recognizer, "remove", this)) { return this; } var targetRecognizer = this.get(recognizer); // let's make sure this recognizer exists if (recognizer) { var recognizers = this.recognizers; var index = inArray(recognizers, targetRecognizer); if (index !== -1) { recognizers.splice(index, 1); this.touchAction.update(); } } return this; }; /** * @private * bind event * @param {String} events * @param {Function} handler * @returns {EventEmitter} this */ _proto.on = function on(events, handler) { if (events === undefined || handler === undefined) { return this; } var handlers = this.handlers; each(splitStr(events), function (event) { handlers[event] = handlers[event] || []; handlers[event].push(handler); }); return this; }; /** * @private unbind event, leave emit blank to remove all handlers * @param {String} events * @param {Function} [handler] * @returns {EventEmitter} this */ _proto.off = function off(events, handler) { if (events === undefined) { return this; } var handlers = this.handlers; each(splitStr(events), function (event) { if (!handler) { delete handlers[event]; } else { handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1); } }); return this; }; /** * @private emit event to the listeners * @param {String} event * @param {Object} data */ _proto.emit = function emit(event, data) { // we also want to trigger dom events if (this.options.domEvents) { triggerDomEvent(event, data); } // no handlers, so skip it all var handlers = this.handlers[event] && this.handlers[event].slice(); if (!handlers || !handlers.length) { return; } data.type = event; data.preventDefault = function () { data.srcEvent.preventDefault(); }; var i = 0; while (i < handlers.length) { handlers[i](data); i++; } }; /** * @private * destroy the manager and unbinds all events * it doesn't unbind dom events, that is the user own responsibility */ _proto.destroy = function destroy() { this.element && toggleCssProps(this, false); this.handlers = {}; this.session = {}; this.input.destroy(); this.element = null; }; return Manager; }(); var SINGLE_TOUCH_INPUT_MAP = { touchstart: INPUT_START, touchmove: INPUT_MOVE, touchend: INPUT_END, touchcancel: INPUT_CANCEL }; var SINGLE_TOUCH_TARGET_EVENTS = 'touchstart'; var SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel'; /** * @private * Touch events input * @constructor * @extends Input */ var SingleTouchInput = /*#__PURE__*/ function (_Input) { _inheritsLoose(SingleTouchInput, _Input); function SingleTouchInput() { var _this; var proto = SingleTouchInput.prototype; proto.evTarget = SINGLE_TOUCH_TARGET_EVENTS; proto.evWin = SINGLE_TOUCH_WINDOW_EVENTS; _this = _Input.apply(this, arguments) || this; _this.started = false; return _this; } var _proto = SingleTouchInput.prototype; _proto.handler = function handler(ev) { var type = SINGLE_TOUCH_INPUT_MAP[ev.type]; // should we handle the touch events? if (type === INPUT_START) { this.started = true; } if (!this.started) { return; } var touches = normalizeSingleTouches.call(this, ev, type); // when done, reset the started state if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) { this.started = false; } this.callback(this.manager, type, { pointers: touches[0], changedPointers: touches[1], pointerType: INPUT_TYPE_TOUCH, srcEvent: ev }); }; return SingleTouchInput; }(Input); function normalizeSingleTouches(ev, type) { var all = toArray(ev.touches); var changed = toArray(ev.changedTouches); if (type & (INPUT_END | INPUT_CANCEL)) { all = uniqueArray(all.concat(changed), 'identifier', true); } return [all, changed]; } /** * @private * wrap a method with a deprecation warning and stack trace * @param {Function} method * @param {String} name * @param {String} message * @returns {Function} A new function wrapping the supplied method. */ function deprecate(method, name, message) { var deprecationMessage = "DEPRECATED METHOD: " + name + "\n" + message + " AT \n"; return function () { var e = new Error('get-stack-trace'); var stack = e && e.stack ? e.stack.replace(/^[^\(]+?[\n$]/gm, '').replace(/^\s+at\s+/gm, '').replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') : 'Unknown Stack Trace'; var log = window.console && (window.console.warn || window.console.log); if (log) { log.call(window.console, deprecationMessage, stack); } return method.apply(this, arguments); }; } /** * @private * extend object. * means that properties in dest will be overwritten by the ones in src. * @param {Object} dest * @param {Object} src * @param {Boolean} [merge=false] * @returns {Object} dest */ var extend = deprecate(function (dest, src, merge) { var keys = Object.keys(src); var i = 0; while (i < keys.length) { if (!merge || merge && dest[keys[i]] === undefined) { dest[keys[i]] = src[keys[i]]; } i++; } return dest; }, 'extend', 'Use `assign`.'); /** * @private * merge the values from src in the dest. * means that properties that exist in dest will not be overwritten by src * @param {Object} dest * @param {Object} src * @returns {Object} dest */ var merge = deprecate(function (dest, src) { return extend(dest, src, true); }, 'merge', 'Use `assign`.'); /** * @private * simple class inheritance * @param {Function} child * @param {Function} base * @param {Object} [properties] */ function inherit(child, base, properties) { var baseP = base.prototype; var childP; childP = child.prototype = Object.create(baseP); childP.constructor = child; childP._super = baseP; if (properties) { assign$1(childP, properties); } } /** * @private * simple function bind * @param {Function} fn * @param {Object} context * @returns {Function} */ function bindFn(fn, context) { return function boundFn() { return fn.apply(context, arguments); }; } /** * @private * Simple way to create a manager with a default set of recognizers. * @param {HTMLElement} element * @param {Object} [options] * @constructor */ var Hammer = /*#__PURE__*/ function () { var Hammer = /** * @private * @const {string} */ function Hammer(element, options) { if (options === void 0) { options = {}; } return new Manager(element, _extends({ recognizers: preset.concat() }, options)); }; Hammer.VERSION = "2.0.17-rc"; Hammer.DIRECTION_ALL = DIRECTION_ALL; Hammer.DIRECTION_DOWN = DIRECTION_DOWN; Hammer.DIRECTION_LEFT = DIRECTION_LEFT; Hammer.DIRECTION_RIGHT = DIRECTION_RIGHT; Hammer.DIRECTION_UP = DIRECTION_UP; Hammer.DIRECTION_HORIZONTAL = DIRECTION_HORIZONTAL; Hammer.DIRECTION_VERTICAL = DIRECTION_VERTICAL; Hammer.DIRECTION_NONE = DIRECTION_NONE; Hammer.DIRECTION_DOWN = DIRECTION_DOWN; Hammer.INPUT_START = INPUT_START; Hammer.INPUT_MOVE = INPUT_MOVE; Hammer.INPUT_END = INPUT_END; Hammer.INPUT_CANCEL = INPUT_CANCEL; Hammer.STATE_POSSIBLE = STATE_POSSIBLE; Hammer.STATE_BEGAN = STATE_BEGAN; Hammer.STATE_CHANGED = STATE_CHANGED; Hammer.STATE_ENDED = STATE_ENDED; Hammer.STATE_RECOGNIZED = STATE_RECOGNIZED; Hammer.STATE_CANCELLED = STATE_CANCELLED; Hammer.STATE_FAILED = STATE_FAILED; Hammer.Manager = Manager; Hammer.Input = Input; Hammer.TouchAction = TouchAction; Hammer.TouchInput = TouchInput; Hammer.MouseInput = MouseInput; Hammer.PointerEventInput = PointerEventInput; Hammer.TouchMouseInput = TouchMouseInput; Hammer.SingleTouchInput = SingleTouchInput; Hammer.Recognizer = Recognizer; Hammer.AttrRecognizer = AttrRecognizer; Hammer.Tap = TapRecognizer; Hammer.Pan = PanRecognizer; Hammer.Swipe = SwipeRecognizer; Hammer.Pinch = PinchRecognizer; Hammer.Rotate = RotateRecognizer; Hammer.Press = PressRecognizer; Hammer.on = addEventListeners; Hammer.off = removeEventListeners; Hammer.each = each; Hammer.merge = merge; Hammer.extend = extend; Hammer.bindFn = bindFn; Hammer.assign = assign$1; Hammer.inherit = inherit; Hammer.bindFn = bindFn; Hammer.prefixed = prefixed; Hammer.toArray = toArray; Hammer.inArray = inArray; Hammer.uniqueArray = uniqueArray; Hammer.splitStr = splitStr; Hammer.boolOrFn = boolOrFn; Hammer.hasParent = hasParent; Hammer.addEventListeners = addEventListeners; Hammer.removeEventListeners = removeEventListeners; Hammer.defaults = assign$1({}, defaults, { preset: preset }); return Hammer; }(); /** * vis-util * https://github.com/visjs/vis-util * * utilitie collection for visjs * * @version 5.0.2 * @date 2021-02-06T21:33:57.447Z * * @copyright (c) 2011-2017 Almende B.V, http://almende.com * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs * * @license * vis.js is dual licensed under both * * 1. The Apache 2.0 License * http://www.apache.org/licenses/LICENSE-2.0 * * and * * 2. The MIT License * http://opensource.org/licenses/MIT * * vis.js may be distributed under either license. */ /** * Use this symbol to delete properies in deepObjectAssign. */ const DELETE = Symbol("DELETE"); /** * Pure version of deepObjectAssign, it doesn't modify any of it's arguments. * * @param base - The base object that fullfils the whole interface T. * @param updates - Updates that may change or delete props. * * @returns A brand new instance with all the supplied objects deeply merged. */ function pureDeepObjectAssign(base, ...updates) { return deepObjectAssign({}, base, ...updates); } /** * Deep version of object assign with additional deleting by the DELETE symbol. * * @param values - Objects to be deeply merged. * * @returns The first object from values. */ function deepObjectAssign(...values) { const merged = deepObjectAssignNonentry(...values); stripDelete(merged); return merged; } /** * Deep version of object assign with additional deleting by the DELETE symbol. * * @remarks * This doesn't strip the DELETE symbols so they may end up in the final object. * * @param values - Objects to be deeply merged. * * @returns The first object from values. */ function deepObjectAssignNonentry(...values) { if (values.length < 2) { return values[0]; } else if (values.length > 2) { return deepObjectAssignNonentry(deepObjectAssign(values[0], values[1]), ...values.slice(2)); } const a = values[0]; const b = values[1]; for (const prop of Reflect.ownKeys(b)) { if (!Object.prototype.propertyIsEnumerable.call(b, prop)) ; else if (b[prop] === DELETE) { delete a[prop]; } else if (a[prop] !== null && b[prop] !== null && typeof a[prop] === "object" && typeof b[prop] === "object" && !Array.isArray(a[prop]) && !Array.isArray(b[prop])) { a[prop] = deepObjectAssignNonentry(a[prop], b[prop]); } else { a[prop] = clone(b[prop]); } } return a; } /** * Deep clone given object or array. In case of primitive simply return. * * @param a - Anything. * * @returns Deep cloned object/array or unchanged a. */ function clone(a) { if (Array.isArray(a)) { return a.map((value) => clone(value)); } else if (typeof a === "object" && a !== null) { return deepObjectAssignNonentry({}, a); } else { return a; } } /** * Strip DELETE from given object. * * @param a - Object which may contain DELETE but won't after this is executed. */ function stripDelete(a) { for (const prop of Object.keys(a)) { if (a[prop] === DELETE) { delete a[prop]; } else if (typeof a[prop] === "object" && a[prop] !== null) { stripDelete(a[prop]); } } } /** * Seedable, fast and reasonably good (not crypto but more than okay for our * needs) random number generator. * * @remarks * Adapted from {@link https://web.archive.org/web/20110429100736/http://baagoe.com:80/en/RandomMusings/javascript}. * Original algorithm created by Johannes Baagøe \<baagoe\@baagoe.com\> in 2010. */ /** * Create a seeded pseudo random generator based on Alea by Johannes Baagøe. * * @param seed - All supplied arguments will be used as a seed. In case nothing * is supplied the current time will be used to seed the generator. * * @returns A ready to use seeded generator. */ function Alea(...seed) { return AleaImplementation(seed.length ? seed : [Date.now()]); } /** * An implementation of [[Alea]] without user input validation. * * @param seed - The data that will be used to seed the generator. * * @returns A ready to use seeded generator. */ function AleaImplementation(seed) { let [s0, s1, s2] = mashSeed(seed); let c = 1; const random = () => { const t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32 s0 = s1; s1 = s2; return (s2 = t - (c = t | 0)); }; random.uint32 = () => random() * 0x100000000; // 2^32 random.fract53 = () => random() + ((random() * 0x200000) | 0) * 1.1102230246251565e-16; // 2^-53 random.algorithm = "Alea"; random.seed = seed; random.version = "0.9"; return random; } /** * Turn arbitrary data into values [[AleaImplementation]] can use to generate * random numbers. * * @param seed - Arbitrary data that will be used as the seed. * * @returns Three numbers to use as initial values for [[AleaImplementation]]. */ function mashSeed(...seed) { const mash = Mash(); let s0 = mash(" "); let s1 = mash(" "); let s2 = mash(" "); for (let i = 0; i < seed.length; i++) { s0 -= mash(seed[i]); if (s0 < 0) { s0 += 1; } s1 -= mash(seed[i]); if (s1 < 0) { s1 += 1; } s2 -= mash(seed[i]); if (s2 < 0) { s2 += 1; } } return [s0, s1, s2]; } /** * Create a new mash function. * * @returns A nonpure function that takes arbitrary [[Mashable]] data and turns * them into numbers. */ function Mash() { let n = 0xefc8249d; return function (data) { const string = data.toString(); for (let i = 0; i < string.length; i++) { n += string.charCodeAt(i); let h = 0.02519603282416938 * n; n = h >>> 0; h -= n; h *= n; n = h >>> 0; h -= n; n += h * 0x100000000; // 2^32 } return (n >>> 0) * 2.3283064365386963e-10; // 2^-32 }; } /** * Setup a mock hammer.js object, for unit testing. * * Inspiration: https://github.com/uber/deck.gl/pull/658 * * @returns {{on: noop, off: noop, destroy: noop, emit: noop, get: get}} */ function hammerMock() { const noop = () => {}; return { on: noop, off: noop, destroy: noop, emit: noop, get() { return { set: noop, }; }, }; } const Hammer$1 = typeof window !== "undefined" ? window.Hammer || Hammer : function () { // hammer.js is only available in a browser, not in node.js. Replacing it with a mock object. return hammerMock(); }; /** * Turn an element into an clickToUse element. * When not active, the element has a transparent overlay. When the overlay is * clicked, the mode is changed to active. * When active, the element is displayed with a blue border around it, and * the interactive contents of the element can be used. When clicked outside * the element, the elements mode is changed to inactive. * * @param {Element} container * @class Activator */ function Activator(container) { this._cleanupQueue = []; this.active = false; this._dom = { container, overlay: document.createElement("div"), }; this._dom.overlay.classList.add("vis-overlay"); this._dom.container.appendChild(this._dom.overlay); this._cleanupQueue.push(() => { this._dom.overlay.parentNode.removeChild(this._dom.overlay); }); const hammer = Hammer$1(this._dom.overlay); hammer.on("tap", this._onTapOverlay.bind(this)); this._cleanupQueue.push(() => { hammer.destroy(); // FIXME: cleaning up hammer instances doesn't work (Timeline not removed // from memory) }); // block all touch events (except tap) const events = [ "tap", "doubletap", "press", "pinch", "pan", "panstart", "panmove", "panend", ]; events.forEach((event) => { hammer.on(event, (event) => { event.srcEvent.stopPropagation(); }); }); // attach a click event to the window, in order to deactivate when clicking outside the timeline if (document && document.body) { this._onClick = (event) => { if (!_hasParent(event.target, container)) { this.deactivate(); } }; document.body.addEventListener("click", this._onClick); this._cleanupQueue.push(() => { document.body.removeEventListener("click", this._onClick); }); } // prepare escape key listener for deactivating when active this._escListener = (event) => { if ( "key" in event ? event.key === "Escape" : event.keyCode === 27 /* the keyCode is for IE11 */ ) { this.deactivate(); } }; } // turn into an event emitter componentEmitter(Activator.prototype); // The currently active activator Activator.current = null; /** * Destroy the activator. Cleans up all created DOM and event listeners */ Activator.prototype.destroy = function () { this.deactivate(); for (const callback of this._cleanupQueue.splice(0).reverse()) { callback(); } }; /** * Activate the element * Overlay is hidden, element is decorated with a blue shadow border */ Activator.prototype.activate = function () { // we allow only one active activator at a time if (Activator.current) { Activator.current.deactivate(); } Activator.current = this; this.active = true; this._dom.overlay.style.display = "none"; this._dom.container.classList.add("vis-active"); this.emit("change"); this.emit("activate"); // ugly hack: bind ESC after emitting the events, as the Network rebinds all // keyboard events on a 'change' event document.body.addEventListener("keydown", this._escListener); }; /** * Deactivate the element * Overlay is displayed on top of the element */ Activator.prototype.deactivate = function () { this.active = false; this._dom.overlay.style.display = "block"; this._dom.container.classList.remove("vis-active"); document.body.removeEventListener("keydown", this._escListener); this.emit("change"); this.emit("deactivate"); }; /** * Handle a tap event: activate the container * * @param {Event} event The event * @private */ Activator.prototype._onTapOverlay = function (event) { // activate the container this.activate(); event.srcEvent.stopPropagation(); }; /** * Test whether the element has the requested parent element somewhere in * its chain of parent nodes. * * @param {HTMLElement} element * @param {HTMLElement} parent * @returns {boolean} Returns true when the parent is found somewhere in the * chain of parent nodes. * @private */ function _hasParent(element, parent) { while (element) { if (element === parent) { return true; } element = element.parentNode; } return false; } // utility functions // parse ASP.Net Date pattern, // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' // code from http://momentjs.com/ const ASPDateRegex = /^\/?Date\((-?\d+)/i; // Color REs const fullHexRE = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; const shortHexRE = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; const rgbRE = /^rgb\( *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *\)$/i; const rgbaRE = /^rgba\( *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *(1?\d{1,2}|2[0-4]\d|25[0-5]) *, *([01]|0?\.\d+) *\)$/i; /** * Test whether given object is a number. * * @param value - Input value of unknown type. * * @returns True if number, false otherwise. */ function isNumber(value) { return value instanceof Number || typeof value === "number"; } /** * Remove everything in the DOM object. * * @param DOMobject - Node whose child nodes will be recursively deleted. */ function recursiveDOMDelete(DOMobject) { if (DOMobject) { while (DOMobject.hasChildNodes() === true) { const child = DOMobject.firstChild; if (child) { recursiveDOMDelete(child); DOMobject.removeChild(child); } } } } /** * Test whether given object is a string. * * @param value - Input value of unknown type. * * @returns True if string, false otherwise. */ function isString(value) { return value instanceof String || typeof value === "string"; } /** * Test whether given object is a object (not primitive or null). * * @param value - Input value of unknown type. * * @returns True if not null object, false otherwise. */ function isObject(value) { return typeof value === "object" && value !== null; } /** * Test whether given object is a Date, or a String containing a Date. * * @param value - Input value of unknown type. * * @returns True if Date instance or string date representation, false otherwise. */ function isDate(value) { if (value instanceof Date) { return true; } else if (isString(value)) { // test whether this string contains a date const match = ASPDateRegex.exec(value); if (match) { return true; } else if (!isNaN(Date.parse(value))) { return true; } } return false; } /** * Copy property from b to a if property present in a. * If property in b explicitly set to null, delete it if `allowDeletion` set. * * Internal helper routine, should not be exported. Not added to `exports` for that reason. * * @param a - Target object. * @param b - Source object. * @param prop - Name of property to copy from b to a. * @param allowDeletion - If true, delete property in a if explicitly set to null in b. */ function copyOrDelete(a, b, prop, allowDeletion) { let doDeletion = false; if (allowDeletion === true) { doDeletion = b[prop] === null && a[prop] !== undefined; } if (doDeletion) { delete a[prop]; } else { a[prop] = b[prop]; // Remember, this is a reference copy! } } /** * Fill an object with a possibly partially defined other object. * * Only copies values for the properties already present in a. * That means an object is not created on a property if only the b object has it. * * @param a - The object that will have it's properties updated. * @param b - The object with property updates. * @param allowDeletion - If true, delete properties in a that are explicitly set to null in b. */ function fillIfDefined(a, b, allowDeletion = false) { // NOTE: iteration of properties of a // NOTE: prototype properties iterated over as well for (const prop in a) { if (b[prop] !== undefined) { if (b[prop] === null || typeof b[prop] !== "object") { // Note: typeof null === 'object' copyOrDelete(a, b, prop, allowDeletion); } else { const aProp = a[prop]; const bProp = b[prop]; if (isObject(aProp) && isObject(bProp)) { fillIfDefined(aProp, bProp, allowDeletion); } } } } } /** * Copy the values of all of the enumerable own properties from one or more source objects to a * target object. Returns the target object. * * @param target - The target object to copy to. * @param source - The source object from which to copy properties. * * @returns The target object. */ const extend$1 = Object.assign; /** * Extend object a with selected properties of object b or a series of objects. * * @remarks * Only properties with defined values are copied. * * @param props - Properties to be copied to a. * @param a - The target. * @param others - The sources. * * @returns Argument a. */ function selectiveExtend(props, a, ...others) { if (!Array.isArray(props)) { throw new Error("Array with property names expected as first argument"); } for (const other of others) { for (let p = 0; p < props.length; p++) { const prop = props[p]; if (other && Object.prototype.hasOwnProperty.call(other, prop)) { a[prop] = other[prop]; } } } return a; } /** * Extend object a with selected properties of object b. * Only properties with defined values are copied. * * @remarks * Previous version of this routine implied that multiple source objects could * be used; however, the implementation was **wrong**. Since multiple (\>1) * sources weren't used anywhere in the `vis.js` code, this has been removed * * @param props - Names of first-level properties to copy over. * @param a - Target object. * @param b - Source object. * @param allowDeletion - If true, delete property in a if explicitly set to null in b. * * @returns Argument a. */ function selectiveDeepExtend(props, a, b, allowDeletion = false) { // TODO: add support for Arrays to deepExtend if (Array.isArray(b)) { throw new TypeError("Arrays are not supported by deepExtend"); } for (let p = 0; p < props.length; p++) { const prop = props[p]; if (Object.prototype.hasOwnProperty.call(b, prop)) { if (b[prop] && b[prop].constructor === Object) { if (a[prop] === undefined) { a[prop] = {}; } if (a[prop].constructor === Object) { deepExtend(a[prop], b[prop], false, allowDeletion); } else { copyOrDelete(a, b, prop, allowDeletion); } } else if (Array.isArray(b[prop])) { throw new TypeError("Arrays are not supported by deepExtend"); } else { copyOrDelete(a, b, prop, allowDeletion); } } } return a; } /** * Extend object `a` with properties of object `b`, ignoring properties which * are explicitly specified to be excluded. * * @remarks * The properties of `b` are considered for copying. Properties which are * themselves objects are are also extended. Only properties with defined * values are copied. * * @param propsToExclude - Names of properties which should *not* be copied. * @param a - Object to extend. * @param b - Object to take properties from for extension. * @param allowDeletion - If true, delete properties in a that are explicitly * set to null in b. * * @returns Argument a. */ function selectiveNotDeepExtend(propsToExclude, a, b, allowDeletion = false) { // TODO: add support for Arrays to deepExtend // NOTE: array properties have an else-below; apparently, there is a problem here. if (Array.isArray(b)) { throw new TypeError("Arrays are not supported by deepExtend"); } for (const prop in b) { if (!Object.prototype.hasOwnProperty.call(b, prop)) { continue; } // Handle local properties only if (propsToExclude.includes(prop)) { continue; } // In exclusion list, skip if (b[prop] && b[prop].constructor === Object) { if (a[prop] === undefined) { a[prop] = {}; } if (a[prop].constructor === Object) { deepExtend(a[prop], b[prop]); // NOTE: allowDeletion not propagated! } else { copyOrDelete(a, b, prop, allowDeletion); } } else if (Array.isArray(b[prop])) { a[prop] = []; for (let i = 0; i < b[prop].length; i++) { a[prop].push(b[prop][i]); } } else { copyOrDelete(a, b, prop, allowDeletion); } } return a; } /** * Deep extend an object a with the properties of object b. * * @param a - Target object. * @param b - Source object. * @param protoExtend - If true, the prototype values will also be extended. * (That is the options objects that inherit from others will also get the * inherited options). * @param allowDeletion - If true, the values of fields that are null will be deleted. * * @returns Argument a. */ function deepExtend(a, b, protoExtend = false, allowDeletion = false) { for (const prop in b) { if (Object.prototype.hasOwnProperty.call(b, prop) || protoExtend === true) { if (typeof b[prop] === "object" && b[prop] !== null && Object.getPrototypeOf(b[prop]) === Object.prototype) { if (a[prop] === undefined) { a[prop] = deepExtend({}, b[prop], protoExtend); // NOTE: allowDeletion not propagated! } else if (typeof a[prop] === "object" && a[prop] !== null && Object.getPrototypeOf(a[prop]) === Object.prototype) { deepExtend(a[prop], b[prop], protoExtend); // NOTE: allowDeletion not propagated! } else { copyOrDelete(a, b, prop, allowDeletion); } } else if (Array.isArray(b[prop])) { a[prop] = b[prop].slice(); } else { copyOrDelete(a, b, prop, allowDeletion); } } } return a; } /** * Test whether all elements in two arrays are equal. * * @param a - First array. * @param b - Second array. * * @returns True if both arrays have the same length and same elements (1 = '1'). */ function equalArray(a, b) { if (a.length !== b.length) { return false; } for (let i = 0, len = a.length; i < len; i++) { if (a[i] != b[i]) { return false; } } return true; } /** * Get the type of an object, for example exports.getType([]) returns 'Array'. * * @param object - Input value of unknown type. * * @returns Detected type. */ function getType(object) { const type = typeof object; if (type === "object") { if (object === null) { return "null"; } if (object instanceof Boolean) { return "Boolean"; } if (object instanceof Number) { return "Number"; } if (object instanceof String) { return "String"; } if (Array.isArray(object)) { return "Array"; } if (object instanceof Date) { return "Date"; } return "Object"; } if (type === "number") { return "Number"; } if (type === "boolean") { return "Boolean"; } if (type === "string") { return "String"; } if (type === undefined) { return "undefined"; } return type; } /** * Used to extend an array and copy it. This is used to propagate paths recursively. * * @param arr - First part. * @param newValue - The value to be aadded into the array. * * @returns A new array with all items from arr and newValue (which is last). */ function copyAndExtendArray(arr, newValue) { return [...arr, newValue]; } /** * Used to extend an array and copy it. This is used to propagate paths recursively. * * @param arr - The array to be copied. * * @returns Shallow copy of arr. */ function copyArray(arr) { return arr.slice(); } /** * Retrieve the absolute left value of a DOM element. * * @param elem - A dom element, for example a div. * * @returns The absolute left position of this element in the browser page. */ function getAbsoluteLeft(elem) { return elem.getBoundingClientRect().left; } /** * Retrieve the absolute right value of a DOM element. * * @param elem - A dom element, for example a div. * * @returns The absolute right position of this element in the browser page. */ function getAbsoluteRight(elem) { return elem.getBoundingClientRect().right; } /** * Retrieve the absolute top value of a DOM element. * * @param elem - A dom element, for example a div. * * @returns The absolute top position of this element in the browser page. */ function getAbsoluteTop(elem) { return elem.getBoundingClientRect().top; } /** * Add a className to the given elements style. * * @param elem - The element to which the classes will be added. * @param classNames - Space separated list of classes. */ function addClassName(elem, classNames) { let classes = elem.className.split(" "); const newClasses = classNames.split(" "); classes = classes.concat(newClasses.filter(function (className) { return !classes.includes(className); })); elem.className = classes.join(" "); } /** * Remove a className from the given elements style. * * @param elem - The element from which the classes will be removed. * @param classNames - Space separated list of classes. */ function removeClassName(elem, classNames) { let classes = elem.className.split(" "); const oldClasses = classNames.split(" "); classes = classes.filter(function (className) { return !oldClasses.includes(className); }); elem.className = classes.join(" "); } /** * For each method for both arrays and objects. * In case of an array, the built-in Array.forEach() is applied (**No, it's not!**). * In case of an Object, the method loops over all properties of the object. * * @param object - An Object or Array to be iterated over. * @param callback - Array.forEach-like callback. */ function forEach(object, callback) { if (Array.isArray(object)) { // array const len = object.length; for (let i = 0; i < len; i++) { callback(object[i], i, object); } } else { // object for (const key in object) { if (Object.prototype.hasOwnProperty.call(object, key)) { callback(object[key], key, object); } } } } /** * Convert an object into an array: all objects properties are put into the array. The resulting array is unordered. * * @param o - Object that contains the properties and methods. * * @returns An array of unordered values. */ const toArray$1 = Object.values; /** * Update a property in an object. * * @param object - The object whose property will be updated. * @param key - Name of the property to be updated. * @param value - The new value to be assigned. * * @returns Whether the value was updated (true) or already strictly the same in the original object (false). */ function updateProperty(object, key, value) { if (object[key] !== value) { object[key] = value; return true; } else { return false; } } /** * Throttle the given function to be only executed once per animation frame. * * @param fn - The original function. * * @returns The throttled function. */ function throttle(fn) { let scheduled = false; return () => { if (!scheduled) { scheduled = true; requestAnimationFrame(() => { scheduled = false; fn(); }); } }; } /** * Add and event listener. Works for all browsers. * * @param element - The element to bind the event listener to. * @param action - Same as Element.addEventListener(action, —, —). * @param listener - Same as Element.addEventListener(—, listener, —). * @param useCapture - Same as Element.addEventListener(—, —, useCapture). */ function addEventListener(element, action, listener, useCapture) { if (element.addEventListener) { if (useCapture === undefined) { useCapture = false; } if (action === "mousewheel" && navigator.userAgent.includes("Firefox")) { action = "DOMMouseScroll"; // For Firefox } element.addEventListener(action, listener, useCapture); } else { // @TODO: IE types? Does anyone care? element.attachEvent("on" + action, listener); // IE browsers } } /** * Remove an event listener from an element. * * @param element - The element to bind the event listener to. * @param action - Same as Element.removeEventListener(action, —, —). * @param listener - Same as Element.removeEventListener(—, listener, —). * @param useCapture - Same as Element.removeEventListener(—, —, useCapture). */ function removeEventListener(element, action, listener, useCapture) { if (element.removeEventListener) { // non-IE browsers if (useCapture === undefined) { useCapture = false; } if (action === "mousewheel" && navigator.userAgent.includes("Firefox")) { action = "DOMMouseScroll"; // For Firefox } element.removeEventListener(action, listener, useCapture); } else { // @TODO: IE types? Does anyone care? element.detachEvent("on" + action, listener); // IE browsers } } /** * Cancels the event's default action if it is cancelable, without stopping further propagation of the event. * * @param event - The event whose default action should be prevented. */ function preventDefault(event) { if (!event) { event = window.event; } if (!event) ; else if (event.preventDefault) { event.preventDefault(); // non-IE browsers } else { // @TODO: IE types? Does anyone care? event.returnValue = false; // IE browsers } } /** * Get HTML element which is the target of the event. * * @param event - The event. * * @returns The element or null if not obtainable. */ function getTarget(event = window.event) { // code from http://www.quirksmode.org/js/events_properties.html // @TODO: EventTarget can be almost anything, is it okay to return only Elements? let target = null; if (!event) ; else if (event.target) { target = event.target; } else if (event.srcElement) { target = event.srcElement; } if (!(target instanceof Element)) { return null; } if (target.nodeType != null && target.nodeType == 3) { // defeat Safari bug target = target.parentNode; if (!(target instanceof Element)) { return null; } } return target; } /** * Check if given element contains given parent somewhere in the DOM tree. * * @param element - The element to be tested. * @param parent - The ancestor (not necessarily parent) of the element. * * @returns True if parent is an ancestor of the element, false otherwise. */ function hasParent$1(element, parent) { let elem = element; while (elem) { if (elem === parent) { return true; } else if (elem.parentNode) { elem = elem.parentNode; } else { return false; } } return false; } const option = { /** * Convert a value into a boolean. * * @param value - Value to be converted intoboolean, a function will be executed as `(() => unknown)`. * @param defaultValue - If the value or the return value of the function == null then this will be returned. * * @returns Corresponding boolean value, if none then the default value, if none then null. */ asBoolean(value, defaultValue) { if (typeof value == "function") { value = value(); } if (value != null) { return value != false; } return defaultValue || null; }, /** * Convert a value into a number. * * @param value - Value to be converted intonumber, a function will be executed as `(() => unknown)`. * @param defaultValue - If the value or the return value of the function == null then this will be returned. * * @returns Corresponding **boxed** number value, if none then the default value, if none then null. */ asNumber(value, defaultValue) { if (typeof value == "function") { value = value(); } if (value != null) { return Number(value) || defaultValue || null; } return defaultValue || null; }, /** * Convert a value into a string. * * @param value - Value to be converted intostring, a function will be executed as `(() => unknown)`. * @param defaultValue - If the value or the return value of the function == null then this will be returned. * * @returns Corresponding **boxed** string value, if none then the default value, if none then null. */ asString(value, defaultValue) { if (typeof value == "function") { value = value(); } if (value != null) { return String(value); } return defaultValue || null; }, /** * Convert a value into a size. * * @param value - Value to be converted intosize, a function will be executed as `(() => unknown)`. * @param defaultValue - If the value or the return value of the function == null then this will be returned. * * @returns Corresponding string value (number + 'px'), if none then the default value, if none then null. */ asSize(value, defaultValue) { if (typeof value == "function") { value = value(); } if (isString(value)) { return value; } else if (isNumber(value)) { return value + "px"; } else { return defaultValue || null; } }, /** * Convert a value into a DOM Element. * * @param value - Value to be converted into DOM Element, a function will be executed as `(() => unknown)`. * @param defaultValue - If the value or the return value of the function == null then this will be returned. * * @returns The DOM Element, if none then the default value, if none then null. */ asElement(value, defaultValue) { if (typeof value == "function") { value = value(); } return value || defaultValue || null; }, }; /** * Convert hex color string into RGB color object. * * @remarks * {@link http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb} * * @param hex - Hex color string (3 or 6 digits, with or without #). * * @returns RGB color object. */ function hexToRGB(hex) { let result; switch (hex.length) { case 3: case 4: result = shortHexRE.exec(hex); return result ? { r: parseInt(result[1] + result[1], 16), g: parseInt(result[2] + result[2], 16), b: parseInt(result[3] + result[3], 16), } : null; case 6: case 7: result = fullHexRE.exec(hex); return result ? { r: parseInt(result[1], 16), g: parseInt(result[2], 16), b: parseInt(result[3], 16), } : null; default: return null; } } /** * This function takes string color in hex or RGB format and adds the opacity, RGBA is passed through unchanged. * * @param color - The color string (hex, RGB, RGBA). * @param opacity - The new opacity. * * @returns RGBA string, for example 'rgba(255, 0, 127, 0.3)'. */ function overrideOpacity(color, opacity) { if (color.includes("rgba")) { return color; } else if (color.includes("rgb")) { const rgb = color .substr(color.indexOf("(") + 1) .replace(")", "") .split(","); return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + "," + opacity + ")"; } else { const rgb = hexToRGB(color); if (rgb == null) { return color; } else { return "rgba(" + rgb.r + "," + rgb.g + "," + rgb.b + "," + opacity + ")"; } } } /** * Convert RGB \<0, 255\> into hex color string. * * @param red - Red channel. * @param green - Green channel. * @param blue - Blue channel. * * @returns Hex color string (for example: '#0acdc0'). */ function RGBToHex(red, green, blue) { return ("#" + ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).slice(1)); } /** * Parse a color property into an object with border, background, and highlight colors. * * @param inputColor - Shorthand color string or input color object. * @param defaultColor - Full color object to fill in missing values in inputColor. * * @returns Color object. */ function parseColor(inputColor, defaultColor) { if (isString(inputColor)) { let colorStr = inputColor; if (isValidRGB(colorStr)) { const rgb = colorStr .substr(4) .substr(0, colorStr.length - 5) .split(",") .map(function (value) { return parseInt(value); }); colorStr = RGBToHex(rgb[0], rgb[1], rgb[2]); } if (isValidHex(colorStr) === true) { const hsv = hexToHSV(colorStr); const lighterColorHSV = { h: hsv.h, s: hsv.s * 0.8, v: Math.min(1, hsv.v * 1.02), }; const darkerColorHSV = { h: hsv.h, s: Math.min(1, hsv.s * 1.25), v: hsv.v * 0.8, }; const darkerColorHex = HSVToHex(darkerColorHSV.h, darkerColorHSV.s, darkerColorHSV.v); const lighterColorHex = HSVToHex(lighterColorHSV.h, lighterColorHSV.s, lighterColorHSV.v); return { background: colorStr, border: darkerColorHex, highlight: { background: lighterColorHex, border: darkerColorHex, }, hover: { background: lighterColorHex, border: darkerColorHex, }, }; } else { return { background: colorStr, border: colorStr, highlight: { background: colorStr, border: colorStr, }, hover: { background: colorStr, border: colorStr, }, }; } } else { if (defaultColor) { const color = { background: inputColor.background || defaultColor.background, border: inputColor.border || defaultColor.border, highlight: isString(inputColor.highlight) ? { border: inputColor.highlight, background: inputColor.highlight, } : { background: (inputColor.highlight && inputColor.highlight.background) || defaultColor.highlight.background, border: (inputColor.highlight && inputColor.highlight.border) || defaultColor.highlight.border, }, hover: isString(inputColor.hover) ? { border: inputColor.hover, background: inputColor.hover, } : { border: (inputColor.hover && inputColor.hover.border) || defaultColor.hover.border, background: (inputColor.hover && inputColor.hover.background) || defaultColor.hover.background, }, }; return color; } else { const color = { background: inputColor.background || undefined, border: inputColor.border || undefined, highlight: isString(inputColor.highlight) ? { border: inputColor.highlight, background: inputColor.highlight, } : { background: (inputColor.highlight && inputColor.highlight.background) || undefined, border: (inputColor.highlight && inputColor.highlight.border) || undefined, }, hover: isString(inputColor.hover) ? { border: inputColor.hover, background: inputColor.hover, } : { border: (inputColor.hover && inputColor.hover.border) || undefined, background: (inputColor.hover && inputColor.hover.background) || undefined, }, }; return color; } } } /** * Convert RGB \<0, 255\> into HSV object. * * @remarks * {@link http://www.javascripter.net/faq/rgb2hsv.htm} * * @param red - Red channel. * @param green - Green channel. * @param blue - Blue channel. * * @returns HSV color object. */ function RGBToHSV(red, green, blue) { red = red / 255; green = green / 255; blue = blue / 255; const minRGB = Math.min(red, Math.min(green, blue)); const maxRGB = Math.max(red, Math.max(green, blue)); // Black-gray-white if (minRGB === maxRGB) { return { h: 0, s: 0, v: minRGB }; } // Colors other than black-gray-white: const d = red === minRGB ? green - blue : blue === minRGB ? red - green : blue - red; const h = red === minRGB ? 3 : blue === minRGB ? 1 : 5; const hue = (60 * (h - d / (maxRGB - minRGB))) / 360; const saturation = (maxRGB - minRGB) / maxRGB; const value = maxRGB; return { h: hue, s: saturation, v: value }; } const cssUtil = { // split a string with css styles into an object with key/values split(cssText) { const styles = {}; cssText.split(";").forEach((style) => { if (style.trim() != "") { const parts = style.split(":"); const key = parts[0].trim(); const value = parts[1].trim(); styles[key] = value; } }); return styles; }, // build a css text string from an object with key/values join(styles) { return Object.keys(styles) .map(function (key) { return key + ": " + styles[key]; }) .join("; "); }, }; /** * Append a string with css styles to an element. * * @param element - The element that will receive new styles. * @param cssText - The styles to be appended. */ function addCssText(element, cssText) { const currentStyles = cssUtil.split(element.style.cssText); const newStyles = cssUtil.split(cssText); const styles = { ...currentStyles, ...newStyles, }; element.style.cssText = cssUtil.join(styles); } /** * Remove a string with css styles from an element. * * @param element - The element from which styles should be removed. * @param cssText - The styles to be removed. */ function removeCssText(element, cssText) { const styles = cssUtil.split(element.style.cssText); const removeStyles = cssUtil.split(cssText); for (const key in removeStyles) { if (Object.prototype.hasOwnProperty.call(removeStyles, key)) { delete styles[key]; } } element.style.cssText = cssUtil.join(styles); } /** * Convert HSV \<0, 1\> into RGB color object. * * @remarks * {@link https://gist.github.com/mjijackson/5311256} * * @param h - Hue. * @param s - Saturation. * @param v - Value. * * @returns RGB color object. */ function HSVToRGB(h, s, v) { let r; let g; let b; const i = Math.floor(h * 6); const f = h * 6 - i; const p = v * (1 - s); const q = v * (1 - f * s); const t = v * (1 - (1 - f) * s); switch (i % 6) { case 0: (r = v), (g = t), (b = p); break; case 1: (r = q), (g = v), (b = p); break; case 2: (r = p), (g = v), (b = t); break; case 3: (r = p), (g = q), (b = v); break; case 4: (r = t), (g = p), (b = v); break; case 5: (r = v), (g = p), (b = q); break; } return { r: Math.floor(r * 255), g: Math.floor(g * 255), b: Math.floor(b * 255), }; } /** * Convert HSV \<0, 1\> into hex color string. * * @param h - Hue. * @param s - Saturation. * @param v - Value. * * @returns Hex color string. */ function HSVToHex(h, s, v) { const rgb = HSVToRGB(h, s, v); return RGBToHex(rgb.r, rgb.g, rgb.b); } /** * Convert hex color string into HSV \<0, 1\>. * * @param hex - Hex color string. * * @returns HSV color object. */ function hexToHSV(hex) { const rgb = hexToRGB(hex); if (!rgb) { throw new TypeError(`'${hex}' is not a valid color.`); } return RGBToHSV(rgb.r, rgb.g, rgb.b); } /** * Validate hex color string. * * @param hex - Unknown string that may contain a color. * * @returns True if the string is valid, false otherwise. */ function isValidHex(hex) { const isOk = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex); return isOk; } /** * Validate RGB color string. * * @param rgb - Unknown string that may contain a color. * * @returns True if the string is valid, false otherwise. */ function isValidRGB(rgb) { return rgbRE.test(rgb); } /** * Validate RGBA color string. * * @param rgba - Unknown string that may contain a color. * * @returns True if the string is valid, false otherwise. */ function isValidRGBA(rgba) { return rgbaRE.test(rgba); } /** * This recursively redirects the prototype of JSON objects to the referenceObject. * This is used for default options. * * @param fields - Names of properties to be bridged. * @param referenceObject - The original object. * * @returns A new object inheriting from the referenceObject. */ function selectiveBridgeObject(fields, referenceObject) { if (referenceObject !== null && typeof referenceObject === "object") { // !!! typeof null === 'object' const objectTo = Object.create(referenceObject); for (let i = 0; i < fields.length; i++) { if (Object.prototype.hasOwnProperty.call(referenceObject, fields[i])) { if (typeof referenceObject[fields[i]] == "object") { objectTo[fields[i]] = bridgeObject(referenceObject[fields[i]]); } } } return objectTo; } else { return null; } } /** * This recursively redirects the prototype of JSON objects to the referenceObject. * This is used for default options. * * @param referenceObject - The original object. * * @returns The Element if the referenceObject is an Element, or a new object inheriting from the referenceObject. */ function bridgeObject(referenceObject) { if (referenceObject === null || typeof referenceObject !== "object") { return null; } if (referenceObject instanceof Element) { // Avoid bridging DOM objects return referenceObject; } const objectTo = Object.create(referenceObject); for (const i in referenceObject) { if (Object.prototype.hasOwnProperty.call(referenceObject, i)) { if (typeof referenceObject[i] == "object") { objectTo[i] = bridgeObject(referenceObject[i]); } } } return objectTo; } /** * This method provides a stable sort implementation, very fast for presorted data. * * @param a - The array to be sorted (in-place). * @param compare - An order comparator. * * @returns The argument a. */ function insertSort(a, compare) { for (let i = 0; i < a.length; i++) { const k = a[i]; let j; for (j = i; j > 0 && compare(k, a[j - 1]) < 0; j--) { a[j] = a[j - 1]; } a[j] = k; } return a; } /** * This is used to set the options of subobjects in the options object. * * A requirement of these subobjects is that they have an 'enabled' element * which is optional for the user but mandatory for the program. * * The added value here of the merge is that option 'enabled' is set as required. * * @param mergeTarget - Either this.options or the options used for the groups. * @param options - Options. * @param option - Option key in the options argument. * @param globalOptions - Global options, passed in to determine value of option 'enabled'. */ function mergeOptions(mergeTarget, options, option, globalOptions = {}) { // Local helpers const isPresent = function (obj) { return obj !== null && obj !== undefined; }; const isObject = function (obj) { return obj !== null && typeof obj === "object"; }; // https://stackoverflow.com/a/34491287/1223531 const isEmpty = function (obj) { for (const x in obj) { if (Object.prototype.hasOwnProperty.call(obj, x)) { return false; } } return true; }; // Guards if (!isObject(mergeTarget)) { throw new Error("Parameter mergeTarget must be an object"); } if (!isObject(options)) { throw new Error("Parameter options must be an object"); } if (!isPresent(option)) { throw new Error("Parameter option must have a value"); } if (!isObject(globalOptions)) { throw new Error("Parameter globalOptions must be an object"); } // // Actual merge routine, separated from main logic // Only a single level of options is merged. Deeper levels are ref'd. This may actually be an issue. // const doMerge = function (target, options, option) { if (!isObject(target[option])) { target[option] = {}; } const src = options[option]; const dst = target[option]; for (const prop in src) { if (Object.prototype.hasOwnProperty.call(src, prop)) { dst[prop] = src[prop]; } } }; // Local initialization const srcOption = options[option]; const globalPassed = isObject(globalOptions) && !isEmpty(globalOptions); const globalOption = globalPassed ? globalOptions[option] : undefined; const globalEnabled = globalOption ? globalOption.enabled : undefined; ///////////////////////////////////////// // Main routine ///////////////////////////////////////// if (srcOption === undefined) { return; // Nothing to do } if (typeof srcOption === "boolean") { if (!isObject(mergeTarget[option])) { mergeTarget[option] = {}; } mergeTarget[option].enabled = srcOption; return; } if (srcOption === null && !isObject(mergeTarget[option])) { // If possible, explicit copy from globals if (isPresent(globalOption)) { mergeTarget[option] = Object.create(globalOption); } else { return; // Nothing to do } } if (!isObject(srcOption)) { return; } // // Ensure that 'enabled' is properly set. It is required internally // Note that the value from options will always overwrite the existing value // let enabled = true; // default value if (srcOption.enabled !== undefined) { enabled = srcOption.enabled; } else { // Take from globals, if present if (globalEnabled !== undefined) { enabled = globalOption.enabled; } } doMerge(mergeTarget, options, option); mergeTarget[option].enabled = enabled; } /** * This function does a binary search for a visible item in a sorted list. If we find a visible item, the code that uses * this function will then iterate in both directions over this sorted list to find all visible items. * * @param orderedItems - Items ordered by start. * @param comparator - -1 is lower, 0 is equal, 1 is higher. * @param field - Property name on an item (That is item[field]). * @param field2 - Second property name on an item (That is item[field][field2]). * * @returns Index of the found item or -1 if nothing was found. */ function binarySearchCustom(orderedItems, comparator, field, field2) { const maxIterations = 10000; let iteration = 0; let low = 0; let high = orderedItems.length - 1; while (low <= high && iteration < maxIterations) { const middle = Math.floor((low + high) / 2); const item = orderedItems[middle]; const value = field2 === undefined ? item[field] : item[field][field2]; const searchResult = comparator(value); if (searchResult == 0) { // jihaa, found a visible item! return middle; } else if (searchResult == -1) { // it is too small --> increase low low = middle + 1; } else { // it is too big --> decrease high high = middle - 1; } iteration++; } return -1; } /** * This function does a binary search for a specific value in a sorted array. * If it does not exist but is in between of two values, we return either the * one before or the one after, depending on user input If it is found, we * return the index, else -1. * * @param orderedItems - Sorted array. * @param target - The searched value. * @param field - Name of the property in items to be searched. * @param sidePreference - If the target is between two values, should the index of the before or the after be returned? * @param comparator - An optional comparator, returning -1, 0, 1 for \<, ===, \>. * * @returns The index of found value or -1 if nothing was found. */ function binarySearchValue(orderedItems, target, field, sidePreference, comparator) { const maxIterations = 10000; let iteration = 0; let low = 0; let high = orderedItems.length - 1; let prevValue; let value; let nextValue; let middle; comparator = comparator != undefined ? comparator : function (a, b) { return a == b ? 0 : a < b ? -1 : 1; }; while (low <= high && iteration < maxIterations) { // get a new guess middle = Math.floor(0.5 * (high + low)); prevValue = orderedItems[Math.max(0, middle - 1)][field]; value = orderedItems[middle][field]; nextValue = orderedItems[Math.min(orderedItems.length - 1, middle + 1)][field]; if (comparator(value, target) == 0) { // we found the target return middle; } else if (comparator(prevValue, target) < 0 && comparator(value, target) > 0) { // target is in between of the previous and the current return sidePreference == "before" ? Math.max(0, middle - 1) : middle; } else if (comparator(value, target) < 0 && comparator(nextValue, target) > 0) { // target is in between of the current and the next return sidePreference == "before" ? middle : Math.min(orderedItems.length - 1, middle + 1); } else { // didnt find the target, we need to change our boundaries. if (comparator(value, target) < 0) { // it is too small --> increase low low = middle + 1; } else { // it is too big --> decrease high high = middle - 1; } } iteration++; } // didnt find anything. Return -1. return -1; } /* * Easing Functions. * Only considering the t value for the range [0, 1] => [0, 1]. * * Inspiration: from http://gizma.com/easing/ * https://gist.github.com/gre/1650294 */ const easingFunctions = { /** * Provides no easing and no acceleration. * * @param t - Time. * * @returns Value at time t. */ linear(t) { return t; }, /** * Accelerate from zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeInQuad(t) { return t * t; }, /** * Decelerate to zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeOutQuad(t) { return t * (2 - t); }, /** * Accelerate until halfway, then decelerate. * * @param t - Time. * * @returns Value at time t. */ easeInOutQuad(t) { return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t; }, /** * Accelerate from zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeInCubic(t) { return t * t * t; }, /** * Decelerate to zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeOutCubic(t) { return --t * t * t + 1; }, /** * Accelerate until halfway, then decelerate. * * @param t - Time. * * @returns Value at time t. */ easeInOutCubic(t) { return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; }, /** * Accelerate from zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeInQuart(t) { return t * t * t * t; }, /** * Decelerate to zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeOutQuart(t) { return 1 - --t * t * t * t; }, /** * Accelerate until halfway, then decelerate. * * @param t - Time. * * @returns Value at time t. */ easeInOutQuart(t) { return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t; }, /** * Accelerate from zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeInQuint(t) { return t * t * t * t * t; }, /** * Decelerate to zero velocity. * * @param t - Time. * * @returns Value at time t. */ easeOutQuint(t) { return 1 + --t * t * t * t * t; }, /** * Accelerate until halfway, then decelerate. * * @param t - Time. * * @returns Value at time t. */ easeInOutQuint(t) { return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t; }, }; /** * Experimentaly compute the width of the scrollbar for this browser. * * @returns The width in pixels. */ function getScrollBarWidth() { const inner = document.createElement("p"); inner.style.width = "100%"; inner.style.height = "200px"; const outer = document.createElement("div"); outer.style.position = "absolute"; outer.style.top = "0px"; outer.style.left = "0px"; outer.style.visibility = "hidden"; outer.style.width = "200px"; outer.style.height = "150px"; outer.style.overflow = "hidden"; outer.appendChild(inner); document.body.appendChild(outer); const w1 = inner.offsetWidth; outer.style.overflow = "scroll"; let w2 = inner.offsetWidth; if (w1 == w2) { w2 = outer.clientWidth; } document.body.removeChild(outer); return w1 - w2; } // @TODO: This doesn't work properly. // It works only for single property objects, // otherwise it combines all of the types in a union. // export function topMost<K1 extends string, V1> ( // pile: Record<K1, undefined | V1>[], // accessors: K1 | [K1] // ): undefined | V1 // export function topMost<K1 extends string, K2 extends string, V1, V2> ( // pile: Record<K1, undefined | V1 | Record<K2, undefined | V2>>[], // accessors: [K1, K2] // ): undefined | V1 | V2 // export function topMost<K1 extends string, K2 extends string, K3 extends string, V1, V2, V3> ( // pile: Record<K1, undefined | V1 | Record<K2, undefined | V2 | Record<K3, undefined | V3>>>[], // accessors: [K1, K2, K3] // ): undefined | V1 | V2 | V3 /** * Get the top most property value from a pile of objects. * * @param pile - Array of objects, no required format. * @param accessors - Array of property names. * For example `object['foo']['bar']` → `['foo', 'bar']`. * * @returns Value of the property with given accessors path from the first pile item where it's not undefined. */ function topMost(pile, accessors) { let candidate; if (!Array.isArray(accessors)) { accessors = [accessors]; } for (const member of pile) { if (member) { candidate = member[accessors[0]]; for (let i = 1; i < accessors.length; i++) { if (candidate) { candidate = candidate[accessors[i]]; } } if (typeof candidate !== "undefined") { break; } } } return candidate; } const htmlColors = { black: "#000000", navy: "#000080", darkblue: "#00008B", mediumblue: "#0000CD", blue: "#0000FF", darkgreen: "#006400", green: "#008000", teal: "#008080", darkcyan: "#008B8B", deepskyblue: "#00BFFF", darkturquoise: "#00CED1", mediumspringgreen: "#00FA9A", lime: "#00FF00", springgreen: "#00FF7F", aqua: "#00FFFF", cyan: "#00FFFF", midnightblue: "#191970", dodgerblue: "#1E90FF", lightseagreen: "#20B2AA", forestgreen: "#228B22", seagreen: "#2E8B57", darkslategray: "#2F4F4F", limegreen: "#32CD32", mediumseagreen: "#3CB371", turquoise: "#40E0D0", royalblue: "#4169E1", steelblue: "#4682B4", darkslateblue: "#483D8B", mediumturquoise: "#48D1CC", indigo: "#4B0082", darkolivegreen: "#556B2F", cadetblue: "#5F9EA0", cornflowerblue: "#6495ED", mediumaquamarine: "#66CDAA", dimgray: "#696969", slateblue: "#6A5ACD", olivedrab: "#6B8E23", slategray: "#708090", lightslategray: "#778899", mediumslateblue: "#7B68EE", lawngreen: "#7CFC00", chartreuse: "#7FFF00", aquamarine: "#7FFFD4", maroon: "#800000", purple: "#800080", olive: "#808000", gray: "#808080", skyblue: "#87CEEB", lightskyblue: "#87CEFA", blueviolet: "#8A2BE2", darkred: "#8B0000", darkmagenta: "#8B008B", saddlebrown: "#8B4513", darkseagreen: "#8FBC8F", lightgreen: "#90EE90", mediumpurple: "#9370D8", darkviolet: "#9400D3", palegreen: "#98FB98", darkorchid: "#9932CC", yellowgreen: "#9ACD32", sienna: "#A0522D", brown: "#A52A2A", darkgray: "#A9A9A9", lightblue: "#ADD8E6", greenyellow: "#ADFF2F", paleturquoise: "#AFEEEE", lightsteelblue: "#B0C4DE", powderblue: "#B0E0E6", firebrick: "#B22222", darkgoldenrod: "#B8860B", mediumorchid: "#BA55D3", rosybrown: "#BC8F8F", darkkhaki: "#BDB76B", silver: "#C0C0C0", mediumvioletred: "#C71585", indianred: "#CD5C5C", peru: "#CD853F", chocolate: "#D2691E", tan: "#D2B48C", lightgrey: "#D3D3D3", palevioletred: "#D87093", thistle: "#D8BFD8", orchid: "#DA70D6", goldenrod: "#DAA520", crimson: "#DC143C", gainsboro: "#DCDCDC", plum: "#DDA0DD", burlywood: "#DEB887", lightcyan: "#E0FFFF", lavender: "#E6E6FA", darksalmon: "#E9967A", violet: "#EE82EE", palegoldenrod: "#EEE8AA", lightcoral: "#F08080", khaki: "#F0E68C", aliceblue: "#F0F8FF", honeydew: "#F0FFF0", azure: "#F0FFFF", sandybrown: "#F4A460", wheat: "#F5DEB3", beige: "#F5F5DC", whitesmoke: "#F5F5F5", mintcream: "#F5FFFA", ghostwhite: "#F8F8FF", salmon: "#FA8072", antiquewhite: "#FAEBD7", linen: "#FAF0E6", lightgoldenrodyellow: "#FAFAD2", oldlace: "#FDF5E6", red: "#FF0000", fuchsia: "#FF00FF", magenta: "#FF00FF", deeppink: "#FF1493", orangered: "#FF4500", tomato: "#FF6347", hotpink: "#FF69B4", coral: "#FF7F50", darkorange: "#FF8C00", lightsalmon: "#FFA07A", orange: "#FFA500", lightpink: "#FFB6C1", pink: "#FFC0CB", gold: "#FFD700", peachpuff: "#FFDAB9", navajowhite: "#FFDEAD", moccasin: "#FFE4B5", bisque: "#FFE4C4", mistyrose: "#FFE4E1", blanchedalmond: "#FFEBCD", papayawhip: "#FFEFD5", lavenderblush: "#FFF0F5", seashell: "#FFF5EE", cornsilk: "#FFF8DC", lemonchiffon: "#FFFACD", floralwhite: "#FFFAF0", snow: "#FFFAFA", yellow: "#FFFF00", lightyellow: "#FFFFE0", ivory: "#FFFFF0", white: "#FFFFFF", }; /** * @param {number} [pixelRatio=1] */ class ColorPicker { /** * @param {number} [pixelRatio=1] */ constructor(pixelRatio = 1) { this.pixelRatio = pixelRatio; this.generated = false; this.centerCoordinates = { x: 289 / 2, y: 289 / 2 }; this.r = 289 * 0.49; this.color = { r: 255, g: 255, b: 255, a: 1.0 }; this.hueCircle = undefined; this.initialColor = { r: 255, g: 255, b: 255, a: 1.0 }; this.previousColor = undefined; this.applied = false; // bound by this.updateCallback = () => {}; this.closeCallback = () => {}; // create all DOM elements this._create(); } /** * this inserts the colorPicker into a div from the DOM * * @param {Element} container */ insertTo(container) { if (this.hammer !== undefined) { this.hammer.destroy(); this.hammer = undefined; } this.container = container; this.container.appendChild(this.frame); this._bindHammer(); this._setSize(); } /** * the callback is executed on apply and save. Bind it to the application * * @param {Function} callback */ setUpdateCallback(callback) { if (typeof callback === "function") { this.updateCallback = callback; } else { throw new Error( "Function attempted to set as colorPicker update callback is not a function." ); } } /** * the callback is executed on apply and save. Bind it to the application * * @param {Function} callback */ setCloseCallback(callback) { if (typeof callback === "function") { this.closeCallback = callback; } else { throw new Error( "Function attempted to set as colorPicker closing callback is not a function." ); } } /** * * @param {string} color * @returns {string} * @private */ _isColorString(color) { if (typeof color === "string") { return htmlColors[color]; } } /** * Set the color of the colorPicker * Supported formats: * 'red' --> HTML color string * '#ffffff' --> hex string * 'rgb(255,255,255)' --> rgb string * 'rgba(255,255,255,1.0)' --> rgba string * {r:255,g:255,b:255} --> rgb object * {r:255,g:255,b:255,a:1.0} --> rgba object * * @param {string | object} color * @param {boolean} [setInitial=true] */ setColor(color, setInitial = true) { if (color === "none") { return; } let rgba; // if a html color shorthand is used, convert to hex const htmlColor = this._isColorString(color); if (htmlColor !== undefined) { color = htmlColor; } // check format if (isString(color) === true) { if (isValidRGB(color) === true) { const rgbaArray = color .substr(4) .substr(0, color.length - 5) .split(","); rgba = { r: rgbaArray[0], g: rgbaArray[1], b: rgbaArray[2], a: 1.0 }; } else if (isValidRGBA(color) === true) { const rgbaArray = color .substr(5) .substr(0, color.length - 6) .split(","); rgba = { r: rgbaArray[0], g: rgbaArray[1], b: rgbaArray[2], a: rgbaArray[3], }; } else if (isValidHex(color) === true) { const rgbObj = hexToRGB(color); rgba = { r: rgbObj.r, g: rgbObj.g, b: rgbObj.b, a: 1.0 }; } } else { if (color instanceof Object) { if ( color.r !== undefined && color.g !== undefined && color.b !== undefined ) { const alpha = color.a !== undefined ? color.a : "1.0"; rgba = { r: color.r, g: color.g, b: color.b, a: alpha }; } } } // set color if (rgba === undefined) { throw new Error( "Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: " + JSON.stringify(color) ); } else { this._setColor(rgba, setInitial); } } /** * this shows the color picker. * The hue circle is constructed once and stored. */ show() { if (this.closeCallback !== undefined) { this.closeCallback(); this.closeCallback = undefined; } this.applied = false; this.frame.style.display = "block"; this._generateHueCircle(); } // ------------------------------------------ PRIVATE ----------------------------- // /** * Hide the picker. Is called by the cancel button. * Optional boolean to store the previous color for easy access later on. * * @param {boolean} [storePrevious=true] * @private */ _hide(storePrevious = true) { // store the previous color for next time; if (storePrevious === true) { this.previousColor = Object.assign({}, this.color); } if (this.applied === true) { this.updateCallback(this.initialColor); } this.frame.style.display = "none"; // call the closing callback, restoring the onclick method. // this is in a setTimeout because it will trigger the show again before the click is done. setTimeout(() => { if (this.closeCallback !== undefined) { this.closeCallback(); this.closeCallback = undefined; } }, 0); } /** * bound to the save button. Saves and hides. * * @private */ _save() { this.updateCallback(this.color); this.applied = false; this._hide(); } /** * Bound to apply button. Saves but does not close. Is undone by the cancel button. * * @private */ _apply() { this.applied = true; this.updateCallback(this.color); this._updatePicker(this.color); } /** * load the color from the previous session. * * @private */ _loadLast() { if (this.previousColor !== undefined) { this.setColor(this.previousColor, false); } else { alert("There is no last color to load..."); } } /** * set the color, place the picker * * @param {object} rgba * @param {boolean} [setInitial=true] * @private */ _setColor(rgba, setInitial = true) { // store the initial color if (setInitial === true) { this.initialColor = Object.assign({}, rgba); } this.color = rgba; const hsv = RGBToHSV(rgba.r, rgba.g, rgba.b); const angleConvert = 2 * Math.PI; const radius = this.r * hsv.s; const x = this.centerCoordinates.x + radius * Math.sin(angleConvert * hsv.h); const y = this.centerCoordinates.y + radius * Math.cos(angleConvert * hsv.h); this.colorPickerSelector.style.left = x - 0.5 * this.colorPickerSelector.clientWidth + "px"; this.colorPickerSelector.style.top = y - 0.5 * this.colorPickerSelector.clientHeight + "px"; this._updatePicker(rgba); } /** * bound to opacity control * * @param {number} value * @private */ _setOpacity(value) { this.color.a = value / 100; this._updatePicker(this.color); } /** * bound to brightness control * * @param {number} value * @private */ _setBrightness(value) { const hsv = RGBToHSV(this.color.r, this.color.g, this.color.b); hsv.v = value / 100; const rgba = HSVToRGB(hsv.h, hsv.s, hsv.v); rgba["a"] = this.color.a; this.color = rgba; this._updatePicker(); } /** * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing. * * @param {object} rgba * @private */ _updatePicker(rgba = this.color) { const hsv = RGBToHSV(rgba.r, rgba.g, rgba.b); const ctx = this.colorPickerCanvas.getContext("2d"); if (this.pixelRation === undefined) { this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); } ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); // clear the canvas const w = this.colorPickerCanvas.clientWidth; const h = this.colorPickerCanvas.clientHeight; ctx.clearRect(0, 0, w, h); ctx.putImageData(this.hueCircle, 0, 0); ctx.fillStyle = "rgba(0,0,0," + (1 - hsv.v) + ")"; ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r); ctx.fill(); this.brightnessRange.value = 100 * hsv.v; this.opacityRange.value = 100 * rgba.a; this.initialColorDiv.style.backgroundColor = "rgba(" + this.initialColor.r + "," + this.initialColor.g + "," + this.initialColor.b + "," + this.initialColor.a + ")"; this.newColorDiv.style.backgroundColor = "rgba(" + this.color.r + "," + this.color.g + "," + this.color.b + "," + this.color.a + ")"; } /** * used by create to set the size of the canvas. * * @private */ _setSize() { this.colorPickerCanvas.style.width = "100%"; this.colorPickerCanvas.style.height = "100%"; this.colorPickerCanvas.width = 289 * this.pixelRatio; this.colorPickerCanvas.height = 289 * this.pixelRatio; } /** * create all dom elements * TODO: cleanup, lots of similar dom elements * * @private */ _create() { this.frame = document.createElement("div"); this.frame.className = "vis-color-picker"; this.colorPickerDiv = document.createElement("div"); this.colorPickerSelector = document.createElement("div"); this.colorPickerSelector.className = "vis-selector"; this.colorPickerDiv.appendChild(this.colorPickerSelector); this.colorPickerCanvas = document.createElement("canvas"); this.colorPickerDiv.appendChild(this.colorPickerCanvas); if (!this.colorPickerCanvas.getContext) { const noCanvas = document.createElement("DIV"); noCanvas.style.color = "red"; noCanvas.style.fontWeight = "bold"; noCanvas.style.padding = "10px"; noCanvas.innerText = "Error: your browser does not support HTML canvas"; this.colorPickerCanvas.appendChild(noCanvas); } else { const ctx = this.colorPickerCanvas.getContext("2d"); this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); this.colorPickerCanvas .getContext("2d") .setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); } this.colorPickerDiv.className = "vis-color"; this.opacityDiv = document.createElement("div"); this.opacityDiv.className = "vis-opacity"; this.brightnessDiv = document.createElement("div"); this.brightnessDiv.className = "vis-brightness"; this.arrowDiv = document.createElement("div"); this.arrowDiv.className = "vis-arrow"; this.opacityRange = document.createElement("input"); try { this.opacityRange.type = "range"; // Not supported on IE9 this.opacityRange.min = "0"; this.opacityRange.max = "100"; } catch (err) { // TODO: Add some error handling. } this.opacityRange.value = "100"; this.opacityRange.className = "vis-range"; this.brightnessRange = document.createElement("input"); try { this.brightnessRange.type = "range"; // Not supported on IE9 this.brightnessRange.min = "0"; this.brightnessRange.max = "100"; } catch (err) { // TODO: Add some error handling. } this.brightnessRange.value = "100"; this.brightnessRange.className = "vis-range"; this.opacityDiv.appendChild(this.opacityRange); this.brightnessDiv.appendChild(this.brightnessRange); const me = this; this.opacityRange.onchange = function () { me._setOpacity(this.value); }; this.opacityRange.oninput = function () { me._setOpacity(this.value); }; this.brightnessRange.onchange = function () { me._setBrightness(this.value); }; this.brightnessRange.oninput = function () { me._setBrightness(this.value); }; this.brightnessLabel = document.createElement("div"); this.brightnessLabel.className = "vis-label vis-brightness"; this.brightnessLabel.innerText = "brightness:"; this.opacityLabel = document.createElement("div"); this.opacityLabel.className = "vis-label vis-opacity"; this.opacityLabel.innerText = "opacity:"; this.newColorDiv = document.createElement("div"); this.newColorDiv.className = "vis-new-color"; this.newColorDiv.innerText = "new"; this.initialColorDiv = document.createElement("div"); this.initialColorDiv.className = "vis-initial-color"; this.initialColorDiv.innerText = "initial"; this.cancelButton = document.createElement("div"); this.cancelButton.className = "vis-button vis-cancel"; this.cancelButton.innerText = "cancel"; this.cancelButton.onclick = this._hide.bind(this, false); this.applyButton = document.createElement("div"); this.applyButton.className = "vis-button vis-apply"; this.applyButton.innerText = "apply"; this.applyButton.onclick = this._apply.bind(this); this.saveButton = document.createElement("div"); this.saveButton.className = "vis-button vis-save"; this.saveButton.innerText = "save"; this.saveButton.onclick = this._save.bind(this); this.loadButton = document.createElement("div"); this.loadButton.className = "vis-button vis-load"; this.loadButton.innerText = "load last"; this.loadButton.onclick = this._loadLast.bind(this); this.frame.appendChild(this.colorPickerDiv); this.frame.appendChild(this.arrowDiv); this.frame.appendChild(this.brightnessLabel); this.frame.appendChild(this.brightnessDiv); this.frame.appendChild(this.opacityLabel); this.frame.appendChild(this.opacityDiv); this.frame.appendChild(this.newColorDiv); this.frame.appendChild(this.initialColorDiv); this.frame.appendChild(this.cancelButton); this.frame.appendChild(this.applyButton); this.frame.appendChild(this.saveButton); this.frame.appendChild(this.loadButton); } /** * bind hammer to the color picker * * @private */ _bindHammer() { this.drag = {}; this.pinch = {}; this.hammer = new Hammer$1(this.colorPickerCanvas); this.hammer.get("pinch").set({ enable: true }); this.hammer.on("hammer.input", (event) => { if (event.isFirst) { this._moveSelector(event); } }); this.hammer.on("tap", (event) => { this._moveSelector(event); }); this.hammer.on("panstart", (event) => { this._moveSelector(event); }); this.hammer.on("panmove", (event) => { this._moveSelector(event); }); this.hammer.on("panend", (event) => { this._moveSelector(event); }); } /** * generate the hue circle. This is relatively heavy (200ms) and is done only once on the first time it is shown. * * @private */ _generateHueCircle() { if (this.generated === false) { const ctx = this.colorPickerCanvas.getContext("2d"); if (this.pixelRation === undefined) { this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); } ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); // clear the canvas const w = this.colorPickerCanvas.clientWidth; const h = this.colorPickerCanvas.clientHeight; ctx.clearRect(0, 0, w, h); // draw hue circle let x, y, hue, sat; this.centerCoordinates = { x: w * 0.5, y: h * 0.5 }; this.r = 0.49 * w; const angleConvert = (2 * Math.PI) / 360; const hfac = 1 / 360; const sfac = 1 / this.r; let rgb; for (hue = 0; hue < 360; hue++) { for (sat = 0; sat < this.r; sat++) { x = this.centerCoordinates.x + sat * Math.sin(angleConvert * hue); y = this.centerCoordinates.y + sat * Math.cos(angleConvert * hue); rgb = HSVToRGB(hue * hfac, sat * sfac, 1); ctx.fillStyle = "rgb(" + rgb.r + "," + rgb.g + "," + rgb.b + ")"; ctx.fillRect(x - 0.5, y - 0.5, 2, 2); } } ctx.strokeStyle = "rgba(0,0,0,1)"; ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r); ctx.stroke(); this.hueCircle = ctx.getImageData(0, 0, w, h); } this.generated = true; } /** * move the selector. This is called by hammer functions. * * @param {Event} event The event * @private */ _moveSelector(event) { const rect = this.colorPickerDiv.getBoundingClientRect(); const left = event.center.x - rect.left; const top = event.center.y - rect.top; const centerY = 0.5 * this.colorPickerDiv.clientHeight; const centerX = 0.5 * this.colorPickerDiv.clientWidth; const x = left - centerX; const y = top - centerY; const angle = Math.atan2(x, y); const radius = 0.98 * Math.min(Math.sqrt(x * x + y * y), centerX); const newTop = Math.cos(angle) * radius + centerY; const newLeft = Math.sin(angle) * radius + centerX; this.colorPickerSelector.style.top = newTop - 0.5 * this.colorPickerSelector.clientHeight + "px"; this.colorPickerSelector.style.left = newLeft - 0.5 * this.colorPickerSelector.clientWidth + "px"; // set color let h = angle / (2 * Math.PI); h = h < 0 ? h + 1 : h; const s = radius / this.r; const hsv = RGBToHSV(this.color.r, this.color.g, this.color.b); hsv.h = h; hsv.s = s; const rgba = HSVToRGB(hsv.h, hsv.s, hsv.v); rgba["a"] = this.color.a; this.color = rgba; // update previews this.initialColorDiv.style.backgroundColor = "rgba(" + this.initialColor.r + "," + this.initialColor.g + "," + this.initialColor.b + "," + this.initialColor.a + ")"; this.newColorDiv.style.backgroundColor = "rgba(" + this.color.r + "," + this.color.g + "," + this.color.b + "," + this.color.a + ")"; } } /** * Wrap given text (last argument) in HTML elements (all preceding arguments). * * @param {...any} rest - List of tag names followed by inner text. * * @returns An element or a text node. */ function wrapInTag(...rest) { if (rest.length < 1) { throw new TypeError("Invalid arguments."); } else if (rest.length === 1) { return document.createTextNode(rest[0]); } else { const element = document.createElement(rest[0]); element.appendChild(wrapInTag(...rest.slice(1))); return element; } } /** * The way this works is for all properties of this.possible options, you can supply the property name in any form to list the options. * Boolean options are recognised as Boolean * Number options should be written as array: [default value, min value, max value, stepsize] * Colors should be written as array: ['color', '#ffffff'] * Strings with should be written as array: [option1, option2, option3, ..] * * The options are matched with their counterparts in each of the modules and the values used in the configuration are */ class Configurator { /** * @param {object} parentModule | the location where parentModule.setOptions() can be called * @param {object} defaultContainer | the default container of the module * @param {object} configureOptions | the fully configured and predefined options set found in allOptions.js * @param {number} pixelRatio | canvas pixel ratio * @param {Function} hideOption | custom logic to dynamically hide options */ constructor( parentModule, defaultContainer, configureOptions, pixelRatio = 1, hideOption = () => false ) { this.parent = parentModule; this.changedOptions = []; this.container = defaultContainer; this.allowCreation = false; this.hideOption = hideOption; this.options = {}; this.initialized = false; this.popupCounter = 0; this.defaultOptions = { enabled: false, filter: true, container: undefined, showButton: true, }; Object.assign(this.options, this.defaultOptions); this.configureOptions = configureOptions; this.moduleOptions = {}; this.domElements = []; this.popupDiv = {}; this.popupLimit = 5; this.popupHistory = {}; this.colorPicker = new ColorPicker(pixelRatio); this.wrapper = undefined; } /** * refresh all options. * Because all modules parse their options by themselves, we just use their options. We copy them here. * * @param {object} options */ setOptions(options) { if (options !== undefined) { // reset the popup history because the indices may have been changed. this.popupHistory = {}; this._removePopup(); let enabled = true; if (typeof options === "string") { this.options.filter = options; } else if (Array.isArray(options)) { this.options.filter = options.join(); } else if (typeof options === "object") { if (options == null) { throw new TypeError("options cannot be null"); } if (options.container !== undefined) { this.options.container = options.container; } if (options.filter !== undefined) { this.options.filter = options.filter; } if (options.showButton !== undefined) { this.options.showButton = options.showButton; } if (options.enabled !== undefined) { enabled = options.enabled; } } else if (typeof options === "boolean") { this.options.filter = true; enabled = options; } else if (typeof options === "function") { this.options.filter = options; enabled = true; } if (this.options.filter === false) { enabled = false; } this.options.enabled = enabled; } this._clean(); } /** * * @param {object} moduleOptions */ setModuleOptions(moduleOptions) { this.moduleOptions = moduleOptions; if (this.options.enabled === true) { this._clean(); if (this.options.container !== undefined) { this.container = this.options.container; } this._create(); } } /** * Create all DOM elements * * @private */ _create() { this._clean(); this.changedOptions = []; const filter = this.options.filter; let counter = 0; let show = false; for (const option in this.configureOptions) { if (Object.prototype.hasOwnProperty.call(this.configureOptions, option)) { this.allowCreation = false; show = false; if (typeof filter === "function") { show = filter(option, []); show = show || this._handleObject(this.configureOptions[option], [option], true); } else if (filter === true || filter.indexOf(option) !== -1) { show = true; } if (show !== false) { this.allowCreation = true; // linebreak between categories if (counter > 0) { this._makeItem([]); } // a header for the category this._makeHeader(option); // get the sub options this._handleObject(this.configureOptions[option], [option]); } counter++; } } this._makeButton(); this._push(); //~ this.colorPicker.insertTo(this.container); } /** * draw all DOM elements on the screen * * @private */ _push() { this.wrapper = document.createElement("div"); this.wrapper.className = "vis-configuration-wrapper"; this.container.appendChild(this.wrapper); for (let i = 0; i < this.domElements.length; i++) { this.wrapper.appendChild(this.domElements[i]); } this._showPopupIfNeeded(); } /** * delete all DOM elements * * @private */ _clean() { for (let i = 0; i < this.domElements.length; i++) { this.wrapper.removeChild(this.domElements[i]); } if (this.wrapper !== undefined) { this.container.removeChild(this.wrapper); this.wrapper = undefined; } this.domElements = []; this._removePopup(); } /** * get the value from the actualOptions if it exists * * @param {Array} path | where to look for the actual option * @returns {*} * @private */ _getValue(path) { let base = this.moduleOptions; for (let i = 0; i < path.length; i++) { if (base[path[i]] !== undefined) { base = base[path[i]]; } else { base = undefined; break; } } return base; } /** * all option elements are wrapped in an item * * @param {Array} path | where to look for the actual option * @param {Array.<Element>} domElements * @returns {number} * @private */ _makeItem(path, ...domElements) { if (this.allowCreation === true) { const item = document.createElement("div"); item.className = "vis-configuration vis-config-item vis-config-s" + path.length; domElements.forEach((element) => { item.appendChild(element); }); this.domElements.push(item); return this.domElements.length; } return 0; } /** * header for major subjects * * @param {string} name * @private */ _makeHeader(name) { const div = document.createElement("div"); div.className = "vis-configuration vis-config-header"; div.innerText = name; this._makeItem([], div); } /** * make a label, if it is an object label, it gets different styling. * * @param {string} name * @param {Array} path | where to look for the actual option * @param {string} objectLabel * @returns {HTMLElement} * @private */ _makeLabel(name, path, objectLabel = false) { const div = document.createElement("div"); div.className = "vis-configuration vis-config-label vis-config-s" + path.length; if (objectLabel === true) { while (div.firstChild) { div.removeChild(div.firstChild); } div.appendChild(wrapInTag("i", "b", name)); } else { div.innerText = name + ":"; } return div; } /** * make a dropdown list for multiple possible string optoins * * @param {Array.<number>} arr * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _makeDropdown(arr, value, path) { const select = document.createElement("select"); select.className = "vis-configuration vis-config-select"; let selectedValue = 0; if (value !== undefined) { if (arr.indexOf(value) !== -1) { selectedValue = arr.indexOf(value); } } for (let i = 0; i < arr.length; i++) { const option = document.createElement("option"); option.value = arr[i]; if (i === selectedValue) { option.selected = "selected"; } option.innerText = arr[i]; select.appendChild(option); } const me = this; select.onchange = function () { me._update(this.value, path); }; const label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, select); } /** * make a range object for numeric options * * @param {Array.<number>} arr * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _makeRange(arr, value, path) { const defaultValue = arr[0]; const min = arr[1]; const max = arr[2]; const step = arr[3]; const range = document.createElement("input"); range.className = "vis-configuration vis-config-range"; try { range.type = "range"; // not supported on IE9 range.min = min; range.max = max; } catch (err) { // TODO: Add some error handling. } range.step = step; // set up the popup settings in case they are needed. let popupString = ""; let popupValue = 0; if (value !== undefined) { const factor = 1.2; if (value < 0 && value * factor < min) { range.min = Math.ceil(value * factor); popupValue = range.min; popupString = "range increased"; } else if (value / factor < min) { range.min = Math.ceil(value / factor); popupValue = range.min; popupString = "range increased"; } if (value * factor > max && max !== 1) { range.max = Math.ceil(value * factor); popupValue = range.max; popupString = "range increased"; } range.value = value; } else { range.value = defaultValue; } const input = document.createElement("input"); input.className = "vis-configuration vis-config-rangeinput"; input.value = range.value; const me = this; range.onchange = function () { input.value = this.value; me._update(Number(this.value), path); }; range.oninput = function () { input.value = this.value; }; const label = this._makeLabel(path[path.length - 1], path); const itemIndex = this._makeItem(path, label, range, input); // if a popup is needed AND it has not been shown for this value, show it. if (popupString !== "" && this.popupHistory[itemIndex] !== popupValue) { this.popupHistory[itemIndex] = popupValue; this._setupPopup(popupString, itemIndex); } } /** * make a button object * * @private */ _makeButton() { if (this.options.showButton === true) { const generateButton = document.createElement("div"); generateButton.className = "vis-configuration vis-config-button"; generateButton.innerText = "generate options"; generateButton.onclick = () => { this._printOptions(); }; generateButton.onmouseover = () => { generateButton.className = "vis-configuration vis-config-button hover"; }; generateButton.onmouseout = () => { generateButton.className = "vis-configuration vis-config-button"; }; this.optionsContainer = document.createElement("div"); this.optionsContainer.className = "vis-configuration vis-config-option-container"; this.domElements.push(this.optionsContainer); this.domElements.push(generateButton); } } /** * prepare the popup * * @param {string} string * @param {number} index * @private */ _setupPopup(string, index) { if ( this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit ) { const div = document.createElement("div"); div.id = "vis-configuration-popup"; div.className = "vis-configuration-popup"; div.innerText = string; div.onclick = () => { this._removePopup(); }; this.popupCounter += 1; this.popupDiv = { html: div, index: index }; } } /** * remove the popup from the dom * * @private */ _removePopup() { if (this.popupDiv.html !== undefined) { this.popupDiv.html.parentNode.removeChild(this.popupDiv.html); clearTimeout(this.popupDiv.hideTimeout); clearTimeout(this.popupDiv.deleteTimeout); this.popupDiv = {}; } } /** * Show the popup if it is needed. * * @private */ _showPopupIfNeeded() { if (this.popupDiv.html !== undefined) { const correspondingElement = this.domElements[this.popupDiv.index]; const rect = correspondingElement.getBoundingClientRect(); this.popupDiv.html.style.left = rect.left + "px"; this.popupDiv.html.style.top = rect.top - 30 + "px"; // 30 is the height; document.body.appendChild(this.popupDiv.html); this.popupDiv.hideTimeout = setTimeout(() => { this.popupDiv.html.style.opacity = 0; }, 1500); this.popupDiv.deleteTimeout = setTimeout(() => { this._removePopup(); }, 1800); } } /** * make a checkbox for boolean options. * * @param {number} defaultValue * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _makeCheckbox(defaultValue, value, path) { const checkbox = document.createElement("input"); checkbox.type = "checkbox"; checkbox.className = "vis-configuration vis-config-checkbox"; checkbox.checked = defaultValue; if (value !== undefined) { checkbox.checked = value; if (value !== defaultValue) { if (typeof defaultValue === "object") { if (value !== defaultValue.enabled) { this.changedOptions.push({ path: path, value: value }); } } else { this.changedOptions.push({ path: path, value: value }); } } } const me = this; checkbox.onchange = function () { me._update(this.checked, path); }; const label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, checkbox); } /** * make a text input field for string options. * * @param {number} defaultValue * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _makeTextInput(defaultValue, value, path) { const checkbox = document.createElement("input"); checkbox.type = "text"; checkbox.className = "vis-configuration vis-config-text"; checkbox.value = value; if (value !== defaultValue) { this.changedOptions.push({ path: path, value: value }); } const me = this; checkbox.onchange = function () { me._update(this.value, path); }; const label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, checkbox); } /** * make a color field with a color picker for color fields * * @param {Array.<number>} arr * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _makeColorField(arr, value, path) { const defaultColor = arr[1]; const div = document.createElement("div"); value = value === undefined ? defaultColor : value; if (value !== "none") { div.className = "vis-configuration vis-config-colorBlock"; div.style.backgroundColor = value; } else { div.className = "vis-configuration vis-config-colorBlock none"; } value = value === undefined ? defaultColor : value; div.onclick = () => { this._showColorPicker(value, div, path); }; const label = this._makeLabel(path[path.length - 1], path); this._makeItem(path, label, div); } /** * used by the color buttons to call the color picker. * * @param {number} value * @param {HTMLElement} div * @param {Array} path | where to look for the actual option * @private */ _showColorPicker(value, div, path) { // clear the callback from this div div.onclick = function () {}; this.colorPicker.insertTo(div); this.colorPicker.show(); this.colorPicker.setColor(value); this.colorPicker.setUpdateCallback((color) => { const colorString = "rgba(" + color.r + "," + color.g + "," + color.b + "," + color.a + ")"; div.style.backgroundColor = colorString; this._update(colorString, path); }); // on close of the colorpicker, restore the callback. this.colorPicker.setCloseCallback(() => { div.onclick = () => { this._showColorPicker(value, div, path); }; }); } /** * parse an object and draw the correct items * * @param {object} obj * @param {Array} [path=[]] | where to look for the actual option * @param {boolean} [checkOnly=false] * @returns {boolean} * @private */ _handleObject(obj, path = [], checkOnly = false) { let show = false; const filter = this.options.filter; let visibleInSet = false; for (const subObj in obj) { if (Object.prototype.hasOwnProperty.call(obj, subObj)) { show = true; const item = obj[subObj]; const newPath = copyAndExtendArray(path, subObj); if (typeof filter === "function") { show = filter(subObj, path); // if needed we must go deeper into the object. if (show === false) { if ( !Array.isArray(item) && typeof item !== "string" && typeof item !== "boolean" && item instanceof Object ) { this.allowCreation = false; show = this._handleObject(item, newPath, true); this.allowCreation = checkOnly === false; } } } if (show !== false) { visibleInSet = true; const value = this._getValue(newPath); if (Array.isArray(item)) { this._handleArray(item, value, newPath); } else if (typeof item === "string") { this._makeTextInput(item, value, newPath); } else if (typeof item === "boolean") { this._makeCheckbox(item, value, newPath); } else if (item instanceof Object) { // skip the options that are not enabled if (!this.hideOption(path, subObj, this.moduleOptions)) { // initially collapse options with an disabled enabled option. if (item.enabled !== undefined) { const enabledPath = copyAndExtendArray(newPath, "enabled"); const enabledValue = this._getValue(enabledPath); if (enabledValue === true) { const label = this._makeLabel(subObj, newPath, true); this._makeItem(newPath, label); visibleInSet = this._handleObject(item, newPath) || visibleInSet; } else { this._makeCheckbox(item, enabledValue, newPath); } } else { const label = this._makeLabel(subObj, newPath, true); this._makeItem(newPath, label); visibleInSet = this._handleObject(item, newPath) || visibleInSet; } } } else { console.error("dont know how to handle", item, subObj, newPath); } } } } return visibleInSet; } /** * handle the array type of option * * @param {Array.<number>} arr * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _handleArray(arr, value, path) { if (typeof arr[0] === "string" && arr[0] === "color") { this._makeColorField(arr, value, path); if (arr[1] !== value) { this.changedOptions.push({ path: path, value: value }); } } else if (typeof arr[0] === "string") { this._makeDropdown(arr, value, path); if (arr[0] !== value) { this.changedOptions.push({ path: path, value: value }); } } else if (typeof arr[0] === "number") { this._makeRange(arr, value, path); if (arr[0] !== value) { this.changedOptions.push({ path: path, value: Number(value) }); } } } /** * called to update the network with the new settings. * * @param {number} value * @param {Array} path | where to look for the actual option * @private */ _update(value, path) { const options = this._constructOptions(value, path); if ( this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit ) { this.parent.body.emitter.emit("configChange", options); } this.initialized = true; this.parent.setOptions(options); } /** * * @param {string | boolean} value * @param {Array.<string>} path * @param {{}} optionsObj * @returns {{}} * @private */ _constructOptions(value, path, optionsObj = {}) { let pointer = optionsObj; // when dropdown boxes can be string or boolean, we typecast it into correct types value = value === "true" ? true : value; value = value === "false" ? false : value; for (let i = 0; i < path.length; i++) { if (path[i] !== "global") { if (pointer[path[i]] === undefined) { pointer[path[i]] = {}; } if (i !== path.length - 1) { pointer = pointer[path[i]]; } else { pointer[path[i]] = value; } } } return optionsObj; } /** * @private */ _printOptions() { const options = this.getOptions(); while (this.optionsContainer.firstChild) { this.optionsContainer.removeChild(this.optionsContainer.firstChild); } this.optionsContainer.appendChild( wrapInTag("pre", "const options = " + JSON.stringify(options, null, 2)) ); } /** * * @returns {{}} options */ getOptions() { const options = {}; for (let i = 0; i < this.changedOptions.length; i++) { this._constructOptions( this.changedOptions[i].value, this.changedOptions[i].path, options ); } return options; } } /** * Popup is a class to create a popup window with some text */ class Popup { /** * @param {Element} container The container object. * @param {string} overflowMethod How the popup should act to overflowing ('flip' or 'cap') */ constructor(container, overflowMethod) { this.container = container; this.overflowMethod = overflowMethod || "cap"; this.x = 0; this.y = 0; this.padding = 5; this.hidden = false; // create the frame this.frame = document.createElement("div"); this.frame.className = "vis-tooltip"; this.container.appendChild(this.frame); } /** * @param {number} x Horizontal position of the popup window * @param {number} y Vertical position of the popup window */ setPosition(x, y) { this.x = parseInt(x); this.y = parseInt(y); } /** * Set the content for the popup window. This can be HTML code or text. * * @param {string | Element} content */ setText(content) { if (content instanceof Element) { while (this.frame.firstChild) { this.frame.removeChild(this.frame.firstChild); } this.frame.appendChild(content); } else { // String containing literal text, element has to be used for HTML due to // XSS risks associated with innerHTML (i.e. prevent XSS by accident). this.frame.innerText = content; } } /** * Show the popup window * * @param {boolean} [doShow] Show or hide the window */ show(doShow) { if (doShow === undefined) { doShow = true; } if (doShow === true) { const height = this.frame.clientHeight; const width = this.frame.clientWidth; const maxHeight = this.frame.parentNode.clientHeight; const maxWidth = this.frame.parentNode.clientWidth; let left = 0, top = 0; if (this.overflowMethod == "flip") { let isLeft = false, isTop = true; // Where around the position it's located if (this.y - height < this.padding) { isTop = false; } if (this.x + width > maxWidth - this.padding) { isLeft = true; } if (isLeft) { left = this.x - width; } else { left = this.x; } if (isTop) { top = this.y - height; } else { top = this.y; } } else { top = this.y - height; if (top + height + this.padding > maxHeight) { top = maxHeight - height - this.padding; } if (top < this.padding) { top = this.padding; } left = this.x; if (left + width + this.padding > maxWidth) { left = maxWidth - width - this.padding; } if (left < this.padding) { left = this.padding; } } this.frame.style.left = left + "px"; this.frame.style.top = top + "px"; this.frame.style.visibility = "visible"; this.hidden = false; } else { this.hide(); } } /** * Hide the popup window */ hide() { this.hidden = true; this.frame.style.left = "0"; this.frame.style.top = "0"; this.frame.style.visibility = "hidden"; } /** * Remove the popup window */ destroy() { this.frame.parentNode.removeChild(this.frame); // Remove element from DOM } } let errorFound = false; let allOptions; const VALIDATOR_PRINT_STYLE = "background: #FFeeee; color: #dd0000"; /** * Used to validate options. */ class Validator { /** * Main function to be called * * @param {object} options * @param {object} referenceOptions * @param {object} subObject * @returns {boolean} * @static */ static validate(options, referenceOptions, subObject) { errorFound = false; allOptions = referenceOptions; let usedOptions = referenceOptions; if (subObject !== undefined) { usedOptions = referenceOptions[subObject]; } Validator.parse(options, usedOptions, []); return errorFound; } /** * Will traverse an object recursively and check every value * * @param {object} options * @param {object} referenceOptions * @param {Array} path | where to look for the actual option * @static */ static parse(options, referenceOptions, path) { for (const option in options) { if (Object.prototype.hasOwnProperty.call(options, option)) { Validator.check(option, options, referenceOptions, path); } } } /** * Check every value. If the value is an object, call the parse function on that object. * * @param {string} option * @param {object} options * @param {object} referenceOptions * @param {Array} path | where to look for the actual option * @static */ static check(option, options, referenceOptions, path) { if ( referenceOptions[option] === undefined && referenceOptions.__any__ === undefined ) { Validator.getSuggestion(option, referenceOptions, path); return; } let referenceOption = option; let is_object = true; if ( referenceOptions[option] === undefined && referenceOptions.__any__ !== undefined ) { // NOTE: This only triggers if the __any__ is in the top level of the options object. // THAT'S A REALLY BAD PLACE TO ALLOW IT!!!! // TODO: Examine if needed, remove if possible // __any__ is a wildcard. Any value is accepted and will be further analysed by reference. referenceOption = "__any__"; // if the any-subgroup is not a predefined object in the configurator, // we do not look deeper into the object. is_object = Validator.getType(options[option]) === "object"; } let refOptionObj = referenceOptions[referenceOption]; if (is_object && refOptionObj.__type__ !== undefined) { refOptionObj = refOptionObj.__type__; } Validator.checkFields( option, options, referenceOptions, referenceOption, refOptionObj, path ); } /** * * @param {string} option | the option property * @param {object} options | The supplied options object * @param {object} referenceOptions | The reference options containing all options and their allowed formats * @param {string} referenceOption | Usually this is the same as option, except when handling an __any__ tag. * @param {string} refOptionObj | This is the type object from the reference options * @param {Array} path | where in the object is the option * @static */ static checkFields( option, options, referenceOptions, referenceOption, refOptionObj, path ) { const log = function (message) { console.error( "%c" + message + Validator.printLocation(path, option), VALIDATOR_PRINT_STYLE ); }; const optionType = Validator.getType(options[option]); const refOptionType = refOptionObj[optionType]; if (refOptionType !== undefined) { // if the type is correct, we check if it is supposed to be one of a few select values if ( Validator.getType(refOptionType) === "array" && refOptionType.indexOf(options[option]) === -1 ) { log( 'Invalid option detected in "' + option + '".' + " Allowed values are:" + Validator.print(refOptionType) + ' not "' + options[option] + '". ' ); errorFound = true; } else if (optionType === "object" && referenceOption !== "__any__") { path = copyAndExtendArray(path, option); Validator.parse( options[option], referenceOptions[referenceOption], path ); } } else if (refOptionObj["any"] === undefined) { // type of the field is incorrect and the field cannot be any log( 'Invalid type received for "' + option + '". Expected: ' + Validator.print(Object.keys(refOptionObj)) + ". Received [" + optionType + '] "' + options[option] + '"' ); errorFound = true; } } /** * * @param {object | boolean | number | string | Array.<number> | Date | Node | Moment | undefined | null} object * @returns {string} * @static */ static getType(object) { const type = typeof object; if (type === "object") { if (object === null) { return "null"; } if (object instanceof Boolean) { return "boolean"; } if (object instanceof Number) { return "number"; } if (object instanceof String) { return "string"; } if (Array.isArray(object)) { return "array"; } if (object instanceof Date) { return "date"; } if (object.nodeType !== undefined) { return "dom"; } if (object._isAMomentObject === true) { return "moment"; } return "object"; } else if (type === "number") { return "number"; } else if (type === "boolean") { return "boolean"; } else if (type === "string") { return "string"; } else if (type === undefined) { return "undefined"; } return type; } /** * @param {string} option * @param {object} options * @param {Array.<string>} path * @static */ static getSuggestion(option, options, path) { const localSearch = Validator.findInOptions(option, options, path, false); const globalSearch = Validator.findInOptions(option, allOptions, [], true); const localSearchThreshold = 8; const globalSearchThreshold = 4; let msg; if (localSearch.indexMatch !== undefined) { msg = " in " + Validator.printLocation(localSearch.path, option, "") + 'Perhaps it was incomplete? Did you mean: "' + localSearch.indexMatch + '"?\n\n'; } else if ( globalSearch.distance <= globalSearchThreshold && localSearch.distance > globalSearch.distance ) { msg = " in " + Validator.printLocation(localSearch.path, option, "") + "Perhaps it was misplaced? Matching option found at: " + Validator.printLocation( globalSearch.path, globalSearch.closestMatch, "" ); } else if (localSearch.distance <= localSearchThreshold) { msg = '. Did you mean "' + localSearch.closestMatch + '"?' + Validator.printLocation(localSearch.path, option); } else { msg = ". Did you mean one of these: " + Validator.print(Object.keys(options)) + Validator.printLocation(path, option); } console.error( '%cUnknown option detected: "' + option + '"' + msg, VALIDATOR_PRINT_STYLE ); errorFound = true; } /** * traverse the options in search for a match. * * @param {string} option * @param {object} options * @param {Array} path | where to look for the actual option * @param {boolean} [recursive=false] * @returns {{closestMatch: string, path: Array, distance: number}} * @static */ static findInOptions(option, options, path, recursive = false) { let min = 1e9; let closestMatch = ""; let closestMatchPath = []; const lowerCaseOption = option.toLowerCase(); let indexMatch = undefined; for (const op in options) { let distance; if (options[op].__type__ !== undefined && recursive === true) { const result = Validator.findInOptions( option, options[op], copyAndExtendArray(path, op) ); if (min > result.distance) { closestMatch = result.closestMatch; closestMatchPath = result.path; min = result.distance; indexMatch = result.indexMatch; } } else { if (op.toLowerCase().indexOf(lowerCaseOption) !== -1) { indexMatch = op; } distance = Validator.levenshteinDistance(option, op); if (min > distance) { closestMatch = op; closestMatchPath = copyArray(path); min = distance; } } } return { closestMatch: closestMatch, path: closestMatchPath, distance: min, indexMatch: indexMatch, }; } /** * @param {Array.<string>} path * @param {object} option * @param {string} prefix * @returns {string} * @static */ static printLocation(path, option, prefix = "Problem value found at: \n") { let str = "\n\n" + prefix + "options = {\n"; for (let i = 0; i < path.length; i++) { for (let j = 0; j < i + 1; j++) { str += " "; } str += path[i] + ": {\n"; } for (let j = 0; j < path.length + 1; j++) { str += " "; } str += option + "\n"; for (let i = 0; i < path.length + 1; i++) { for (let j = 0; j < path.length - i; j++) { str += " "; } str += "}\n"; } return str + "\n\n"; } /** * @param {object} options * @returns {string} * @static */ static print(options) { return JSON.stringify(options) .replace(/(")|(\[)|(\])|(,"__type__")/g, "") .replace(/(,)/g, ", "); } /** * Compute the edit distance between the two given strings * http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript * * Copyright (c) 2011 Andrei Mackenzie * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @param {string} a * @param {string} b * @returns {Array.<Array.<number>>}} * @static */ static levenshteinDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; const matrix = []; // increment along the first column of each row let i; for (i = 0; i <= b.length; i++) { matrix[i] = [i]; } // increment each column in the first row let j; for (j = 0; j <= a.length; j++) { matrix[0][j] = j; } // Fill in the rest of the matrix for (i = 1; i <= b.length; i++) { for (j = 1; j <= a.length; j++) { if (b.charAt(i - 1) == a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min( matrix[i - 1][j - 1] + 1, // substitution Math.min( matrix[i][j - 1] + 1, // insertion matrix[i - 1][j] + 1 ) ); // deletion } } } return matrix[b.length][a.length]; } } const Activator$1 = Activator; const ColorPicker$1 = ColorPicker; const Configurator$1 = Configurator; const Hammer$1$1 = Hammer$1; const Popup$1 = Popup; const VALIDATOR_PRINT_STYLE$1 = VALIDATOR_PRINT_STYLE; const Validator$1 = Validator; var util$1 = /*#__PURE__*/Object.freeze({ __proto__: null, Activator: Activator$1, Alea: Alea, ColorPicker: ColorPicker$1, Configurator: Configurator$1, DELETE: DELETE, HSVToHex: HSVToHex, HSVToRGB: HSVToRGB, Hammer: Hammer$1$1, Popup: Popup$1, RGBToHSV: RGBToHSV, RGBToHex: RGBToHex, VALIDATOR_PRINT_STYLE: VALIDATOR_PRINT_STYLE$1, Validator: Validator$1, addClassName: addClassName, addCssText: addCssText, addEventListener: addEventListener, binarySearchCustom: binarySearchCustom, binarySearchValue: binarySearchValue, bridgeObject: bridgeObject, copyAndExtendArray: copyAndExtendArray, copyArray: copyArray, deepExtend: deepExtend, deepObjectAssign: deepObjectAssign, easingFunctions: easingFunctions, equalArray: equalArray, extend: extend$1, fillIfDefined: fillIfDefined, forEach: forEach, getAbsoluteLeft: getAbsoluteLeft, getAbsoluteRight: getAbsoluteRight, getAbsoluteTop: getAbsoluteTop, getScrollBarWidth: getScrollBarWidth, getTarget: getTarget, getType: getType, hasParent: hasParent$1, hexToHSV: hexToHSV, hexToRGB: hexToRGB, insertSort: insertSort, isDate: isDate, isNumber: isNumber, isObject: isObject, isString: isString, isValidHex: isValidHex, isValidRGB: isValidRGB, isValidRGBA: isValidRGBA, mergeOptions: mergeOptions, option: option, overrideOpacity: overrideOpacity, parseColor: parseColor, preventDefault: preventDefault, pureDeepObjectAssign: pureDeepObjectAssign, recursiveDOMDelete: recursiveDOMDelete, removeClassName: removeClassName, removeCssText: removeCssText, removeEventListener: removeEventListener, selectiveBridgeObject: selectiveBridgeObject, selectiveDeepExtend: selectiveDeepExtend, selectiveExtend: selectiveExtend, selectiveNotDeepExtend: selectiveNotDeepExtend, throttle: throttle, toArray: toArray$1, topMost: topMost, updateProperty: updateProperty }); var rng_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = rng; var _crypto = _interopRequireDefault(require$$0__default['default']); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function rng() { return _crypto.default.randomBytes(16); } module.exports = exports.default; }); var bytesToUuid_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * Convert array of 16 byte values to UUID string format of the form: * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ var byteToHex = []; for (var i = 0; i < 256; ++i) { byteToHex[i] = (i + 0x100).toString(16).substr(1); } function bytesToUuid(buf, offset) { var i = offset || 0; var bth = byteToHex; // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4 return [bth[buf[i++]], bth[buf[i++]], bth[buf[i++]], bth[buf[i++]], '-', bth[buf[i++]], bth[buf[i++]], '-', bth[buf[i++]], bth[buf[i++]], '-', bth[buf[i++]], bth[buf[i++]], '-', bth[buf[i++]], bth[buf[i++]], bth[buf[i++]], bth[buf[i++]], bth[buf[i++]], bth[buf[i++]]].join(''); } var _default = bytesToUuid; exports.default = _default; module.exports = exports.default; }); var v1_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _rng = _interopRequireDefault(rng_1); var _bytesToUuid = _interopRequireDefault(bytesToUuid_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // **`v1()` - Generate time-based UUID** // // Inspired by https://github.com/LiosK/UUID.js // and http://docs.python.org/library/uuid.html var _nodeId; var _clockseq; // Previous uuid creation time var _lastMSecs = 0; var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details function v1(options, buf, offset) { var i = buf && offset || 0; var b = buf || []; options = options || {}; var node = options.node || _nodeId; var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not // specified. We do this lazily to minimize issues related to insufficient // system entropy. See #189 if (node == null || clockseq == null) { var seedBytes = options.random || (options.rng || _rng.default)(); if (node == null) { // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; } if (clockseq == null) { // Per 4.2.2, randomize (14 bit) clockseq clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; } } // UUID timestamps are 100 nano-second units since the Gregorian epoch, // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime(); // Per 4.2.1.2, use count of uuid's generated during the current clock // cycle to simulate higher resolution clock var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression if (dt < 0 && options.clockseq === undefined) { clockseq = clockseq + 1 & 0x3fff; } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new // time interval if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { nsecs = 0; } // Per 4.2.1.2 Throw error if too many uuids are requested if (nsecs >= 10000) { throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); } _lastMSecs = msecs; _lastNSecs = nsecs; _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch msecs += 12219292800000; // `time_low` var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; b[i++] = tl >>> 24 & 0xff; b[i++] = tl >>> 16 & 0xff; b[i++] = tl >>> 8 & 0xff; b[i++] = tl & 0xff; // `time_mid` var tmh = msecs / 0x100000000 * 10000 & 0xfffffff; b[i++] = tmh >>> 8 & 0xff; b[i++] = tmh & 0xff; // `time_high_and_version` b[i++] = tmh >>> 24 & 0xf | 0x10; // include version b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` b[i++] = clockseq & 0xff; // `node` for (var n = 0; n < 6; ++n) { b[i + n] = node[n]; } return buf ? buf : (0, _bytesToUuid.default)(b); } var _default = v1; exports.default = _default; module.exports = exports.default; }); var v35 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = _default; exports.URL = exports.DNS = void 0; var _bytesToUuid = _interopRequireDefault(bytesToUuid_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function uuidToBytes(uuid) { // Note: We assume we're being passed a valid uuid string var bytes = []; uuid.replace(/[a-fA-F0-9]{2}/g, function (hex) { bytes.push(parseInt(hex, 16)); }); return bytes; } function stringToBytes(str) { str = unescape(encodeURIComponent(str)); // UTF8 escape var bytes = new Array(str.length); for (var i = 0; i < str.length; i++) { bytes[i] = str.charCodeAt(i); } return bytes; } const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; exports.DNS = DNS; const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; exports.URL = URL; function _default(name, version, hashfunc) { var generateUUID = function (value, namespace, buf, offset) { var off = buf && offset || 0; if (typeof value == 'string') value = stringToBytes(value); if (typeof namespace == 'string') namespace = uuidToBytes(namespace); if (!Array.isArray(value)) throw TypeError('value must be an array of bytes'); if (!Array.isArray(namespace) || namespace.length !== 16) throw TypeError('namespace must be uuid string or an Array of 16 byte values'); // Per 4.3 var bytes = hashfunc(namespace.concat(value)); bytes[6] = bytes[6] & 0x0f | version; bytes[8] = bytes[8] & 0x3f | 0x80; if (buf) { for (var idx = 0; idx < 16; ++idx) { buf[off + idx] = bytes[idx]; } } return buf || (0, _bytesToUuid.default)(bytes); }; // Function#name is not settable on some platforms (#270) try { generateUUID.name = name; } catch (err) {} // For CommonJS default export support generateUUID.DNS = DNS; generateUUID.URL = URL; return generateUUID; } }); var md5_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _crypto = _interopRequireDefault(require$$0__default['default']); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function md5(bytes) { if (Array.isArray(bytes)) { bytes = Buffer.from(bytes); } else if (typeof bytes === 'string') { bytes = Buffer.from(bytes, 'utf8'); } return _crypto.default.createHash('md5').update(bytes).digest(); } var _default = md5; exports.default = _default; module.exports = exports.default; }); var v3_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _v = _interopRequireDefault(v35); var _md = _interopRequireDefault(md5_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const v3 = (0, _v.default)('v3', 0x30, _md.default); var _default = v3; exports.default = _default; module.exports = exports.default; }); var v4_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _rng = _interopRequireDefault(rng_1); var _bytesToUuid = _interopRequireDefault(bytesToUuid_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function v4(options, buf, offset) { var i = buf && offset || 0; if (typeof options == 'string') { buf = options === 'binary' ? new Array(16) : null; options = null; } options = options || {}; var rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` rnds[6] = rnds[6] & 0x0f | 0x40; rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided if (buf) { for (var ii = 0; ii < 16; ++ii) { buf[i + ii] = rnds[ii]; } } return buf || (0, _bytesToUuid.default)(rnds); } var _default = v4; exports.default = _default; module.exports = exports.default; }); var sha1_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _crypto = _interopRequireDefault(require$$0__default['default']); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function sha1(bytes) { if (Array.isArray(bytes)) { bytes = Buffer.from(bytes); } else if (typeof bytes === 'string') { bytes = Buffer.from(bytes, 'utf8'); } return _crypto.default.createHash('sha1').update(bytes).digest(); } var _default = sha1; exports.default = _default; module.exports = exports.default; }); var v5_1 = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _v = _interopRequireDefault(v35); var _sha = _interopRequireDefault(sha1_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const v5 = (0, _v.default)('v5', 0x50, _sha.default); var _default = v5; exports.default = _default; module.exports = exports.default; }); var dist = createCommonjsModule(function (module, exports) { Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "v1", { enumerable: true, get: function () { return _v.default; } }); Object.defineProperty(exports, "v3", { enumerable: true, get: function () { return _v2.default; } }); Object.defineProperty(exports, "v4", { enumerable: true, get: function () { return _v3.default; } }); Object.defineProperty(exports, "v5", { enumerable: true, get: function () { return _v4.default; } }); var _v = _interopRequireDefault(v1_1); var _v2 = _interopRequireDefault(v3_1); var _v3 = _interopRequireDefault(v4_1); var _v4 = _interopRequireDefault(v5_1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } }); /** * vis-data * http://visjs.org/ * * Manage unstructured data using DataSet. Add, update, and remove data, and listen for changes in the data. * * @version 7.1.2 * @date 2021-01-08T20:37:11.601Z * * @copyright (c) 2011-2017 Almende B.V, http://almende.com * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs * * @license * vis.js is dual licensed under both * * 1. The Apache 2.0 License * http://www.apache.org/licenses/LICENSE-2.0 * * and * * 2. The MIT License * http://opensource.org/licenses/MIT * * vis.js may be distributed under either license. */ /** * Create new data pipe. * * @param from - The source data set or data view. * * @remarks * Example usage: * ```typescript * interface AppItem { * whoami: string; * appData: unknown; * visData: VisItem; * } * interface VisItem { * id: number; * label: string; * color: string; * x: number; * y: number; * } * * const ds1 = new DataSet<AppItem, "whoami">([], { fieldId: "whoami" }); * const ds2 = new DataSet<VisItem, "id">(); * * const pipe = createNewDataPipeFrom(ds1) * .filter((item): boolean => item.enabled === true) * .map<VisItem, "id">((item): VisItem => item.visData) * .to(ds2); * * pipe.start(); * ``` * * @returns A factory whose methods can be used to configure the pipe. */ function createNewDataPipeFrom(from) { return new DataPipeUnderConstruction(from); } /** * Internal implementation of the pipe. This should be accessible only through * `createNewDataPipeFrom` from the outside. * * @typeParam SI - Source item type. * @typeParam SP - Source item type's id property name. * @typeParam TI - Target item type. * @typeParam TP - Target item type's id property name. */ class SimpleDataPipe { /** * Create a new data pipe. * * @param _source - The data set or data view that will be observed. * @param _transformers - An array of transforming functions to be used to * filter or transform the items in the pipe. * @param _target - The data set or data view that will receive the items. */ constructor(_source, _transformers, _target) { this._source = _source; this._transformers = _transformers; this._target = _target; /** * Bound listeners for use with `DataInterface['on' | 'off']`. */ this._listeners = { add: this._add.bind(this), remove: this._remove.bind(this), update: this._update.bind(this), }; } /** @inheritDoc */ all() { this._target.update(this._transformItems(this._source.get())); return this; } /** @inheritDoc */ start() { this._source.on("add", this._listeners.add); this._source.on("remove", this._listeners.remove); this._source.on("update", this._listeners.update); return this; } /** @inheritDoc */ stop() { this._source.off("add", this._listeners.add); this._source.off("remove", this._listeners.remove); this._source.off("update", this._listeners.update); return this; } /** * Apply the transformers to the items. * * @param items - The items to be transformed. * * @returns The transformed items. */ _transformItems(items) { return this._transformers.reduce((items, transform) => { return transform(items); }, items); } /** * Handle an add event. * * @param _name - Ignored. * @param payload - The payload containing the ids of the added items. */ _add(_name, payload) { if (payload == null) { return; } this._target.add(this._transformItems(this._source.get(payload.items))); } /** * Handle an update event. * * @param _name - Ignored. * @param payload - The payload containing the ids of the updated items. */ _update(_name, payload) { if (payload == null) { return; } this._target.update(this._transformItems(this._source.get(payload.items))); } /** * Handle a remove event. * * @param _name - Ignored. * @param payload - The payload containing the data of the removed items. */ _remove(_name, payload) { if (payload == null) { return; } this._target.remove(this._transformItems(payload.oldData)); } } /** * Internal implementation of the pipe factory. This should be accessible * only through `createNewDataPipeFrom` from the outside. * * @typeParam TI - Target item type. * @typeParam TP - Target item type's id property name. */ class DataPipeUnderConstruction { /** * Create a new data pipe factory. This is an internal constructor that * should never be called from outside of this file. * * @param _source - The source data set or data view for this pipe. */ constructor(_source) { this._source = _source; /** * Array transformers used to transform items within the pipe. This is typed * as any for the sake of simplicity. */ this._transformers = []; } /** * Filter the items. * * @param callback - A filtering function that returns true if given item * should be piped and false if not. * * @returns This factory for further configuration. */ filter(callback) { this._transformers.push((input) => input.filter(callback)); return this; } /** * Map each source item to a new type. * * @param callback - A mapping function that takes a source item and returns * corresponding mapped item. * * @typeParam TI - Target item type. * @typeParam TP - Target item type's id property name. * * @returns This factory for further configuration. */ map(callback) { this._transformers.push((input) => input.map(callback)); return this; } /** * Map each source item to zero or more items of a new type. * * @param callback - A mapping function that takes a source item and returns * an array of corresponding mapped items. * * @typeParam TI - Target item type. * @typeParam TP - Target item type's id property name. * * @returns This factory for further configuration. */ flatMap(callback) { this._transformers.push((input) => input.flatMap(callback)); return this; } /** * Connect this pipe to given data set. * * @param target - The data set that will receive the items from this pipe. * * @returns The pipe connected between given data sets and performing * configured transformation on the processed items. */ to(target) { return new SimpleDataPipe(this._source, this._transformers, target); } } /** * Determine whether a value can be used as an id. * * @param value - Input value of unknown type. * * @returns True if the value is valid id, false otherwise. */ function isId(value) { return typeof value === "string" || typeof value === "number"; } /** * A queue. * * @typeParam T - The type of method names to be replaced by queued versions. */ class Queue { /** * Construct a new Queue. * * @param options - Queue configuration. */ constructor(options) { this._queue = []; this._timeout = null; this._extended = null; // options this.delay = null; this.max = Infinity; this.setOptions(options); } /** * Update the configuration of the queue. * * @param options - Queue configuration. */ setOptions(options) { if (options && typeof options.delay !== "undefined") { this.delay = options.delay; } if (options && typeof options.max !== "undefined") { this.max = options.max; } this._flushIfNeeded(); } /** * Extend an object with queuing functionality. * The object will be extended with a function flush, and the methods provided in options.replace will be replaced with queued ones. * * @param object - The object to be extended. * @param options - Additional options. * * @returns The created queue. */ static extend(object, options) { const queue = new Queue(options); if (object.flush !== undefined) { throw new Error("Target object already has a property flush"); } object.flush = () => { queue.flush(); }; const methods = [ { name: "flush", original: undefined, }, ]; if (options && options.replace) { for (let i = 0; i < options.replace.length; i++) { const name = options.replace[i]; methods.push({ name: name, // @TODO: better solution? original: object[name], }); // @TODO: better solution? queue.replace(object, name); } } queue._extended = { object: object, methods: methods, }; return queue; } /** * Destroy the queue. The queue will first flush all queued actions, and in case it has extended an object, will restore the original object. */ destroy() { this.flush(); if (this._extended) { const object = this._extended.object; const methods = this._extended.methods; for (let i = 0; i < methods.length; i++) { const method = methods[i]; if (method.original) { // @TODO: better solution? object[method.name] = method.original; } else { // @TODO: better solution? delete object[method.name]; } } this._extended = null; } } /** * Replace a method on an object with a queued version. * * @param object - Object having the method. * @param method - The method name. */ replace(object, method) { /* eslint-disable-next-line @typescript-eslint/no-this-alias -- Function this is necessary in the function bellow, so class this has to be saved into a variable here. */ const me = this; const original = object[method]; if (!original) { throw new Error("Method " + method + " undefined"); } object[method] = function (...args) { // add this call to the queue me.queue({ args: args, fn: original, context: this, }); }; } /** * Queue a call. * * @param entry - The function or entry to be queued. */ queue(entry) { if (typeof entry === "function") { this._queue.push({ fn: entry }); } else { this._queue.push(entry); } this._flushIfNeeded(); } /** * Check whether the queue needs to be flushed. */ _flushIfNeeded() { // flush when the maximum is exceeded. if (this._queue.length > this.max) { this.flush(); } // flush after a period of inactivity when a delay is configured if (this._timeout != null) { clearTimeout(this._timeout); this._timeout = null; } if (this.queue.length > 0 && typeof this.delay === "number") { this._timeout = setTimeout(() => { this.flush(); }, this.delay); } } /** * Flush all queued calls */ flush() { this._queue.splice(0).forEach((entry) => { entry.fn.apply(entry.context || entry.fn, entry.args || []); }); } } /** * [[DataSet]] code that can be reused in [[DataView]] or other similar implementations of [[DataInterface]]. * * @typeParam Item - Item type that may or may not have an id. * @typeParam IdProp - Name of the property that contains the id. */ class DataSetPart { constructor() { this._subscribers = { "*": [], add: [], remove: [], update: [], }; /** * @deprecated Use on instead (PS: DataView.subscribe === DataView.on). */ this.subscribe = DataSetPart.prototype.on; /** * @deprecated Use off instead (PS: DataView.unsubscribe === DataView.off). */ this.unsubscribe = DataSetPart.prototype.off; } /** * Trigger an event * * @param event - Event name. * @param payload - Event payload. * @param senderId - Id of the sender. */ _trigger(event, payload, senderId) { if (event === "*") { throw new Error("Cannot trigger event *"); } [...this._subscribers[event], ...this._subscribers["*"]].forEach((subscriber) => { subscriber(event, payload, senderId != null ? senderId : null); }); } /** * Subscribe to an event, add an event listener. * * @remarks Non-function callbacks are ignored. * * @param event - Event name. * @param callback - Callback method. */ on(event, callback) { if (typeof callback === "function") { this._subscribers[event].push(callback); } // @TODO: Maybe throw for invalid callbacks? } /** * Unsubscribe from an event, remove an event listener. * * @remarks If the same callback was subscribed more than once **all** occurences will be removed. * * @param event - Event name. * @param callback - Callback method. */ off(event, callback) { this._subscribers[event] = this._subscribers[event].filter((subscriber) => subscriber !== callback); } } /** * Data stream * * @remarks * [[DataStream]] offers an always up to date stream of items from a [[DataSet]] or [[DataView]]. * That means that the stream is evaluated at the time of iteration, conversion to another data type or when [[cache]] is called, not when the [[DataStream]] was created. * Multiple invocations of for example [[toItemArray]] may yield different results (if the data source like for example [[DataSet]] gets modified). * * @typeParam Item - The item type this stream is going to work with. */ class DataStream { /** * Create a new data stream. * * @param pairs - The id, item pairs. */ constructor(pairs) { this._pairs = pairs; } /** * Return an iterable of key, value pairs for every entry in the stream. */ *[Symbol.iterator]() { for (const [id, item] of this._pairs) { yield [id, item]; } } /** * Return an iterable of key, value pairs for every entry in the stream. */ *entries() { for (const [id, item] of this._pairs) { yield [id, item]; } } /** * Return an iterable of keys in the stream. */ *keys() { for (const [id] of this._pairs) { yield id; } } /** * Return an iterable of values in the stream. */ *values() { for (const [, item] of this._pairs) { yield item; } } /** * Return an array containing all the ids in this stream. * * @remarks * The array may contain duplicities. * * @returns The array with all ids from this stream. */ toIdArray() { return [...this._pairs].map((pair) => pair[0]); } /** * Return an array containing all the items in this stream. * * @remarks * The array may contain duplicities. * * @returns The array with all items from this stream. */ toItemArray() { return [...this._pairs].map((pair) => pair[1]); } /** * Return an array containing all the entries in this stream. * * @remarks * The array may contain duplicities. * * @returns The array with all entries from this stream. */ toEntryArray() { return [...this._pairs]; } /** * Return an object map containing all the items in this stream accessible by ids. * * @remarks * In case of duplicate ids (coerced to string so `7 == '7'`) the last encoutered appears in the returned object. * * @returns The object map of all id → item pairs from this stream. */ toObjectMap() { const map = Object.create(null); for (const [id, item] of this._pairs) { map[id] = item; } return map; } /** * Return a map containing all the items in this stream accessible by ids. * * @returns The map of all id → item pairs from this stream. */ toMap() { return new Map(this._pairs); } /** * Return a set containing all the (unique) ids in this stream. * * @returns The set of all ids from this stream. */ toIdSet() { return new Set(this.toIdArray()); } /** * Return a set containing all the (unique) items in this stream. * * @returns The set of all items from this stream. */ toItemSet() { return new Set(this.toItemArray()); } /** * Cache the items from this stream. * * @remarks * This method allows for items to be fetched immediatelly and used (possibly multiple times) later. * It can also be used to optimize performance as [[DataStream]] would otherwise reevaluate everything upon each iteration. * * ## Example * ```javascript * const ds = new DataSet([…]) * * const cachedStream = ds.stream() * .filter(…) * .sort(…) * .map(…) * .cached(…) // Data are fetched, processed and cached here. * * ds.clear() * chachedStream // Still has all the items. * ``` * * @returns A new [[DataStream]] with cached items (detached from the original [[DataSet]]). */ cache() { return new DataStream([...this._pairs]); } /** * Get the distinct values of given property. * * @param callback - The function that picks and possibly converts the property. * * @typeParam T - The type of the distinct value. * * @returns A set of all distinct properties. */ distinct(callback) { const set = new Set(); for (const [id, item] of this._pairs) { set.add(callback(item, id)); } return set; } /** * Filter the items of the stream. * * @param callback - The function that decides whether an item will be included. * * @returns A new data stream with the filtered items. */ filter(callback) { const pairs = this._pairs; return new DataStream({ *[Symbol.iterator]() { for (const [id, item] of pairs) { if (callback(item, id)) { yield [id, item]; } } }, }); } /** * Execute a callback for each item of the stream. * * @param callback - The function that will be invoked for each item. */ forEach(callback) { for (const [id, item] of this._pairs) { callback(item, id); } } /** * Map the items into a different type. * * @param callback - The function that does the conversion. * * @typeParam Mapped - The type of the item after mapping. * * @returns A new data stream with the mapped items. */ map(callback) { const pairs = this._pairs; return new DataStream({ *[Symbol.iterator]() { for (const [id, item] of pairs) { yield [id, callback(item, id)]; } }, }); } /** * Get the item with the maximum value of given property. * * @param callback - The function that picks and possibly converts the property. * * @returns The item with the maximum if found otherwise null. */ max(callback) { const iter = this._pairs[Symbol.iterator](); let curr = iter.next(); if (curr.done) { return null; } let maxItem = curr.value[1]; let maxValue = callback(curr.value[1], curr.value[0]); while (!(curr = iter.next()).done) { const [id, item] = curr.value; const value = callback(item, id); if (value > maxValue) { maxValue = value; maxItem = item; } } return maxItem; } /** * Get the item with the minimum value of given property. * * @param callback - The function that picks and possibly converts the property. * * @returns The item with the minimum if found otherwise null. */ min(callback) { const iter = this._pairs[Symbol.iterator](); let curr = iter.next(); if (curr.done) { return null; } let minItem = curr.value[1]; let minValue = callback(curr.value[1], curr.value[0]); while (!(curr = iter.next()).done) { const [id, item] = curr.value; const value = callback(item, id); if (value < minValue) { minValue = value; minItem = item; } } return minItem; } /** * Reduce the items into a single value. * * @param callback - The function that does the reduction. * @param accumulator - The initial value of the accumulator. * * @typeParam T - The type of the accumulated value. * * @returns The reduced value. */ reduce(callback, accumulator) { for (const [id, item] of this._pairs) { accumulator = callback(accumulator, item, id); } return accumulator; } /** * Sort the items. * * @param callback - Item comparator. * * @returns A new stream with sorted items. */ sort(callback) { return new DataStream({ [Symbol.iterator]: () => [...this._pairs] .sort(([idA, itemA], [idB, itemB]) => callback(itemA, itemB, idA, idB))[Symbol.iterator](), }); } } /** * Add an id to given item if it doesn't have one already. * * @remarks * The item will be modified. * * @param item - The item that will have an id after a call to this function. * @param idProp - The key of the id property. * * @typeParam Item - Item type that may or may not have an id. * @typeParam IdProp - Name of the property that contains the id. * * @returns true */ function ensureFullItem(item, idProp) { if (item[idProp] == null) { // generate an id item[idProp] = dist.v4(); } return item; } /** * # DataSet * * Vis.js comes with a flexible DataSet, which can be used to hold and * manipulate unstructured data and listen for changes in the data. The DataSet * is key/value based. Data items can be added, updated and removed from the * DataSet, and one can subscribe to changes in the DataSet. The data in the * DataSet can be filtered and ordered. Data can be normalized when appending it * to the DataSet as well. * * ## Example * * The following example shows how to use a DataSet. * * ```javascript * // create a DataSet * var options = {}; * var data = new vis.DataSet(options); * * // add items * // note that the data items can contain different properties and data formats * data.add([ * {id: 1, text: 'item 1', date: new Date(2013, 6, 20), group: 1, first: true}, * {id: 2, text: 'item 2', date: '2013-06-23', group: 2}, * {id: 3, text: 'item 3', date: '2013-06-25', group: 2}, * {id: 4, text: 'item 4'} * ]); * * // subscribe to any change in the DataSet * data.on('*', function (event, properties, senderId) { * console.log('event', event, properties); * }); * * // update an existing item * data.update({id: 2, group: 1}); * * // remove an item * data.remove(4); * * // get all ids * var ids = data.getIds(); * console.log('ids', ids); * * // get a specific item * var item1 = data.get(1); * console.log('item1', item1); * * // retrieve a filtered subset of the data * var items = data.get({ * filter: function (item) { * return item.group == 1; * } * }); * console.log('filtered items', items); * ``` * * @typeParam Item - Item type that may or may not have an id. * @typeParam IdProp - Name of the property that contains the id. */ class DataSet extends DataSetPart { /** * Construct a new DataSet. * * @param data - Initial data or options. * @param options - Options (type error if data is also options). */ constructor(data, options) { super(); this._queue = null; // correctly read optional arguments if (data && !Array.isArray(data)) { options = data; data = []; } this._options = options || {}; this._data = new Map(); // map with data indexed by id this.length = 0; // number of items in the DataSet this._idProp = this._options.fieldId || "id"; // name of the field containing id // add initial data when provided if (data && data.length) { this.add(data); } this.setOptions(options); } /** @inheritDoc */ get idProp() { return this._idProp; } /** * Set new options. * * @param options - The new options. */ setOptions(options) { if (options && options.queue !== undefined) { if (options.queue === false) { // delete queue if loaded if (this._queue) { this._queue.destroy(); this._queue = null; } } else { // create queue and update its options if (!this._queue) { this._queue = Queue.extend(this, { replace: ["add", "update", "remove"], }); } if (options.queue && typeof options.queue === "object") { this._queue.setOptions(options.queue); } } } } /** * Add a data item or an array with items. * * After the items are added to the DataSet, the DataSet will trigger an event `add`. When a `senderId` is provided, this id will be passed with the triggered event to all subscribers. * * ## Example * * ```javascript * // create a DataSet * const data = new vis.DataSet() * * // add items * const ids = data.add([ * { id: 1, text: 'item 1' }, * { id: 2, text: 'item 2' }, * { text: 'item without an id' } * ]) * * console.log(ids) // [1, 2, '<UUIDv4>'] * ``` * * @param data - Items to be added (ids will be generated if missing). * @param senderId - Sender id. * * @returns addedIds - Array with the ids (generated if not present) of the added items. * * @throws When an item with the same id as any of the added items already exists. */ add(data, senderId) { const addedIds = []; let id; if (Array.isArray(data)) { // Array const idsToAdd = data.map((d) => d[this._idProp]); if (idsToAdd.some((id) => this._data.has(id))) { throw new Error("A duplicate id was found in the parameter array."); } for (let i = 0, len = data.length; i < len; i++) { id = this._addItem(data[i]); addedIds.push(id); } } else if (data && typeof data === "object") { // Single item id = this._addItem(data); addedIds.push(id); } else { throw new Error("Unknown dataType"); } if (addedIds.length) { this._trigger("add", { items: addedIds }, senderId); } return addedIds; } /** * Update existing items. When an item does not exist, it will be created. * * @remarks * The provided properties will be merged in the existing item. When an item does not exist, it will be created. * * After the items are updated, the DataSet will trigger an event `add` for the added items, and an event `update`. When a `senderId` is provided, this id will be passed with the triggered event to all subscribers. * * ## Example * * ```javascript * // create a DataSet * const data = new vis.DataSet([ * { id: 1, text: 'item 1' }, * { id: 2, text: 'item 2' }, * { id: 3, text: 'item 3' } * ]) * * // update items * const ids = data.update([ * { id: 2, text: 'item 2 (updated)' }, * { id: 4, text: 'item 4 (new)' } * ]) * * console.log(ids) // [2, 4] * ``` * * ## Warning for TypeScript users * This method may introduce partial items into the data set. Use add or updateOnly instead for better type safety. * * @param data - Items to be updated (if the id is already present) or added (if the id is missing). * @param senderId - Sender id. * * @returns updatedIds - The ids of the added (these may be newly generated if there was no id in the item from the data) or updated items. * * @throws When the supplied data is neither an item nor an array of items. */ update(data, senderId) { const addedIds = []; const updatedIds = []; const oldData = []; const updatedData = []; const idProp = this._idProp; const addOrUpdate = (item) => { const origId = item[idProp]; if (origId != null && this._data.has(origId)) { const fullItem = item; // it has an id, therefore it is a fullitem const oldItem = Object.assign({}, this._data.get(origId)); // update item const id = this._updateItem(fullItem); updatedIds.push(id); updatedData.push(fullItem); oldData.push(oldItem); } else { // add new item const id = this._addItem(item); addedIds.push(id); } }; if (Array.isArray(data)) { // Array for (let i = 0, len = data.length; i < len; i++) { if (data[i] && typeof data[i] === "object") { addOrUpdate(data[i]); } else { console.warn("Ignoring input item, which is not an object at index " + i); } } } else if (data && typeof data === "object") { // Single item addOrUpdate(data); } else { throw new Error("Unknown dataType"); } if (addedIds.length) { this._trigger("add", { items: addedIds }, senderId); } if (updatedIds.length) { const props = { items: updatedIds, oldData: oldData, data: updatedData }; // TODO: remove deprecated property 'data' some day //Object.defineProperty(props, 'data', { // 'get': (function() { // console.warn('Property data is deprecated. Use DataSet.get(ids) to retrieve the new data, use the oldData property on this object to get the old data'); // return updatedData; // }).bind(this) //}); this._trigger("update", props, senderId); } return addedIds.concat(updatedIds); } /** * Update existing items. When an item does not exist, an error will be thrown. * * @remarks * The provided properties will be deeply merged into the existing item. * When an item does not exist (id not present in the data set or absent), an error will be thrown and nothing will be changed. * * After the items are updated, the DataSet will trigger an event `update`. * When a `senderId` is provided, this id will be passed with the triggered event to all subscribers. * * ## Example * * ```javascript * // create a DataSet * const data = new vis.DataSet([ * { id: 1, text: 'item 1' }, * { id: 2, text: 'item 2' }, * { id: 3, text: 'item 3' }, * ]) * * // update items * const ids = data.update([ * { id: 2, text: 'item 2 (updated)' }, // works * // { id: 4, text: 'item 4 (new)' }, // would throw * // { text: 'item 4 (new)' }, // would also throw * ]) * * console.log(ids) // [2] * ``` * * @param data - Updates (the id and optionally other props) to the items in this data set. * @param senderId - Sender id. * * @returns updatedIds - The ids of the updated items. * * @throws When the supplied data is neither an item nor an array of items, when the ids are missing. */ updateOnly(data, senderId) { if (!Array.isArray(data)) { data = [data]; } const updateEventData = data .map((update) => { const oldData = this._data.get(update[this._idProp]); if (oldData == null) { throw new Error("Updating non-existent items is not allowed."); } return { oldData, update }; }) .map(({ oldData, update }) => { const id = oldData[this._idProp]; const updatedData = pureDeepObjectAssign(oldData, update); this._data.set(id, updatedData); return { id, oldData: oldData, updatedData, }; }); if (updateEventData.length) { const props = { items: updateEventData.map((value) => value.id), oldData: updateEventData.map((value) => value.oldData), data: updateEventData.map((value) => value.updatedData), }; // TODO: remove deprecated property 'data' some day //Object.defineProperty(props, 'data', { // 'get': (function() { // console.warn('Property data is deprecated. Use DataSet.get(ids) to retrieve the new data, use the oldData property on this object to get the old data'); // return updatedData; // }).bind(this) //}); this._trigger("update", props, senderId); return props.items; } else { return []; } } /** @inheritDoc */ get(first, second) { // @TODO: Woudn't it be better to split this into multiple methods? // parse the arguments let id = undefined; let ids = undefined; let options = undefined; if (isId(first)) { // get(id [, options]) id = first; options = second; } else if (Array.isArray(first)) { // get(ids [, options]) ids = first; options = second; } else { // get([, options]) options = first; } // determine the return type const returnType = options && options.returnType === "Object" ? "Object" : "Array"; // @TODO: WTF is this? Or am I missing something? // var returnType // if (options && options.returnType) { // var allowedValues = ['Array', 'Object'] // returnType = // allowedValues.indexOf(options.returnType) == -1 // ? 'Array' // : options.returnType // } else { // returnType = 'Array' // } // build options const filter = options && options.filter; const items = []; let item = undefined; let itemIds = undefined; let itemId = undefined; // convert items if (id != null) { // return a single item item = this._data.get(id); if (item && filter && !filter(item)) { item = undefined; } } else if (ids != null) { // return a subset of items for (let i = 0, len = ids.length; i < len; i++) { item = this._data.get(ids[i]); if (item != null && (!filter || filter(item))) { items.push(item); } } } else { // return all items itemIds = [...this._data.keys()]; for (let i = 0, len = itemIds.length; i < len; i++) { itemId = itemIds[i]; item = this._data.get(itemId); if (item != null && (!filter || filter(item))) { items.push(item); } } } // order the results if (options && options.order && id == undefined) { this._sort(items, options.order); } // filter fields of the items if (options && options.fields) { const fields = options.fields; if (id != undefined && item != null) { item = this._filterFields(item, fields); } else { for (let i = 0, len = items.length; i < len; i++) { items[i] = this._filterFields(items[i], fields); } } } // return the results if (returnType == "Object") { const result = {}; for (let i = 0, len = items.length; i < len; i++) { const resultant = items[i]; // @TODO: Shoudn't this be this._fieldId? // result[resultant.id] = resultant const id = resultant[this._idProp]; result[id] = resultant; } return result; } else { if (id != null) { // a single item return item ?? null; } else { // just return our array return items; } } } /** @inheritDoc */ getIds(options) { const data = this._data; const filter = options && options.filter; const order = options && options.order; const itemIds = [...data.keys()]; const ids = []; if (filter) { // get filtered items if (order) { // create ordered list const items = []; for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = this._data.get(id); if (item != null && filter(item)) { items.push(item); } } this._sort(items, order); for (let i = 0, len = items.length; i < len; i++) { ids.push(items[i][this._idProp]); } } else { // create unordered list for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = this._data.get(id); if (item != null && filter(item)) { ids.push(item[this._idProp]); } } } } else { // get all items if (order) { // create an ordered list const items = []; for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; items.push(data.get(id)); } this._sort(items, order); for (let i = 0, len = items.length; i < len; i++) { ids.push(items[i][this._idProp]); } } else { // create unordered list for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = data.get(id); if (item != null) { ids.push(item[this._idProp]); } } } } return ids; } /** @inheritDoc */ getDataSet() { return this; } /** @inheritDoc */ forEach(callback, options) { const filter = options && options.filter; const data = this._data; const itemIds = [...data.keys()]; if (options && options.order) { // execute forEach on ordered list const items = this.get(options); for (let i = 0, len = items.length; i < len; i++) { const item = items[i]; const id = item[this._idProp]; callback(item, id); } } else { // unordered for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = this._data.get(id); if (item != null && (!filter || filter(item))) { callback(item, id); } } } } /** @inheritDoc */ map(callback, options) { const filter = options && options.filter; const mappedItems = []; const data = this._data; const itemIds = [...data.keys()]; // convert and filter items for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = this._data.get(id); if (item != null && (!filter || filter(item))) { mappedItems.push(callback(item, id)); } } // order items if (options && options.order) { this._sort(mappedItems, options.order); } return mappedItems; } /** * Filter the fields of an item. * * @param item - The item whose fields should be filtered. * @param fields - The names of the fields that will be kept. * * @typeParam K - Field name type. * * @returns The item without any additional fields. */ _filterFields(item, fields) { if (!item) { // item is null return item; } return (Array.isArray(fields) ? // Use the supplied array fields : // Use the keys of the supplied object Object.keys(fields)).reduce((filteredItem, field) => { filteredItem[field] = item[field]; return filteredItem; }, {}); } /** * Sort the provided array with items. * * @param items - Items to be sorted in place. * @param order - A field name or custom sort function. * * @typeParam T - The type of the items in the items array. */ _sort(items, order) { if (typeof order === "string") { // order by provided field name const name = order; // field name items.sort((a, b) => { // @TODO: How to treat missing properties? const av = a[name]; const bv = b[name]; return av > bv ? 1 : av < bv ? -1 : 0; }); } else if (typeof order === "function") { // order by sort function items.sort(order); } else { // TODO: extend order by an Object {field:string, direction:string} // where direction can be 'asc' or 'desc' throw new TypeError("Order must be a function or a string"); } } /** * Remove an item or multiple items by “reference” (only the id is used) or by id. * * The method ignores removal of non-existing items, and returns an array containing the ids of the items which are actually removed from the DataSet. * * After the items are removed, the DataSet will trigger an event `remove` for the removed items. When a `senderId` is provided, this id will be passed with the triggered event to all subscribers. * * ## Example * ```javascript * // create a DataSet * const data = new vis.DataSet([ * { id: 1, text: 'item 1' }, * { id: 2, text: 'item 2' }, * { id: 3, text: 'item 3' } * ]) * * // remove items * const ids = data.remove([2, { id: 3 }, 4]) * * console.log(ids) // [2, 3] * ``` * * @param id - One or more items or ids of items to be removed. * @param senderId - Sender id. * * @returns The ids of the removed items. */ remove(id, senderId) { const removedIds = []; const removedItems = []; // force everything to be an array for simplicity const ids = Array.isArray(id) ? id : [id]; for (let i = 0, len = ids.length; i < len; i++) { const item = this._remove(ids[i]); if (item) { const itemId = item[this._idProp]; if (itemId != null) { removedIds.push(itemId); removedItems.push(item); } } } if (removedIds.length) { this._trigger("remove", { items: removedIds, oldData: removedItems }, senderId); } return removedIds; } /** * Remove an item by its id or reference. * * @param id - Id of an item or the item itself. * * @returns The removed item if removed, null otherwise. */ _remove(id) { // @TODO: It origianlly returned the item although the docs say id. // The code expects the item, so probably an error in the docs. let ident; // confirm the id to use based on the args type if (isId(id)) { ident = id; } else if (id && typeof id === "object") { ident = id[this._idProp]; // look for the identifier field using ._idProp } // do the removing if the item is found if (ident != null && this._data.has(ident)) { const item = this._data.get(ident) || null; this._data.delete(ident); --this.length; return item; } return null; } /** * Clear the entire data set. * * After the items are removed, the [[DataSet]] will trigger an event `remove` for all removed items. When a `senderId` is provided, this id will be passed with the triggered event to all subscribers. * * @param senderId - Sender id. * * @returns removedIds - The ids of all removed items. */ clear(senderId) { const ids = [...this._data.keys()]; const items = []; for (let i = 0, len = ids.length; i < len; i++) { items.push(this._data.get(ids[i])); } this._data.clear(); this.length = 0; this._trigger("remove", { items: ids, oldData: items }, senderId); return ids; } /** * Find the item with maximum value of a specified field. * * @param field - Name of the property that should be searched for max value. * * @returns Item containing max value, or null if no items. */ max(field) { let max = null; let maxField = null; for (const item of this._data.values()) { const itemField = item[field]; if (typeof itemField === "number" && (maxField == null || itemField > maxField)) { max = item; maxField = itemField; } } return max || null; } /** * Find the item with minimum value of a specified field. * * @param field - Name of the property that should be searched for min value. * * @returns Item containing min value, or null if no items. */ min(field) { let min = null; let minField = null; for (const item of this._data.values()) { const itemField = item[field]; if (typeof itemField === "number" && (minField == null || itemField < minField)) { min = item; minField = itemField; } } return min || null; } /** * Find all distinct values of a specified field * * @param prop - The property name whose distinct values should be returned. * * @returns Unordered array containing all distinct values. Items without specified property are ignored. */ distinct(prop) { const data = this._data; const itemIds = [...data.keys()]; const values = []; let count = 0; for (let i = 0, len = itemIds.length; i < len; i++) { const id = itemIds[i]; const item = data.get(id); const value = item[prop]; let exists = false; for (let j = 0; j < count; j++) { if (values[j] == value) { exists = true; break; } } if (!exists && value !== undefined) { values[count] = value; count++; } } return values; } /** * Add a single item. Will fail when an item with the same id already exists. * * @param item - A new item to be added. * * @returns Added item's id. An id is generated when it is not present in the item. */ _addItem(item) { const fullItem = ensureFullItem(item, this._idProp); const id = fullItem[this._idProp]; // check whether this id is already taken if (this._data.has(id)) { // item already exists throw new Error("Cannot add item: item with id " + id + " already exists"); } this._data.set(id, fullItem); ++this.length; return id; } /** * Update a single item: merge with existing item. * Will fail when the item has no id, or when there does not exist an item with the same id. * * @param update - The new item * * @returns The id of the updated item. */ _updateItem(update) { const id = update[this._idProp]; if (id == null) { throw new Error("Cannot update item: item has no id (item: " + JSON.stringify(update) + ")"); } const item = this._data.get(id); if (!item) { // item doesn't exist throw new Error("Cannot update item: no item with id " + id + " found"); } this._data.set(id, { ...item, ...update }); return id; } /** @inheritDoc */ stream(ids) { if (ids) { const data = this._data; return new DataStream({ *[Symbol.iterator]() { for (const id of ids) { const item = data.get(id); if (item != null) { yield [id, item]; } } }, }); } else { return new DataStream({ [Symbol.iterator]: this._data.entries.bind(this._data), }); } } } /** * DataView * * A DataView offers a filtered and/or formatted view on a DataSet. One can subscribe to changes in a DataView, and easily get filtered or formatted data without having to specify filters and field types all the time. * * ## Example * ```javascript * // create a DataSet * var data = new vis.DataSet(); * data.add([ * {id: 1, text: 'item 1', date: new Date(2013, 6, 20), group: 1, first: true}, * {id: 2, text: 'item 2', date: '2013-06-23', group: 2}, * {id: 3, text: 'item 3', date: '2013-06-25', group: 2}, * {id: 4, text: 'item 4'} * ]); * * // create a DataView * // the view will only contain items having a property group with value 1, * // and will only output fields id, text, and date. * var view = new vis.DataView(data, { * filter: function (item) { * return (item.group == 1); * }, * fields: ['id', 'text', 'date'] * }); * * // subscribe to any change in the DataView * view.on('*', function (event, properties, senderId) { * console.log('event', event, properties); * }); * * // update an item in the data set * data.update({id: 2, group: 1}); * * // get all ids in the view * var ids = view.getIds(); * console.log('ids', ids); // will output [1, 2] * * // get all items in the view * var items = view.get(); * ``` * * @typeParam Item - Item type that may or may not have an id. * @typeParam IdProp - Name of the property that contains the id. */ class DataView extends DataSetPart { /** * Create a DataView. * * @param data - The instance containing data (directly or indirectly). * @param options - Options to configure this data view. */ constructor(data, options) { super(); /** @inheritDoc */ this.length = 0; this._ids = new Set(); // ids of the items currently in memory (just contains a boolean true) this._options = options || {}; this._listener = this._onEvent.bind(this); this.setData(data); } /** @inheritDoc */ get idProp() { return this.getDataSet().idProp; } // TODO: implement a function .config() to dynamically update things like configured filter // and trigger changes accordingly /** * Set a data source for the view. * * @param data - The instance containing data (directly or indirectly). * * @remarks * Note that when the data view is bound to a data set it won't be garbage * collected unless the data set is too. Use `dataView.setData(null)` or * `dataView.dispose()` to enable garbage collection before you lose the last * reference. */ setData(data) { if (this._data) { // unsubscribe from current dataset if (this._data.off) { this._data.off("*", this._listener); } // trigger a remove of all items in memory const ids = this._data.getIds({ filter: this._options.filter }); const items = this._data.get(ids); this._ids.clear(); this.length = 0; this._trigger("remove", { items: ids, oldData: items }); } if (data != null) { this._data = data; // trigger an add of all added items const ids = this._data.getIds({ filter: this._options.filter }); for (let i = 0, len = ids.length; i < len; i++) { const id = ids[i]; this._ids.add(id); } this.length = ids.length; this._trigger("add", { items: ids }); } else { this._data = new DataSet(); } // subscribe to new dataset if (this._data.on) { this._data.on("*", this._listener); } } /** * Refresh the DataView. * Useful when the DataView has a filter function containing a variable parameter. */ refresh() { const ids = this._data.getIds({ filter: this._options.filter, }); const oldIds = [...this._ids]; const newIds = {}; const addedIds = []; const removedIds = []; const removedItems = []; // check for additions for (let i = 0, len = ids.length; i < len; i++) { const id = ids[i]; newIds[id] = true; if (!this._ids.has(id)) { addedIds.push(id); this._ids.add(id); } } // check for removals for (let i = 0, len = oldIds.length; i < len; i++) { const id = oldIds[i]; const item = this._data.get(id); if (item == null) { // @TODO: Investigate. // Doesn't happen during tests or examples. // Is it really impossible or could it eventually happen? // How to handle it if it does? The types guarantee non-nullable items. console.error("If you see this, report it please."); } else if (!newIds[id]) { removedIds.push(id); removedItems.push(item); this._ids.delete(id); } } this.length += addedIds.length - removedIds.length; // trigger events if (addedIds.length) { this._trigger("add", { items: addedIds }); } if (removedIds.length) { this._trigger("remove", { items: removedIds, oldData: removedItems }); } } /** @inheritDoc */ get(first, second) { if (this._data == null) { return null; } // parse the arguments let ids = null; let options; if (isId(first) || Array.isArray(first)) { ids = first; options = second; } else { options = first; } // extend the options with the default options and provided options const viewOptions = Object.assign({}, this._options, options); // create a combined filter method when needed const thisFilter = this._options.filter; const optionsFilter = options && options.filter; if (thisFilter && optionsFilter) { viewOptions.filter = (item) => { return thisFilter(item) && optionsFilter(item); }; } if (ids == null) { return this._data.get(viewOptions); } else { return this._data.get(ids, viewOptions); } } /** @inheritDoc */ getIds(options) { if (this._data.length) { const defaultFilter = this._options.filter; const optionsFilter = options != null ? options.filter : null; let filter; if (optionsFilter) { if (defaultFilter) { filter = (item) => { return defaultFilter(item) && optionsFilter(item); }; } else { filter = optionsFilter; } } else { filter = defaultFilter; } return this._data.getIds({ filter: filter, order: options && options.order, }); } else { return []; } } /** @inheritDoc */ forEach(callback, options) { if (this._data) { const defaultFilter = this._options.filter; const optionsFilter = options && options.filter; let filter; if (optionsFilter) { if (defaultFilter) { filter = function (item) { return defaultFilter(item) && optionsFilter(item); }; } else { filter = optionsFilter; } } else { filter = defaultFilter; } this._data.forEach(callback, { filter: filter, order: options && options.order, }); } } /** @inheritDoc */ map(callback, options) { if (this._data) { const defaultFilter = this._options.filter; const optionsFilter = options && options.filter; let filter; if (optionsFilter) { if (defaultFilter) { filter = (item) => { return defaultFilter(item) && optionsFilter(item); }; } else { filter = optionsFilter; } } else { filter = defaultFilter; } return this._data.map(callback, { filter: filter, order: options && options.order, }); } else { return []; } } /** @inheritDoc */ getDataSet() { return this._data.getDataSet(); } /** @inheritDoc */ stream(ids) { return this._data.stream(ids || { [Symbol.iterator]: this._ids.keys.bind(this._ids), }); } /** * Render the instance unusable prior to garbage collection. * * @remarks * The intention of this method is to help discover scenarios where the data * view is being used when the programmer thinks it has been garbage collected * already. It's stricter version of `dataView.setData(null)`. */ dispose() { if (this._data?.off) { this._data.off("*", this._listener); } const message = "This data view has already been disposed of."; const replacement = { get: () => { throw new Error(message); }, set: () => { throw new Error(message); }, configurable: false, }; for (const key of Reflect.ownKeys(DataView.prototype)) { Object.defineProperty(this, key, replacement); } } /** * Event listener. Will propagate all events from the connected data set to the subscribers of the DataView, but will filter the items and only trigger when there are changes in the filtered data set. * * @param event - The name of the event. * @param params - Parameters of the event. * @param senderId - Id supplied by the sender. */ _onEvent(event, params, senderId) { if (!params || !params.items || !this._data) { return; } const ids = params.items; const addedIds = []; const updatedIds = []; const removedIds = []; const oldItems = []; const updatedItems = []; const removedItems = []; switch (event) { case "add": // filter the ids of the added items for (let i = 0, len = ids.length; i < len; i++) { const id = ids[i]; const item = this.get(id); if (item) { this._ids.add(id); addedIds.push(id); } } break; case "update": // determine the event from the views viewpoint: an updated // item can be added, updated, or removed from this view. for (let i = 0, len = ids.length; i < len; i++) { const id = ids[i]; const item = this.get(id); if (item) { if (this._ids.has(id)) { updatedIds.push(id); updatedItems.push(params.data[i]); oldItems.push(params.oldData[i]); } else { this._ids.add(id); addedIds.push(id); } } else { if (this._ids.has(id)) { this._ids.delete(id); removedIds.push(id); removedItems.push(params.oldData[i]); } } } break; case "remove": // filter the ids of the removed items for (let i = 0, len = ids.length; i < len; i++) { const id = ids[i]; if (this._ids.has(id)) { this._ids.delete(id); removedIds.push(id); removedItems.push(params.oldData[i]); } } break; } this.length += addedIds.length - removedIds.length; if (addedIds.length) { this._trigger("add", { items: addedIds }, senderId); } if (updatedIds.length) { this._trigger("update", { items: updatedIds, oldData: oldItems, data: updatedItems }, senderId); } if (removedIds.length) { this._trigger("remove", { items: removedIds, oldData: removedItems }, senderId); } } } /** * Check that given value is compatible with Vis Data Set interface. * * @param idProp - The expected property to contain item id. * @param v - The value to be tested. * * @returns True if all expected values and methods match, false otherwise. */ function isDataSetLike(idProp, v) { return (typeof v === "object" && v !== null && idProp === v.idProp && typeof v.add === "function" && typeof v.clear === "function" && typeof v.distinct === "function" && typeof v.forEach === "function" && typeof v.get === "function" && typeof v.getDataSet === "function" && typeof v.getIds === "function" && typeof v.length === "number" && typeof v.map === "function" && typeof v.max === "function" && typeof v.min === "function" && typeof v.off === "function" && typeof v.on === "function" && typeof v.remove === "function" && typeof v.setOptions === "function" && typeof v.stream === "function" && typeof v.update === "function" && typeof v.updateOnly === "function"); } /** * Check that given value is compatible with Vis Data View interface. * * @param idProp - The expected property to contain item id. * @param v - The value to be tested. * * @returns True if all expected values and methods match, false otherwise. */ function isDataViewLike(idProp, v) { return (typeof v === "object" && v !== null && idProp === v.idProp && typeof v.forEach === "function" && typeof v.get === "function" && typeof v.getDataSet === "function" && typeof v.getIds === "function" && typeof v.length === "number" && typeof v.map === "function" && typeof v.off === "function" && typeof v.on === "function" && typeof v.stream === "function" && isDataSetLike(idProp, v.getDataSet())); } /** * cssfilter * * @author 老雷<leizongmin@gmail.com> */ function getDefaultWhiteList () { // 白名单值说明: // true: 允许该属性 // Function: function (val) { } 返回true表示允许该属性,其他值均表示不允许 // RegExp: regexp.test(val) 返回true表示允许该属性,其他值均表示不允许 // 除上面列出的值外均表示不允许 var whiteList = {}; whiteList['align-content'] = false; // default: auto whiteList['align-items'] = false; // default: auto whiteList['align-self'] = false; // default: auto whiteList['alignment-adjust'] = false; // default: auto whiteList['alignment-baseline'] = false; // default: baseline whiteList['all'] = false; // default: depending on individual properties whiteList['anchor-point'] = false; // default: none whiteList['animation'] = false; // default: depending on individual properties whiteList['animation-delay'] = false; // default: 0 whiteList['animation-direction'] = false; // default: normal whiteList['animation-duration'] = false; // default: 0 whiteList['animation-fill-mode'] = false; // default: none whiteList['animation-iteration-count'] = false; // default: 1 whiteList['animation-name'] = false; // default: none whiteList['animation-play-state'] = false; // default: running whiteList['animation-timing-function'] = false; // default: ease whiteList['azimuth'] = false; // default: center whiteList['backface-visibility'] = false; // default: visible whiteList['background'] = true; // default: depending on individual properties whiteList['background-attachment'] = true; // default: scroll whiteList['background-clip'] = true; // default: border-box whiteList['background-color'] = true; // default: transparent whiteList['background-image'] = true; // default: none whiteList['background-origin'] = true; // default: padding-box whiteList['background-position'] = true; // default: 0% 0% whiteList['background-repeat'] = true; // default: repeat whiteList['background-size'] = true; // default: auto whiteList['baseline-shift'] = false; // default: baseline whiteList['binding'] = false; // default: none whiteList['bleed'] = false; // default: 6pt whiteList['bookmark-label'] = false; // default: content() whiteList['bookmark-level'] = false; // default: none whiteList['bookmark-state'] = false; // default: open whiteList['border'] = true; // default: depending on individual properties whiteList['border-bottom'] = true; // default: depending on individual properties whiteList['border-bottom-color'] = true; // default: current color whiteList['border-bottom-left-radius'] = true; // default: 0 whiteList['border-bottom-right-radius'] = true; // default: 0 whiteList['border-bottom-style'] = true; // default: none whiteList['border-bottom-width'] = true; // default: medium whiteList['border-collapse'] = true; // default: separate whiteList['border-color'] = true; // default: depending on individual properties whiteList['border-image'] = true; // default: none whiteList['border-image-outset'] = true; // default: 0 whiteList['border-image-repeat'] = true; // default: stretch whiteList['border-image-slice'] = true; // default: 100% whiteList['border-image-source'] = true; // default: none whiteList['border-image-width'] = true; // default: 1 whiteList['border-left'] = true; // default: depending on individual properties whiteList['border-left-color'] = true; // default: current color whiteList['border-left-style'] = true; // default: none whiteList['border-left-width'] = true; // default: medium whiteList['border-radius'] = true; // default: 0 whiteList['border-right'] = true; // default: depending on individual properties whiteList['border-right-color'] = true; // default: current color whiteList['border-right-style'] = true; // default: none whiteList['border-right-width'] = true; // default: medium whiteList['border-spacing'] = true; // default: 0 whiteList['border-style'] = true; // default: depending on individual properties whiteList['border-top'] = true; // default: depending on individual properties whiteList['border-top-color'] = true; // default: current color whiteList['border-top-left-radius'] = true; // default: 0 whiteList['border-top-right-radius'] = true; // default: 0 whiteList['border-top-style'] = true; // default: none whiteList['border-top-width'] = true; // default: medium whiteList['border-width'] = true; // default: depending on individual properties whiteList['bottom'] = false; // default: auto whiteList['box-decoration-break'] = true; // default: slice whiteList['box-shadow'] = true; // default: none whiteList['box-sizing'] = true; // default: content-box whiteList['box-snap'] = true; // default: none whiteList['box-suppress'] = true; // default: show whiteList['break-after'] = true; // default: auto whiteList['break-before'] = true; // default: auto whiteList['break-inside'] = true; // default: auto whiteList['caption-side'] = false; // default: top whiteList['chains'] = false; // default: none whiteList['clear'] = true; // default: none whiteList['clip'] = false; // default: auto whiteList['clip-path'] = false; // default: none whiteList['clip-rule'] = false; // default: nonzero whiteList['color'] = true; // default: implementation dependent whiteList['color-interpolation-filters'] = true; // default: auto whiteList['column-count'] = false; // default: auto whiteList['column-fill'] = false; // default: balance whiteList['column-gap'] = false; // default: normal whiteList['column-rule'] = false; // default: depending on individual properties whiteList['column-rule-color'] = false; // default: current color whiteList['column-rule-style'] = false; // default: medium whiteList['column-rule-width'] = false; // default: medium whiteList['column-span'] = false; // default: none whiteList['column-width'] = false; // default: auto whiteList['columns'] = false; // default: depending on individual properties whiteList['contain'] = false; // default: none whiteList['content'] = false; // default: normal whiteList['counter-increment'] = false; // default: none whiteList['counter-reset'] = false; // default: none whiteList['counter-set'] = false; // default: none whiteList['crop'] = false; // default: auto whiteList['cue'] = false; // default: depending on individual properties whiteList['cue-after'] = false; // default: none whiteList['cue-before'] = false; // default: none whiteList['cursor'] = false; // default: auto whiteList['direction'] = false; // default: ltr whiteList['display'] = true; // default: depending on individual properties whiteList['display-inside'] = true; // default: auto whiteList['display-list'] = true; // default: none whiteList['display-outside'] = true; // default: inline-level whiteList['dominant-baseline'] = false; // default: auto whiteList['elevation'] = false; // default: level whiteList['empty-cells'] = false; // default: show whiteList['filter'] = false; // default: none whiteList['flex'] = false; // default: depending on individual properties whiteList['flex-basis'] = false; // default: auto whiteList['flex-direction'] = false; // default: row whiteList['flex-flow'] = false; // default: depending on individual properties whiteList['flex-grow'] = false; // default: 0 whiteList['flex-shrink'] = false; // default: 1 whiteList['flex-wrap'] = false; // default: nowrap whiteList['float'] = false; // default: none whiteList['float-offset'] = false; // default: 0 0 whiteList['flood-color'] = false; // default: black whiteList['flood-opacity'] = false; // default: 1 whiteList['flow-from'] = false; // default: none whiteList['flow-into'] = false; // default: none whiteList['font'] = true; // default: depending on individual properties whiteList['font-family'] = true; // default: implementation dependent whiteList['font-feature-settings'] = true; // default: normal whiteList['font-kerning'] = true; // default: auto whiteList['font-language-override'] = true; // default: normal whiteList['font-size'] = true; // default: medium whiteList['font-size-adjust'] = true; // default: none whiteList['font-stretch'] = true; // default: normal whiteList['font-style'] = true; // default: normal whiteList['font-synthesis'] = true; // default: weight style whiteList['font-variant'] = true; // default: normal whiteList['font-variant-alternates'] = true; // default: normal whiteList['font-variant-caps'] = true; // default: normal whiteList['font-variant-east-asian'] = true; // default: normal whiteList['font-variant-ligatures'] = true; // default: normal whiteList['font-variant-numeric'] = true; // default: normal whiteList['font-variant-position'] = true; // default: normal whiteList['font-weight'] = true; // default: normal whiteList['grid'] = false; // default: depending on individual properties whiteList['grid-area'] = false; // default: depending on individual properties whiteList['grid-auto-columns'] = false; // default: auto whiteList['grid-auto-flow'] = false; // default: none whiteList['grid-auto-rows'] = false; // default: auto whiteList['grid-column'] = false; // default: depending on individual properties whiteList['grid-column-end'] = false; // default: auto whiteList['grid-column-start'] = false; // default: auto whiteList['grid-row'] = false; // default: depending on individual properties whiteList['grid-row-end'] = false; // default: auto whiteList['grid-row-start'] = false; // default: auto whiteList['grid-template'] = false; // default: depending on individual properties whiteList['grid-template-areas'] = false; // default: none whiteList['grid-template-columns'] = false; // default: none whiteList['grid-template-rows'] = false; // default: none whiteList['hanging-punctuation'] = false; // default: none whiteList['height'] = true; // default: auto whiteList['hyphens'] = false; // default: manual whiteList['icon'] = false; // default: auto whiteList['image-orientation'] = false; // default: auto whiteList['image-resolution'] = false; // default: normal whiteList['ime-mode'] = false; // default: auto whiteList['initial-letters'] = false; // default: normal whiteList['inline-box-align'] = false; // default: last whiteList['justify-content'] = false; // default: auto whiteList['justify-items'] = false; // default: auto whiteList['justify-self'] = false; // default: auto whiteList['left'] = false; // default: auto whiteList['letter-spacing'] = true; // default: normal whiteList['lighting-color'] = true; // default: white whiteList['line-box-contain'] = false; // default: block inline replaced whiteList['line-break'] = false; // default: auto whiteList['line-grid'] = false; // default: match-parent whiteList['line-height'] = false; // default: normal whiteList['line-snap'] = false; // default: none whiteList['line-stacking'] = false; // default: depending on individual properties whiteList['line-stacking-ruby'] = false; // default: exclude-ruby whiteList['line-stacking-shift'] = false; // default: consider-shifts whiteList['line-stacking-strategy'] = false; // default: inline-line-height whiteList['list-style'] = true; // default: depending on individual properties whiteList['list-style-image'] = true; // default: none whiteList['list-style-position'] = true; // default: outside whiteList['list-style-type'] = true; // default: disc whiteList['margin'] = true; // default: depending on individual properties whiteList['margin-bottom'] = true; // default: 0 whiteList['margin-left'] = true; // default: 0 whiteList['margin-right'] = true; // default: 0 whiteList['margin-top'] = true; // default: 0 whiteList['marker-offset'] = false; // default: auto whiteList['marker-side'] = false; // default: list-item whiteList['marks'] = false; // default: none whiteList['mask'] = false; // default: border-box whiteList['mask-box'] = false; // default: see individual properties whiteList['mask-box-outset'] = false; // default: 0 whiteList['mask-box-repeat'] = false; // default: stretch whiteList['mask-box-slice'] = false; // default: 0 fill whiteList['mask-box-source'] = false; // default: none whiteList['mask-box-width'] = false; // default: auto whiteList['mask-clip'] = false; // default: border-box whiteList['mask-image'] = false; // default: none whiteList['mask-origin'] = false; // default: border-box whiteList['mask-position'] = false; // default: center whiteList['mask-repeat'] = false; // default: no-repeat whiteList['mask-size'] = false; // default: border-box whiteList['mask-source-type'] = false; // default: auto whiteList['mask-type'] = false; // default: luminance whiteList['max-height'] = true; // default: none whiteList['max-lines'] = false; // default: none whiteList['max-width'] = true; // default: none whiteList['min-height'] = true; // default: 0 whiteList['min-width'] = true; // default: 0 whiteList['move-to'] = false; // default: normal whiteList['nav-down'] = false; // default: auto whiteList['nav-index'] = false; // default: auto whiteList['nav-left'] = false; // default: auto whiteList['nav-right'] = false; // default: auto whiteList['nav-up'] = false; // default: auto whiteList['object-fit'] = false; // default: fill whiteList['object-position'] = false; // default: 50% 50% whiteList['opacity'] = false; // default: 1 whiteList['order'] = false; // default: 0 whiteList['orphans'] = false; // default: 2 whiteList['outline'] = false; // default: depending on individual properties whiteList['outline-color'] = false; // default: invert whiteList['outline-offset'] = false; // default: 0 whiteList['outline-style'] = false; // default: none whiteList['outline-width'] = false; // default: medium whiteList['overflow'] = false; // default: depending on individual properties whiteList['overflow-wrap'] = false; // default: normal whiteList['overflow-x'] = false; // default: visible whiteList['overflow-y'] = false; // default: visible whiteList['padding'] = true; // default: depending on individual properties whiteList['padding-bottom'] = true; // default: 0 whiteList['padding-left'] = true; // default: 0 whiteList['padding-right'] = true; // default: 0 whiteList['padding-top'] = true; // default: 0 whiteList['page'] = false; // default: auto whiteList['page-break-after'] = false; // default: auto whiteList['page-break-before'] = false; // default: auto whiteList['page-break-inside'] = false; // default: auto whiteList['page-policy'] = false; // default: start whiteList['pause'] = false; // default: implementation dependent whiteList['pause-after'] = false; // default: implementation dependent whiteList['pause-before'] = false; // default: implementation dependent whiteList['perspective'] = false; // default: none whiteList['perspective-origin'] = false; // default: 50% 50% whiteList['pitch'] = false; // default: medium whiteList['pitch-range'] = false; // default: 50 whiteList['play-during'] = false; // default: auto whiteList['position'] = false; // default: static whiteList['presentation-level'] = false; // default: 0 whiteList['quotes'] = false; // default: text whiteList['region-fragment'] = false; // default: auto whiteList['resize'] = false; // default: none whiteList['rest'] = false; // default: depending on individual properties whiteList['rest-after'] = false; // default: none whiteList['rest-before'] = false; // default: none whiteList['richness'] = false; // default: 50 whiteList['right'] = false; // default: auto whiteList['rotation'] = false; // default: 0 whiteList['rotation-point'] = false; // default: 50% 50% whiteList['ruby-align'] = false; // default: auto whiteList['ruby-merge'] = false; // default: separate whiteList['ruby-position'] = false; // default: before whiteList['shape-image-threshold'] = false; // default: 0.0 whiteList['shape-outside'] = false; // default: none whiteList['shape-margin'] = false; // default: 0 whiteList['size'] = false; // default: auto whiteList['speak'] = false; // default: auto whiteList['speak-as'] = false; // default: normal whiteList['speak-header'] = false; // default: once whiteList['speak-numeral'] = false; // default: continuous whiteList['speak-punctuation'] = false; // default: none whiteList['speech-rate'] = false; // default: medium whiteList['stress'] = false; // default: 50 whiteList['string-set'] = false; // default: none whiteList['tab-size'] = false; // default: 8 whiteList['table-layout'] = false; // default: auto whiteList['text-align'] = true; // default: start whiteList['text-align-last'] = true; // default: auto whiteList['text-combine-upright'] = true; // default: none whiteList['text-decoration'] = true; // default: none whiteList['text-decoration-color'] = true; // default: currentColor whiteList['text-decoration-line'] = true; // default: none whiteList['text-decoration-skip'] = true; // default: objects whiteList['text-decoration-style'] = true; // default: solid whiteList['text-emphasis'] = true; // default: depending on individual properties whiteList['text-emphasis-color'] = true; // default: currentColor whiteList['text-emphasis-position'] = true; // default: over right whiteList['text-emphasis-style'] = true; // default: none whiteList['text-height'] = true; // default: auto whiteList['text-indent'] = true; // default: 0 whiteList['text-justify'] = true; // default: auto whiteList['text-orientation'] = true; // default: mixed whiteList['text-overflow'] = true; // default: clip whiteList['text-shadow'] = true; // default: none whiteList['text-space-collapse'] = true; // default: collapse whiteList['text-transform'] = true; // default: none whiteList['text-underline-position'] = true; // default: auto whiteList['text-wrap'] = true; // default: normal whiteList['top'] = false; // default: auto whiteList['transform'] = false; // default: none whiteList['transform-origin'] = false; // default: 50% 50% 0 whiteList['transform-style'] = false; // default: flat whiteList['transition'] = false; // default: depending on individual properties whiteList['transition-delay'] = false; // default: 0s whiteList['transition-duration'] = false; // default: 0s whiteList['transition-property'] = false; // default: all whiteList['transition-timing-function'] = false; // default: ease whiteList['unicode-bidi'] = false; // default: normal whiteList['vertical-align'] = false; // default: baseline whiteList['visibility'] = false; // default: visible whiteList['voice-balance'] = false; // default: center whiteList['voice-duration'] = false; // default: auto whiteList['voice-family'] = false; // default: implementation dependent whiteList['voice-pitch'] = false; // default: medium whiteList['voice-range'] = false; // default: medium whiteList['voice-rate'] = false; // default: normal whiteList['voice-stress'] = false; // default: normal whiteList['voice-volume'] = false; // default: medium whiteList['volume'] = false; // default: medium whiteList['white-space'] = false; // default: normal whiteList['widows'] = false; // default: 2 whiteList['width'] = true; // default: auto whiteList['will-change'] = false; // default: auto whiteList['word-break'] = true; // default: normal whiteList['word-spacing'] = true; // default: normal whiteList['word-wrap'] = true; // default: normal whiteList['wrap-flow'] = false; // default: auto whiteList['wrap-through'] = false; // default: wrap whiteList['writing-mode'] = false; // default: horizontal-tb whiteList['z-index'] = false; // default: auto return whiteList; } /** * 匹配到白名单上的一个属性时 * * @param {String} name * @param {String} value * @param {Object} options * @return {String} */ function onAttr (name, value, options) { // do nothing } /** * 匹配到不在白名单上的一个属性时 * * @param {String} name * @param {String} value * @param {Object} options * @return {String} */ function onIgnoreAttr (name, value, options) { // do nothing } var REGEXP_URL_JAVASCRIPT = /javascript\s*\:/img; /** * 过滤属性值 * * @param {String} name * @param {String} value * @return {String} */ function safeAttrValue(name, value) { if (REGEXP_URL_JAVASCRIPT.test(value)) return ''; return value; } var whiteList = getDefaultWhiteList(); var getDefaultWhiteList_1 = getDefaultWhiteList; var onAttr_1 = onAttr; var onIgnoreAttr_1 = onIgnoreAttr; var safeAttrValue_1 = safeAttrValue; var _default = { whiteList: whiteList, getDefaultWhiteList: getDefaultWhiteList_1, onAttr: onAttr_1, onIgnoreAttr: onIgnoreAttr_1, safeAttrValue: safeAttrValue_1 }; var util = { indexOf: function (arr, item) { var i, j; if (Array.prototype.indexOf) { return arr.indexOf(item); } for (i = 0, j = arr.length; i < j; i++) { if (arr[i] === item) { return i; } } return -1; }, forEach: function (arr, fn, scope) { var i, j; if (Array.prototype.forEach) { return arr.forEach(fn, scope); } for (i = 0, j = arr.length; i < j; i++) { fn.call(scope, arr[i], i, arr); } }, trim: function (str) { if (String.prototype.trim) { return str.trim(); } return str.replace(/(^\s*)|(\s*$)/g, ''); }, trimRight: function (str) { if (String.prototype.trimRight) { return str.trimRight(); } return str.replace(/(\s*$)/g, ''); } }; /** * cssfilter * * @author 老雷<leizongmin@gmail.com> */ /** * 解析style * * @param {String} css * @param {Function} onAttr 处理属性的函数 * 参数格式: function (sourcePosition, position, name, value, source) * @return {String} */ function parseStyle (css, onAttr) { css = util.trimRight(css); if (css[css.length - 1] !== ';') css += ';'; var cssLength = css.length; var isParenthesisOpen = false; var lastPos = 0; var i = 0; var retCSS = ''; function addNewAttr () { // 如果没有正常的闭合圆括号,则直接忽略当前属性 if (!isParenthesisOpen) { var source = util.trim(css.slice(lastPos, i)); var j = source.indexOf(':'); if (j !== -1) { var name = util.trim(source.slice(0, j)); var value = util.trim(source.slice(j + 1)); // 必须有属性名称 if (name) { var ret = onAttr(lastPos, retCSS.length, name, value, source); if (ret) retCSS += ret + '; '; } } } lastPos = i + 1; } for (; i < cssLength; i++) { var c = css[i]; if (c === '/' && css[i + 1] === '*') { // 备注开始 var j = css.indexOf('*/', i + 2); // 如果没有正常的备注结束,则后面的部分全部跳过 if (j === -1) break; // 直接将当前位置调到备注结尾,并且初始化状态 i = j + 1; lastPos = i + 1; isParenthesisOpen = false; } else if (c === '(') { isParenthesisOpen = true; } else if (c === ')') { isParenthesisOpen = false; } else if (c === ';') { if (isParenthesisOpen) ; else { addNewAttr(); } } else if (c === '\n') { addNewAttr(); } } return util.trim(retCSS); } var parser = parseStyle; /** * cssfilter * * @author 老雷<leizongmin@gmail.com> */ /** * 返回值是否为空 * * @param {Object} obj * @return {Boolean} */ function isNull (obj) { return (obj === undefined || obj === null); } /** * 浅拷贝对象 * * @param {Object} obj * @return {Object} */ function shallowCopyObject (obj) { var ret = {}; for (var i in obj) { ret[i] = obj[i]; } return ret; } /** * 创建CSS过滤器 * * @param {Object} options * - {Object} whiteList * - {Function} onAttr * - {Function} onIgnoreAttr * - {Function} safeAttrValue */ function FilterCSS (options) { options = shallowCopyObject(options || {}); options.whiteList = options.whiteList || _default.whiteList; options.onAttr = options.onAttr || _default.onAttr; options.onIgnoreAttr = options.onIgnoreAttr || _default.onIgnoreAttr; options.safeAttrValue = options.safeAttrValue || _default.safeAttrValue; this.options = options; } FilterCSS.prototype.process = function (css) { // 兼容各种奇葩输入 css = css || ''; css = css.toString(); if (!css) return ''; var me = this; var options = me.options; var whiteList = options.whiteList; var onAttr = options.onAttr; var onIgnoreAttr = options.onIgnoreAttr; var safeAttrValue = options.safeAttrValue; var retCSS = parser(css, function (sourcePosition, position, name, value, source) { var check = whiteList[name]; var isWhite = false; if (check === true) isWhite = check; else if (typeof check === 'function') isWhite = check(value); else if (check instanceof RegExp) isWhite = check.test(value); if (isWhite !== true) isWhite = false; // 如果过滤后 value 为空则直接忽略 value = safeAttrValue(name, value); if (!value) return; var opts = { position: position, sourcePosition: sourcePosition, source: source, isWhite: isWhite }; if (isWhite) { var ret = onAttr(name, value, opts); if (isNull(ret)) { return name + ':' + value; } else { return ret; } } else { var ret = onIgnoreAttr(name, value, opts); if (!isNull(ret)) { return ret; } } }); return retCSS; }; var css = FilterCSS; var lib = createCommonjsModule(function (module, exports) { /** * cssfilter * * @author 老雷<leizongmin@gmail.com> */ /** * XSS过滤 * * @param {String} css 要过滤的CSS代码 * @param {Object} options 选项:whiteList, onAttr, onIgnoreAttr * @return {String} */ function filterCSS (html, options) { var xss = new css(options); return xss.process(html); } // 输出 exports = module.exports = filterCSS; exports.FilterCSS = css; for (var i in _default) exports[i] = _default[i]; // 在浏览器端使用 if (typeof window !== 'undefined') { window.filterCSS = module.exports; } }); var util$2 = { indexOf: function(arr, item) { var i, j; if (Array.prototype.indexOf) { return arr.indexOf(item); } for (i = 0, j = arr.length; i < j; i++) { if (arr[i] === item) { return i; } } return -1; }, forEach: function(arr, fn, scope) { var i, j; if (Array.prototype.forEach) { return arr.forEach(fn, scope); } for (i = 0, j = arr.length; i < j; i++) { fn.call(scope, arr[i], i, arr); } }, trim: function(str) { if (String.prototype.trim) { return str.trim(); } return str.replace(/(^\s*)|(\s*$)/g, ""); }, spaceIndex: function(str) { var reg = /\s|\n|\t/; var match = reg.exec(str); return match ? match.index : -1; } }; /** * default settings * * @author Zongmin Lei<leizongmin@gmail.com> */ var FilterCSS$1 = lib.FilterCSS; var getDefaultCSSWhiteList = lib.getDefaultWhiteList; function getDefaultWhiteList$1() { return { a: ["target", "href", "title"], abbr: ["title"], address: [], area: ["shape", "coords", "href", "alt"], article: [], aside: [], audio: ["autoplay", "controls", "loop", "preload", "src"], b: [], bdi: ["dir"], bdo: ["dir"], big: [], blockquote: ["cite"], br: [], caption: [], center: [], cite: [], code: [], col: ["align", "valign", "span", "width"], colgroup: ["align", "valign", "span", "width"], dd: [], del: ["datetime"], details: ["open"], div: [], dl: [], dt: [], em: [], font: ["color", "size", "face"], footer: [], h1: [], h2: [], h3: [], h4: [], h5: [], h6: [], header: [], hr: [], i: [], img: ["src", "alt", "title", "width", "height"], ins: ["datetime"], li: [], mark: [], nav: [], ol: [], p: [], pre: [], s: [], section: [], small: [], span: [], sub: [], sup: [], strong: [], table: ["width", "border", "align", "valign"], tbody: ["align", "valign"], td: ["width", "rowspan", "colspan", "align", "valign"], tfoot: ["align", "valign"], th: ["width", "rowspan", "colspan", "align", "valign"], thead: ["align", "valign"], tr: ["rowspan", "align", "valign"], tt: [], u: [], ul: [], video: ["autoplay", "controls", "loop", "preload", "src", "height", "width"] }; } var defaultCSSFilter = new FilterCSS$1(); /** * default onTag function * * @param {String} tag * @param {String} html * @param {Object} options * @return {String} */ function onTag(tag, html, options) { // do nothing } /** * default onIgnoreTag function * * @param {String} tag * @param {String} html * @param {Object} options * @return {String} */ function onIgnoreTag(tag, html, options) { // do nothing } /** * default onTagAttr function * * @param {String} tag * @param {String} name * @param {String} value * @return {String} */ function onTagAttr(tag, name, value) { // do nothing } /** * default onIgnoreTagAttr function * * @param {String} tag * @param {String} name * @param {String} value * @return {String} */ function onIgnoreTagAttr(tag, name, value) { // do nothing } /** * default escapeHtml function * * @param {String} html */ function escapeHtml(html) { return html.replace(REGEXP_LT, "<").replace(REGEXP_GT, ">"); } /** * default safeAttrValue function * * @param {String} tag * @param {String} name * @param {String} value * @param {Object} cssFilter * @return {String} */ function safeAttrValue$1(tag, name, value, cssFilter) { // unescape attribute value firstly value = friendlyAttrValue(value); if (name === "href" || name === "src") { // filter `href` and `src` attribute // only allow the value that starts with `http://` | `https://` | `mailto:` | `/` | `#` value = util$2.trim(value); if (value === "#") return "#"; if ( !( value.substr(0, 7) === "http://" || value.substr(0, 8) === "https://" || value.substr(0, 7) === "mailto:" || value.substr(0, 4) === "tel:" || value.substr(0, 11) === "data:image/" || value.substr(0, 6) === "ftp://" || value.substr(0, 2) === "./" || value.substr(0, 3) === "../" || value[0] === "#" || value[0] === "/" ) ) { return ""; } } else if (name === "background") { // filter `background` attribute (maybe no use) // `javascript:` REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) { return ""; } } else if (name === "style") { // `expression()` REGEXP_DEFAULT_ON_TAG_ATTR_7.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_7.test(value)) { return ""; } // `url()` REGEXP_DEFAULT_ON_TAG_ATTR_8.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_8.test(value)) { REGEXP_DEFAULT_ON_TAG_ATTR_4.lastIndex = 0; if (REGEXP_DEFAULT_ON_TAG_ATTR_4.test(value)) { return ""; } } if (cssFilter !== false) { cssFilter = cssFilter || defaultCSSFilter; value = cssFilter.process(value); } } // escape `<>"` before returns value = escapeAttrValue(value); return value; } // RegExp list var REGEXP_LT = /</g; var REGEXP_GT = />/g; var REGEXP_QUOTE = /"/g; var REGEXP_QUOTE_2 = /"/g; var REGEXP_ATTR_VALUE_1 = /&#([a-zA-Z0-9]*);?/gim; var REGEXP_ATTR_VALUE_COLON = /:?/gim; var REGEXP_ATTR_VALUE_NEWLINE = /&newline;?/gim; var REGEXP_DEFAULT_ON_TAG_ATTR_4 = /((j\s*a\s*v\s*a|v\s*b|l\s*i\s*v\s*e)\s*s\s*c\s*r\s*i\s*p\s*t\s*|m\s*o\s*c\s*h\s*a)\:/gi; var REGEXP_DEFAULT_ON_TAG_ATTR_7 = /e\s*x\s*p\s*r\s*e\s*s\s*s\s*i\s*o\s*n\s*\(.*/gi; var REGEXP_DEFAULT_ON_TAG_ATTR_8 = /u\s*r\s*l\s*\(.*/gi; /** * escape doube quote * * @param {String} str * @return {String} str */ function escapeQuote(str) { return str.replace(REGEXP_QUOTE, """); } /** * unescape double quote * * @param {String} str * @return {String} str */ function unescapeQuote(str) { return str.replace(REGEXP_QUOTE_2, '"'); } /** * escape html entities * * @param {String} str * @return {String} */ function escapeHtmlEntities(str) { return str.replace(REGEXP_ATTR_VALUE_1, function replaceUnicode(str, code) { return code[0] === "x" || code[0] === "X" ? String.fromCharCode(parseInt(code.substr(1), 16)) : String.fromCharCode(parseInt(code, 10)); }); } /** * escape html5 new danger entities * * @param {String} str * @return {String} */ function escapeDangerHtml5Entities(str) { return str .replace(REGEXP_ATTR_VALUE_COLON, ":") .replace(REGEXP_ATTR_VALUE_NEWLINE, " "); } /** * clear nonprintable characters * * @param {String} str * @return {String} */ function clearNonPrintableCharacter(str) { var str2 = ""; for (var i = 0, len = str.length; i < len; i++) { str2 += str.charCodeAt(i) < 32 ? " " : str.charAt(i); } return util$2.trim(str2); } /** * get friendly attribute value * * @param {String} str * @return {String} */ function friendlyAttrValue(str) { str = unescapeQuote(str); str = escapeHtmlEntities(str); str = escapeDangerHtml5Entities(str); str = clearNonPrintableCharacter(str); return str; } /** * unescape attribute value * * @param {String} str * @return {String} */ function escapeAttrValue(str) { str = escapeQuote(str); str = escapeHtml(str); return str; } /** * `onIgnoreTag` function for removing all the tags that are not in whitelist */ function onIgnoreTagStripAll() { return ""; } /** * remove tag body * specify a `tags` list, if the tag is not in the `tags` list then process by the specify function (optional) * * @param {array} tags * @param {function} next */ function StripTagBody(tags, next) { if (typeof next !== "function") { next = function() {}; } var isRemoveAllTag = !Array.isArray(tags); function isRemoveTag(tag) { if (isRemoveAllTag) return true; return util$2.indexOf(tags, tag) !== -1; } var removeList = []; var posStart = false; return { onIgnoreTag: function(tag, html, options) { if (isRemoveTag(tag)) { if (options.isClosing) { var ret = "[/removed]"; var end = options.position + ret.length; removeList.push([ posStart !== false ? posStart : options.position, end ]); posStart = false; return ret; } else { if (!posStart) { posStart = options.position; } return "[removed]"; } } else { return next(tag, html, options); } }, remove: function(html) { var rethtml = ""; var lastPos = 0; util$2.forEach(removeList, function(pos) { rethtml += html.slice(lastPos, pos[0]); lastPos = pos[1]; }); rethtml += html.slice(lastPos); return rethtml; } }; } /** * remove html comments * * @param {String} html * @return {String} */ function stripCommentTag(html) { return html.replace(STRIP_COMMENT_TAG_REGEXP, ""); } var STRIP_COMMENT_TAG_REGEXP = /<!--[\s\S]*?-->/g; /** * remove invisible characters * * @param {String} html * @return {String} */ function stripBlankChar(html) { var chars = html.split(""); chars = chars.filter(function(char) { var c = char.charCodeAt(0); if (c === 127) return false; if (c <= 31) { if (c === 10 || c === 13) return true; return false; } return true; }); return chars.join(""); } var whiteList$1 = getDefaultWhiteList$1(); var getDefaultWhiteList_1$1 = getDefaultWhiteList$1; var onTag_1 = onTag; var onIgnoreTag_1 = onIgnoreTag; var onTagAttr_1 = onTagAttr; var onIgnoreTagAttr_1 = onIgnoreTagAttr; var safeAttrValue_1$1 = safeAttrValue$1; var escapeHtml_1 = escapeHtml; var escapeQuote_1 = escapeQuote; var unescapeQuote_1 = unescapeQuote; var escapeHtmlEntities_1 = escapeHtmlEntities; var escapeDangerHtml5Entities_1 = escapeDangerHtml5Entities; var clearNonPrintableCharacter_1 = clearNonPrintableCharacter; var friendlyAttrValue_1 = friendlyAttrValue; var escapeAttrValue_1 = escapeAttrValue; var onIgnoreTagStripAll_1 = onIgnoreTagStripAll; var StripTagBody_1 = StripTagBody; var stripCommentTag_1 = stripCommentTag; var stripBlankChar_1 = stripBlankChar; var cssFilter = defaultCSSFilter; var getDefaultCSSWhiteList_1 = getDefaultCSSWhiteList; var _default$1 = { whiteList: whiteList$1, getDefaultWhiteList: getDefaultWhiteList_1$1, onTag: onTag_1, onIgnoreTag: onIgnoreTag_1, onTagAttr: onTagAttr_1, onIgnoreTagAttr: onIgnoreTagAttr_1, safeAttrValue: safeAttrValue_1$1, escapeHtml: escapeHtml_1, escapeQuote: escapeQuote_1, unescapeQuote: unescapeQuote_1, escapeHtmlEntities: escapeHtmlEntities_1, escapeDangerHtml5Entities: escapeDangerHtml5Entities_1, clearNonPrintableCharacter: clearNonPrintableCharacter_1, friendlyAttrValue: friendlyAttrValue_1, escapeAttrValue: escapeAttrValue_1, onIgnoreTagStripAll: onIgnoreTagStripAll_1, StripTagBody: StripTagBody_1, stripCommentTag: stripCommentTag_1, stripBlankChar: stripBlankChar_1, cssFilter: cssFilter, getDefaultCSSWhiteList: getDefaultCSSWhiteList_1 }; /** * Simple HTML Parser * * @author Zongmin Lei<leizongmin@gmail.com> */ /** * get tag name * * @param {String} html e.g. '<a hef="#">' * @return {String} */ function getTagName(html) { var i = util$2.spaceIndex(html); if (i === -1) { var tagName = html.slice(1, -1); } else { var tagName = html.slice(1, i + 1); } tagName = util$2.trim(tagName).toLowerCase(); if (tagName.slice(0, 1) === "/") tagName = tagName.slice(1); if (tagName.slice(-1) === "/") tagName = tagName.slice(0, -1); return tagName; } /** * is close tag? * * @param {String} html 如:'<a hef="#">' * @return {Boolean} */ function isClosing(html) { return html.slice(0, 2) === "</"; } /** * parse input html and returns processed html * * @param {String} html * @param {Function} onTag e.g. function (sourcePosition, position, tag, html, isClosing) * @param {Function} escapeHtml * @return {String} */ function parseTag(html, onTag, escapeHtml) { var rethtml = ""; var lastPos = 0; var tagStart = false; var quoteStart = false; var currentPos = 0; var len = html.length; var currentTagName = ""; var currentHtml = ""; chariterator: for (currentPos = 0; currentPos < len; currentPos++) { var c = html.charAt(currentPos); if (tagStart === false) { if (c === "<") { tagStart = currentPos; continue; } } else { if (quoteStart === false) { if (c === "<") { rethtml += escapeHtml(html.slice(lastPos, currentPos)); tagStart = currentPos; lastPos = currentPos; continue; } if (c === ">") { rethtml += escapeHtml(html.slice(lastPos, tagStart)); currentHtml = html.slice(tagStart, currentPos + 1); currentTagName = getTagName(currentHtml); rethtml += onTag( tagStart, rethtml.length, currentTagName, currentHtml, isClosing(currentHtml) ); lastPos = currentPos + 1; tagStart = false; continue; } if ((c === '"' || c === "'")) { var i = 1; var ic = html.charAt(currentPos - i); while ((ic === " ") || (ic === "=")) { if (ic === "=") { quoteStart = c; continue chariterator; } ic = html.charAt(currentPos - ++i); } } } else { if (c === quoteStart) { quoteStart = false; continue; } } } } if (lastPos < html.length) { rethtml += escapeHtml(html.substr(lastPos)); } return rethtml; } var REGEXP_ILLEGAL_ATTR_NAME = /[^a-zA-Z0-9_:\.\-]/gim; /** * parse input attributes and returns processed attributes * * @param {String} html e.g. `href="#" target="_blank"` * @param {Function} onAttr e.g. `function (name, value)` * @return {String} */ function parseAttr(html, onAttr) { var lastPos = 0; var retAttrs = []; var tmpName = false; var len = html.length; function addAttr(name, value) { name = util$2.trim(name); name = name.replace(REGEXP_ILLEGAL_ATTR_NAME, "").toLowerCase(); if (name.length < 1) return; var ret = onAttr(name, value || ""); if (ret) retAttrs.push(ret); } // 逐个分析字符 for (var i = 0; i < len; i++) { var c = html.charAt(i); var v, j; if (tmpName === false && c === "=") { tmpName = html.slice(lastPos, i); lastPos = i + 1; continue; } if (tmpName !== false) { if ( i === lastPos && (c === '"' || c === "'") && html.charAt(i - 1) === "=" ) { j = html.indexOf(c, i + 1); if (j === -1) { break; } else { v = util$2.trim(html.slice(lastPos + 1, j)); addAttr(tmpName, v); tmpName = false; i = j; lastPos = i + 1; continue; } } } if (/\s|\n|\t/.test(c)) { html = html.replace(/\s|\n|\t/g, " "); if (tmpName === false) { j = findNextEqual(html, i); if (j === -1) { v = util$2.trim(html.slice(lastPos, i)); addAttr(v); tmpName = false; lastPos = i + 1; continue; } else { i = j - 1; continue; } } else { j = findBeforeEqual(html, i - 1); if (j === -1) { v = util$2.trim(html.slice(lastPos, i)); v = stripQuoteWrap(v); addAttr(tmpName, v); tmpName = false; lastPos = i + 1; continue; } else { continue; } } } } if (lastPos < html.length) { if (tmpName === false) { addAttr(html.slice(lastPos)); } else { addAttr(tmpName, stripQuoteWrap(util$2.trim(html.slice(lastPos)))); } } return util$2.trim(retAttrs.join(" ")); } function findNextEqual(str, i) { for (; i < str.length; i++) { var c = str[i]; if (c === " ") continue; if (c === "=") return i; return -1; } } function findBeforeEqual(str, i) { for (; i > 0; i--) { var c = str[i]; if (c === " ") continue; if (c === "=") return i; return -1; } } function isQuoteWrapString(text) { if ( (text[0] === '"' && text[text.length - 1] === '"') || (text[0] === "'" && text[text.length - 1] === "'") ) { return true; } else { return false; } } function stripQuoteWrap(text) { if (isQuoteWrapString(text)) { return text.substr(1, text.length - 2); } else { return text; } } var parseTag_1 = parseTag; var parseAttr_1 = parseAttr; var parser$1 = { parseTag: parseTag_1, parseAttr: parseAttr_1 }; /** * filter xss * * @author Zongmin Lei<leizongmin@gmail.com> */ var FilterCSS$2 = lib.FilterCSS; var parseTag$1 = parser$1.parseTag; var parseAttr$1 = parser$1.parseAttr; /** * returns `true` if the input value is `undefined` or `null` * * @param {Object} obj * @return {Boolean} */ function isNull$1(obj) { return obj === undefined || obj === null; } /** * get attributes for a tag * * @param {String} html * @return {Object} * - {String} html * - {Boolean} closing */ function getAttrs(html) { var i = util$2.spaceIndex(html); if (i === -1) { return { html: "", closing: html[html.length - 2] === "/" }; } html = util$2.trim(html.slice(i + 1, -1)); var isClosing = html[html.length - 1] === "/"; if (isClosing) html = util$2.trim(html.slice(0, -1)); return { html: html, closing: isClosing }; } /** * shallow copy * * @param {Object} obj * @return {Object} */ function shallowCopyObject$1(obj) { var ret = {}; for (var i in obj) { ret[i] = obj[i]; } return ret; } /** * FilterXSS class * * @param {Object} options * whiteList, onTag, onTagAttr, onIgnoreTag, * onIgnoreTagAttr, safeAttrValue, escapeHtml * stripIgnoreTagBody, allowCommentTag, stripBlankChar * css{whiteList, onAttr, onIgnoreAttr} `css=false` means don't use `cssfilter` */ function FilterXSS(options) { options = shallowCopyObject$1(options || {}); if (options.stripIgnoreTag) { if (options.onIgnoreTag) { console.error( 'Notes: cannot use these two options "stripIgnoreTag" and "onIgnoreTag" at the same time' ); } options.onIgnoreTag = _default$1.onIgnoreTagStripAll; } options.whiteList = options.whiteList || _default$1.whiteList; options.onTag = options.onTag || _default$1.onTag; options.onTagAttr = options.onTagAttr || _default$1.onTagAttr; options.onIgnoreTag = options.onIgnoreTag || _default$1.onIgnoreTag; options.onIgnoreTagAttr = options.onIgnoreTagAttr || _default$1.onIgnoreTagAttr; options.safeAttrValue = options.safeAttrValue || _default$1.safeAttrValue; options.escapeHtml = options.escapeHtml || _default$1.escapeHtml; this.options = options; if (options.css === false) { this.cssFilter = false; } else { options.css = options.css || {}; this.cssFilter = new FilterCSS$2(options.css); } } /** * start process and returns result * * @param {String} html * @return {String} */ FilterXSS.prototype.process = function(html) { // compatible with the input html = html || ""; html = html.toString(); if (!html) return ""; var me = this; var options = me.options; var whiteList = options.whiteList; var onTag = options.onTag; var onIgnoreTag = options.onIgnoreTag; var onTagAttr = options.onTagAttr; var onIgnoreTagAttr = options.onIgnoreTagAttr; var safeAttrValue = options.safeAttrValue; var escapeHtml = options.escapeHtml; var cssFilter = me.cssFilter; // remove invisible characters if (options.stripBlankChar) { html = _default$1.stripBlankChar(html); } // remove html comments if (!options.allowCommentTag) { html = _default$1.stripCommentTag(html); } // if enable stripIgnoreTagBody var stripIgnoreTagBody = false; if (options.stripIgnoreTagBody) { var stripIgnoreTagBody = _default$1.StripTagBody( options.stripIgnoreTagBody, onIgnoreTag ); onIgnoreTag = stripIgnoreTagBody.onIgnoreTag; } var retHtml = parseTag$1( html, function(sourcePosition, position, tag, html, isClosing) { var info = { sourcePosition: sourcePosition, position: position, isClosing: isClosing, isWhite: whiteList.hasOwnProperty(tag) }; // call `onTag()` var ret = onTag(tag, html, info); if (!isNull$1(ret)) return ret; if (info.isWhite) { if (info.isClosing) { return "</" + tag + ">"; } var attrs = getAttrs(html); var whiteAttrList = whiteList[tag]; var attrsHtml = parseAttr$1(attrs.html, function(name, value) { // call `onTagAttr()` var isWhiteAttr = util$2.indexOf(whiteAttrList, name) !== -1; var ret = onTagAttr(tag, name, value, isWhiteAttr); if (!isNull$1(ret)) return ret; if (isWhiteAttr) { // call `safeAttrValue()` value = safeAttrValue(tag, name, value, cssFilter); if (value) { return name + '="' + value + '"'; } else { return name; } } else { // call `onIgnoreTagAttr()` var ret = onIgnoreTagAttr(tag, name, value, isWhiteAttr); if (!isNull$1(ret)) return ret; return; } }); // build new tag html var html = "<" + tag; if (attrsHtml) html += " " + attrsHtml; if (attrs.closing) html += " /"; html += ">"; return html; } else { // call `onIgnoreTag()` var ret = onIgnoreTag(tag, html, info); if (!isNull$1(ret)) return ret; return escapeHtml(html); } }, escapeHtml ); // if enable stripIgnoreTagBody if (stripIgnoreTagBody) { retHtml = stripIgnoreTagBody.remove(retHtml); } return retHtml; }; var xss = FilterXSS; var lib$1 = createCommonjsModule(function (module, exports) { /** * xss * * @author Zongmin Lei<leizongmin@gmail.com> */ /** * filter xss function * * @param {String} html * @param {Object} options { whiteList, onTag, onTagAttr, onIgnoreTag, onIgnoreTagAttr, safeAttrValue, escapeHtml } * @return {String} */ function filterXSS(html, options) { var xss$1 = new xss(options); return xss$1.process(html); } exports = module.exports = filterXSS; exports.filterXSS = filterXSS; exports.FilterXSS = xss; for (var i in _default$1) exports[i] = _default$1[i]; for (var i in parser$1) exports[i] = parser$1[i]; // using `xss` on the browser, output `filterXSS` to the globals if (typeof window !== "undefined") { window.filterXSS = module.exports; } // using `xss` on the WebWorker, output `filterXSS` to the globals function isWorkerEnv() { return typeof self !== 'undefined' && typeof DedicatedWorkerGlobalScope !== 'undefined' && self instanceof DedicatedWorkerGlobalScope; } if (isWorkerEnv()) { self.filterXSS = module.exports; } }); var propagating = createCommonjsModule(function (module, exports) { (function (global, factory) { module.exports = factory() ; }(commonjsGlobal, (function () { var _firstTarget = null; // singleton, will contain the target element where the touch event started /** * Extend an Hammer.js instance with event propagation. * * Features: * - Events emitted by hammer will propagate in order from child to parent * elements. * - Events are extended with a function `event.stopPropagation()` to stop * propagation to parent elements. * - An option `preventDefault` to stop all default browser behavior. * * Usage: * var hammer = propagatingHammer(new Hammer(element)); * var hammer = propagatingHammer(new Hammer(element), {preventDefault: true}); * * @param {Hammer.Manager} hammer An hammer instance. * @param {Object} [options] Available options: * - `preventDefault: true | false | 'mouse' | 'touch' | 'pen'`. * Enforce preventing the default browser behavior. * Cannot be set to `false`. * @return {Hammer.Manager} Returns the same hammer instance with extended * functionality */ function propagating(hammer, options) { var _options = options || { preventDefault: false }; if (hammer.Manager) { // This looks like the Hammer constructor. // Overload the constructors with our own. var Hammer = hammer; var PropagatingHammer = function(element, options) { var o = Object.create(_options); if (options) Hammer.assign(o, options); return propagating(new Hammer(element, o), o); }; Hammer.assign(PropagatingHammer, Hammer); PropagatingHammer.Manager = function (element, options) { var o = Object.create(_options); if (options) Hammer.assign(o, options); return propagating(new Hammer.Manager(element, o), o); }; return PropagatingHammer; } // create a wrapper object which will override the functions // `on`, `off`, `destroy`, and `emit` of the hammer instance var wrapper = Object.create(hammer); // attach to DOM element var element = hammer.element; if(!element.hammer) element.hammer = []; element.hammer.push(wrapper); // register an event to catch the start of a gesture and store the // target in a singleton hammer.on('hammer.input', function (event) { if (_options.preventDefault === true || (_options.preventDefault === event.pointerType)) { event.preventDefault(); } if (event.isFirst) { _firstTarget = event.target; } }); /** @type {Object.<String, Array.<function>>} */ wrapper._handlers = {}; /** * Register a handler for one or multiple events * @param {String} events A space separated string with events * @param {function} handler A callback function, called as handler(event) * @returns {Hammer.Manager} Returns the hammer instance */ wrapper.on = function (events, handler) { // register the handler split(events).forEach(function (event) { var _handlers = wrapper._handlers[event]; if (!_handlers) { wrapper._handlers[event] = _handlers = []; // register the static, propagated handler hammer.on(event, propagatedHandler); } _handlers.push(handler); }); return wrapper; }; /** * Unregister a handler for one or multiple events * @param {String} events A space separated string with events * @param {function} [handler] Optional. The registered handler. If not * provided, all handlers for given events * are removed. * @returns {Hammer.Manager} Returns the hammer instance */ wrapper.off = function (events, handler) { // unregister the handler split(events).forEach(function (event) { var _handlers = wrapper._handlers[event]; if (_handlers) { _handlers = handler ? _handlers.filter(function (h) { return h !== handler; }) : []; if (_handlers.length > 0) { wrapper._handlers[event] = _handlers; } else { // remove static, propagated handler hammer.off(event, propagatedHandler); delete wrapper._handlers[event]; } } }); return wrapper; }; /** * Emit to the event listeners * @param {string} eventType * @param {Event} event */ wrapper.emit = function(eventType, event) { _firstTarget = event.target; hammer.emit(eventType, event); }; wrapper.destroy = function () { // Detach from DOM element var hammers = hammer.element.hammer; var idx = hammers.indexOf(wrapper); if(idx !== -1) hammers.splice(idx,1); if(!hammers.length) delete hammer.element.hammer; // clear all handlers wrapper._handlers = {}; // call original hammer destroy hammer.destroy(); }; // split a string with space separated words function split(events) { return events.match(/[^ ]+/g); } /** * A static event handler, applying event propagation. * @param {Object} event */ function propagatedHandler(event) { // let only a single hammer instance handle this event if (event.type !== 'hammer.input') { // it is possible that the same srcEvent is used with multiple hammer events, // we keep track on which events are handled in an object _handled if (!event.srcEvent._handled) { event.srcEvent._handled = {}; } if (event.srcEvent._handled[event.type]) { return; } else { event.srcEvent._handled[event.type] = true; } } // attach a stopPropagation function to the event var stopped = false; event.stopPropagation = function () { stopped = true; }; //wrap the srcEvent's stopPropagation to also stop hammer propagation: var srcStop = event.srcEvent.stopPropagation.bind(event.srcEvent); if(typeof srcStop == "function") { event.srcEvent.stopPropagation = function(){ srcStop(); event.stopPropagation(); }; } // attach firstTarget property to the event event.firstTarget = _firstTarget; // propagate over all elements (until stopped) var elem = _firstTarget; while (elem && !stopped) { var elemHammer = elem.hammer; if(elemHammer){ var _handlers; for(var k = 0; k < elemHammer.length; k++){ _handlers = elemHammer[k]._handlers[event.type]; if(_handlers) for (var i = 0; i < _handlers.length && !stopped; i++) { _handlers[i](event); } } } elem = elem.parentNode; } } return wrapper; } return propagating; }))); }); /** * Created by Alex on 11/6/2014. */ function keycharm(options) { var preventDefault = options && options.preventDefault || false; var container = options && options.container || window; var _exportFunctions = {}; var _bound = {keydown:{}, keyup:{}}; var _keys = {}; var i; // a - z for (i = 97; i <= 122; i++) {_keys[String.fromCharCode(i)] = {code:65 + (i - 97), shift: false};} // A - Z for (i = 65; i <= 90; i++) {_keys[String.fromCharCode(i)] = {code:i, shift: true};} // 0 - 9 for (i = 0; i <= 9; i++) {_keys['' + i] = {code:48 + i, shift: false};} // F1 - F12 for (i = 1; i <= 12; i++) {_keys['F' + i] = {code:111 + i, shift: false};} // num0 - num9 for (i = 0; i <= 9; i++) {_keys['num' + i] = {code:96 + i, shift: false};} // numpad misc _keys['num*'] = {code:106, shift: false}; _keys['num+'] = {code:107, shift: false}; _keys['num-'] = {code:109, shift: false}; _keys['num/'] = {code:111, shift: false}; _keys['num.'] = {code:110, shift: false}; // arrows _keys['left'] = {code:37, shift: false}; _keys['up'] = {code:38, shift: false}; _keys['right'] = {code:39, shift: false}; _keys['down'] = {code:40, shift: false}; // extra keys _keys['space'] = {code:32, shift: false}; _keys['enter'] = {code:13, shift: false}; _keys['shift'] = {code:16, shift: undefined}; _keys['esc'] = {code:27, shift: false}; _keys['backspace'] = {code:8, shift: false}; _keys['tab'] = {code:9, shift: false}; _keys['ctrl'] = {code:17, shift: false}; _keys['alt'] = {code:18, shift: false}; _keys['delete'] = {code:46, shift: false}; _keys['pageup'] = {code:33, shift: false}; _keys['pagedown'] = {code:34, shift: false}; // symbols _keys['='] = {code:187, shift: false}; _keys['-'] = {code:189, shift: false}; _keys[']'] = {code:221, shift: false}; _keys['['] = {code:219, shift: false}; var down = function(event) {handleEvent(event,'keydown');}; var up = function(event) {handleEvent(event,'keyup');}; // handle the actualy bound key with the event var handleEvent = function(event,type) { if (_bound[type][event.keyCode] !== undefined) { var bound = _bound[type][event.keyCode]; for (var i = 0; i < bound.length; i++) { if (bound[i].shift === undefined) { bound[i].fn(event); } else if (bound[i].shift == true && event.shiftKey == true) { bound[i].fn(event); } else if (bound[i].shift == false && event.shiftKey == false) { bound[i].fn(event); } } if (preventDefault == true) { event.preventDefault(); } } }; // bind a key to a callback _exportFunctions.bind = function(key, callback, type) { if (type === undefined) { type = 'keydown'; } if (_keys[key] === undefined) { throw new Error("unsupported key: " + key); } if (_bound[type][_keys[key].code] === undefined) { _bound[type][_keys[key].code] = []; } _bound[type][_keys[key].code].push({fn:callback, shift:_keys[key].shift}); }; // bind all keys to a call back (demo purposes) _exportFunctions.bindAll = function(callback, type) { if (type === undefined) { type = 'keydown'; } for (var key in _keys) { if (_keys.hasOwnProperty(key)) { _exportFunctions.bind(key,callback,type); } } }; // get the key label from an event _exportFunctions.getKey = function(event) { for (var key in _keys) { if (_keys.hasOwnProperty(key)) { if (event.shiftKey == true && _keys[key].shift == true && event.keyCode == _keys[key].code) { return key; } else if (event.shiftKey == false && _keys[key].shift == false && event.keyCode == _keys[key].code) { return key; } else if (event.keyCode == _keys[key].code && key == 'shift') { return key; } } } return "unknown key, currently not supported"; }; // unbind either a specific callback from a key or all of them (by leaving callback undefined) _exportFunctions.unbind = function(key, callback, type) { if (type === undefined) { type = 'keydown'; } if (_keys[key] === undefined) { throw new Error("unsupported key: " + key); } if (callback !== undefined) { var newBindings = []; var bound = _bound[type][_keys[key].code]; if (bound !== undefined) { for (var i = 0; i < bound.length; i++) { if (!(bound[i].fn == callback && bound[i].shift == _keys[key].shift)) { newBindings.push(_bound[type][_keys[key].code][i]); } } } _bound[type][_keys[key].code] = newBindings; } else { _bound[type][_keys[key].code] = []; } }; // reset all bound variables. _exportFunctions.reset = function() { _bound = {keydown:{}, keyup:{}}; }; // unbind all listeners and reset all variables. _exportFunctions.destroy = function() { _bound = {keydown:{}, keyup:{}}; container.removeEventListener('keydown', down, true); container.removeEventListener('keyup', up, true); }; // create listeners. container.addEventListener('keydown',down,true); container.addEventListener('keyup',up,true); // return the public functions. return _exportFunctions; } /** * vis-timeline and vis-graph2d * https://visjs.github.io/vis-timeline/ * * Create a fully customizable, interactive timeline with items and ranges. * * @version 7.4.6 * @date 2021-01-15T09:00:33.590Z * * @copyright (c) 2011-2017 Almende B.V, http://almende.com * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs * * @license * vis.js is dual licensed under both * * 1. The Apache 2.0 License * http://www.apache.org/licenses/LICENSE-2.0 * * and * * 2. The MIT License * http://opensource.org/licenses/MIT * * vis.js may be distributed under either license. */ // first check if moment.js is already loaded in the browser window, if so, // use this instance. Else, load via commonjs. // // Note: This doesn't work in ESM. var moment$1 = (typeof window !== 'undefined') && window['moment'] || moment; // utility functions // parse ASP.Net Date pattern, // for example '/Date(1198908717056)/' or '/Date(1198908717056-0700)/' // code from http://momentjs.com/ const ASPDateRegex$1 = /^\/?Date\((-?\d+)/i; const NumericRegex = /^\d+$/; /** * Convert an object into another type * * @param object - Value of unknown type. * @param type - Name of the desired type. * * @returns Object in the desired type. * @throws Error */ function convert(object, type) { let match; if (object === undefined) { return undefined; } if (object === null) { return null; } if (!type) { return object; } if (!(typeof type === "string") && !(type instanceof String)) { throw new Error("Type must be a string"); } //noinspection FallthroughInSwitchStatementJS switch (type) { case "boolean": case "Boolean": return Boolean(object); case "number": case "Number": if (isString(object) && !isNaN(Date.parse(object))) { return moment(object).valueOf(); } else { // @TODO: I don't think that Number and String constructors are a good idea. // This could also fail if the object doesn't have valueOf method or if it's redefined. // For example: Object.create(null) or { valueOf: 7 }. return Number(object.valueOf()); } case "string": case "String": return String(object); case "Date": try { return convert(object, "Moment").toDate(); } catch(e){ if (e instanceof TypeError) { throw new TypeError( "Cannot convert object of type " + getType(object) + " to type " + type ); } else { throw e; } } case "Moment": if (isNumber(object)) { return moment(object); } if (object instanceof Date) { return moment(object.valueOf()); } else if (moment.isMoment(object)) { return moment(object); } if (isString(object)) { match = ASPDateRegex$1.exec(object); if (match) { // object is an ASP date return moment(Number(match[1])); // parse number } match = NumericRegex.exec(object); if (match) { return moment(Number(object)); } return moment(object); // parse string } else { throw new TypeError( "Cannot convert object of type " + getType(object) + " to type " + type ); } case "ISODate": if (isNumber(object)) { return new Date(object); } else if (object instanceof Date) { return object.toISOString(); } else if (moment.isMoment(object)) { return object.toDate().toISOString(); } else if (isString(object)) { match = ASPDateRegex$1.exec(object); if (match) { // object is an ASP date return new Date(Number(match[1])).toISOString(); // parse number } else { return moment(object).format(); // ISO 8601 } } else { throw new Error( "Cannot convert object of type " + getType(object) + " to type ISODate" ); } case "ASPDate": if (isNumber(object)) { return "/Date(" + object + ")/"; } else if (object instanceof Date || moment.isMoment(object)) { return "/Date(" + object.valueOf() + ")/"; } else if (isString(object)) { match = ASPDateRegex$1.exec(object); let value; if (match) { // object is an ASP date value = new Date(Number(match[1])).valueOf(); // parse number } else { value = new Date(object).valueOf(); // parse string } return "/Date(" + value + ")/"; } else { throw new Error( "Cannot convert object of type " + getType(object) + " to type ASPDate" ); } default: throw new Error(`Unknown type ${type}`); } } /** * Create a Data Set like wrapper to seamlessly coerce data types. * * @param rawDS - The Data Set with raw uncoerced data. * @param type - A record assigning a data type to property name. * * @remarks * The write operations (`add`, `remove`, `update` and `updateOnly`) write into * the raw (uncoerced) data set. These values are then picked up by a pipe * which coerces the values using the [[convert]] function and feeds them into * the coerced data set. When querying (`forEach`, `get`, `getIds`, `off` and * `on`) the values are then fetched from the coerced data set and already have * the required data types. The values are coerced only once when inserted and * then the same value is returned each time until it is updated or deleted. * * For example: `typeCoercedDataSet.add({ id: 7, start: "2020-01-21" })` would * result in `typeCoercedDataSet.get(7)` returning `{ id: 7, start: moment(new * Date("2020-01-21")).toDate() }`. * * Use the dispose method prior to throwing a reference to this away. Otherwise * the pipe connecting the two Data Sets will keep the unaccessible coerced * Data Set alive and updated as long as the raw Data Set exists. * * @returns A Data Set like object that saves data into the raw Data Set and * retrieves them from the coerced Data Set. */ function typeCoerceDataSet( rawDS, type = { start: "Date", end: "Date" } ) { const idProp = rawDS._idProp; const coercedDS = new DataSet({ fieldId: idProp }); const pipe = createNewDataPipeFrom(rawDS) .map(item => Object.keys(item).reduce((acc, key) => { acc[key] = convert(item[key], type[key]); return acc; }, {}) ) .to(coercedDS); pipe.all().start(); return { // Write only. add: (...args) => rawDS.getDataSet().add(...args), remove: (...args) => rawDS.getDataSet().remove(...args), update: (...args) => rawDS.getDataSet().update(...args), updateOnly: (...args) => rawDS.getDataSet().updateOnly(...args), clear : (...args) => rawDS.getDataSet().clear(...args), // Read only. forEach: coercedDS.forEach.bind(coercedDS), get: coercedDS.get.bind(coercedDS), getIds: coercedDS.getIds.bind(coercedDS), off: coercedDS.off.bind(coercedDS), on: coercedDS.on.bind(coercedDS), get length() { return coercedDS.length; }, // Non standard. idProp, type, rawDS, coercedDS, dispose: () => pipe.stop() }; } var util$3 = { ...util$1, convert, xss: lib$1 }; /** Prototype for visual components */ class Component { /** * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} [body] * @param {Object} [options] */ constructor(body, options) { // eslint-disable-line no-unused-vars this.options = null; this.props = null; } /** * Set options for the component. The new options will be merged into the * current options. * @param {Object} options */ setOptions(options) { if (options) { util$3.extend(this.options, options); } } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { // should be implemented by the component return false; } /** * Destroy the component. Cleanup DOM and event listeners */ destroy() { // should be implemented by the component } /** * Test whether the component is resized since the last time _isResized() was * called. * @return {Boolean} Returns true if the component is resized * @protected */ _isResized() { const resized = ( this.props._previousWidth !== this.props.width || this.props._previousHeight !== this.props.height ); this.props._previousWidth = this.props.width; this.props._previousHeight = this.props.height; return resized; } } /** * used in Core to convert the options into a volatile variable * * @param {function} moment * @param {Object} body * @param {Array | Object} hiddenDates * @returns {number} */ function convertHiddenOptions(moment, body, hiddenDates) { if (hiddenDates && !Array.isArray(hiddenDates)) { return convertHiddenOptions(moment, body, [hiddenDates]) } body.hiddenDates = []; if (hiddenDates) { if (Array.isArray(hiddenDates) == true) { for (let i = 0; i < hiddenDates.length; i++) { if (hiddenDates[i].repeat === undefined) { const dateItem = {}; dateItem.start = moment(hiddenDates[i].start).toDate().valueOf(); dateItem.end = moment(hiddenDates[i].end).toDate().valueOf(); body.hiddenDates.push(dateItem); } } body.hiddenDates.sort((a, b) => a.start - b.start); // sort by start time } } } /** * create new entrees for the repeating hidden dates * * @param {function} moment * @param {Object} body * @param {Array | Object} hiddenDates * @returns {null} */ function updateHiddenDates(moment, body, hiddenDates) { if (hiddenDates && !Array.isArray(hiddenDates)) { return updateHiddenDates(moment, body, [hiddenDates]) } if (hiddenDates && body.domProps.centerContainer.width !== undefined) { convertHiddenOptions(moment, body, hiddenDates); const start = moment(body.range.start); const end = moment(body.range.end); const totalRange = (body.range.end - body.range.start); const pixelTime = totalRange / body.domProps.centerContainer.width; for (let i = 0; i < hiddenDates.length; i++) { if (hiddenDates[i].repeat !== undefined) { const startDate = moment(hiddenDates[i].start); let endDate = moment(hiddenDates[i].end); if (startDate._d == "Invalid Date") { throw new Error(`Supplied start date is not valid: ${hiddenDates[i].start}`); } if (endDate._d == "Invalid Date") { throw new Error(`Supplied end date is not valid: ${hiddenDates[i].end}`); } const duration = endDate - startDate; if (duration >= 4 * pixelTime) { let offset = 0; const runUntil = end.clone(); switch (hiddenDates[i].repeat) { case "daily": // case of time if (startDate.day() != endDate.day()) { offset = 1; } startDate.dayOfYear(start.dayOfYear()); startDate.year(start.year()); startDate.subtract(7,'days'); endDate.dayOfYear(start.dayOfYear()); endDate.year(start.year()); endDate.subtract(7 - offset,'days'); runUntil.add(1, 'weeks'); break; case "weekly": { const dayOffset = endDate.diff(startDate,'days'); const day = startDate.day(); // set the start date to the range.start startDate.date(start.date()); startDate.month(start.month()); startDate.year(start.year()); endDate = startDate.clone(); // force startDate.day(day); endDate.day(day); endDate.add(dayOffset,'days'); startDate.subtract(1,'weeks'); endDate.subtract(1,'weeks'); runUntil.add(1, 'weeks'); break; } case "monthly": if (startDate.month() != endDate.month()) { offset = 1; } startDate.month(start.month()); startDate.year(start.year()); startDate.subtract(1,'months'); endDate.month(start.month()); endDate.year(start.year()); endDate.subtract(1,'months'); endDate.add(offset,'months'); runUntil.add(1, 'months'); break; case "yearly": if (startDate.year() != endDate.year()) { offset = 1; } startDate.year(start.year()); startDate.subtract(1,'years'); endDate.year(start.year()); endDate.subtract(1,'years'); endDate.add(offset,'years'); runUntil.add(1, 'years'); break; default: console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); return; } while (startDate < runUntil) { body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); switch (hiddenDates[i].repeat) { case "daily": startDate.add(1, 'days'); endDate.add(1, 'days'); break; case "weekly": startDate.add(1, 'weeks'); endDate.add(1, 'weeks'); break; case "monthly": startDate.add(1, 'months'); endDate.add(1, 'months'); break; case "yearly": startDate.add(1, 'y'); endDate.add(1, 'y'); break; default: console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:", hiddenDates[i].repeat); return; } } body.hiddenDates.push({start: startDate.valueOf(), end: endDate.valueOf()}); } } } // remove duplicates, merge where possible removeDuplicates(body); // ensure the new positions are not on hidden dates const startHidden = getIsHidden(body.range.start, body.hiddenDates); const endHidden = getIsHidden(body.range.end,body.hiddenDates); let rangeStart = body.range.start; let rangeEnd = body.range.end; if (startHidden.hidden == true) {rangeStart = body.range.startToFront == true ? startHidden.startDate - 1 : startHidden.endDate + 1;} if (endHidden.hidden == true) {rangeEnd = body.range.endToFront == true ? endHidden.startDate - 1 : endHidden.endDate + 1;} if (startHidden.hidden == true || endHidden.hidden == true) { body.range._applyRange(rangeStart, rangeEnd); } } } /** * remove duplicates from the hidden dates list. Duplicates are evil. They mess everything up. * Scales with N^2 * * @param {Object} body */ function removeDuplicates(body) { const hiddenDates = body.hiddenDates; const safeDates = []; for (var i = 0; i < hiddenDates.length; i++) { for (let j = 0; j < hiddenDates.length; j++) { if (i != j && hiddenDates[j].remove != true && hiddenDates[i].remove != true) { // j inside i if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { hiddenDates[j].remove = true; } // j start inside i else if (hiddenDates[j].start >= hiddenDates[i].start && hiddenDates[j].start <= hiddenDates[i].end) { hiddenDates[i].end = hiddenDates[j].end; hiddenDates[j].remove = true; } // j end inside i else if (hiddenDates[j].end >= hiddenDates[i].start && hiddenDates[j].end <= hiddenDates[i].end) { hiddenDates[i].start = hiddenDates[j].start; hiddenDates[j].remove = true; } } } } for (i = 0; i < hiddenDates.length; i++) { if (hiddenDates[i].remove !== true) { safeDates.push(hiddenDates[i]); } } body.hiddenDates = safeDates; body.hiddenDates.sort((a, b) => a.start - b.start); // sort by start time } /** * Used in TimeStep to avoid the hidden times. * @param {function} moment * @param {TimeStep} timeStep * @param {Date} previousTime */ function stepOverHiddenDates(moment, timeStep, previousTime) { let stepInHidden = false; const currentValue = timeStep.current.valueOf(); for (let i = 0; i < timeStep.hiddenDates.length; i++) { const startDate = timeStep.hiddenDates[i].start; var endDate = timeStep.hiddenDates[i].end; if (currentValue >= startDate && currentValue < endDate) { stepInHidden = true; break; } } if (stepInHidden == true && currentValue < timeStep._end.valueOf() && currentValue != previousTime) { const prevValue = moment(previousTime); const newValue = moment(endDate); //check if the next step should be major if (prevValue.year() != newValue.year()) {timeStep.switchedYear = true;} else if (prevValue.month() != newValue.month()) {timeStep.switchedMonth = true;} else if (prevValue.dayOfYear() != newValue.dayOfYear()) {timeStep.switchedDay = true;} timeStep.current = newValue; } } ///** // * Used in TimeStep to avoid the hidden times. // * @param timeStep // * @param previousTime // */ //checkFirstStep = function(timeStep) { // var stepInHidden = false; // var currentValue = timeStep.current.valueOf(); // for (var i = 0; i < timeStep.hiddenDates.length; i++) { // var startDate = timeStep.hiddenDates[i].start; // var endDate = timeStep.hiddenDates[i].end; // if (currentValue >= startDate && currentValue < endDate) { // stepInHidden = true; // break; // } // } // // if (stepInHidden == true && currentValue <= timeStep._end.valueOf()) { // var newValue = moment(endDate); // timeStep.current = newValue.toDate(); // } //}; /** * replaces the Core toScreen methods * * @param {timeline.Core} Core * @param {Date} time * @param {number} width * @returns {number} */ function toScreen(Core, time, width) { let conversion; if (Core.body.hiddenDates.length == 0) { conversion = Core.range.conversion(width); return (time.valueOf() - conversion.offset) * conversion.scale; } else { const hidden = getIsHidden(time, Core.body.hiddenDates); if (hidden.hidden == true) { time = hidden.startDate; } const duration = getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); if (time < Core.range.start) { conversion = Core.range.conversion(width, duration); const hiddenBeforeStart = getHiddenDurationBeforeStart(Core.body.hiddenDates, time, conversion.offset); time = Core.options.moment(time).toDate().valueOf(); time = time + hiddenBeforeStart; return -(conversion.offset - time.valueOf()) * conversion.scale; } else if (time > Core.range.end) { const rangeAfterEnd = {start: Core.range.start, end: time}; time = correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, rangeAfterEnd, time); conversion = Core.range.conversion(width, duration); return (time.valueOf() - conversion.offset) * conversion.scale; } else { time = correctTimeForHidden(Core.options.moment, Core.body.hiddenDates, Core.range, time); conversion = Core.range.conversion(width, duration); return (time.valueOf() - conversion.offset) * conversion.scale; } } } /** * Replaces the core toTime methods * * @param {timeline.Core} Core * @param {number} x * @param {number} width * @returns {Date} */ function toTime(Core, x, width) { if (Core.body.hiddenDates.length == 0) { const conversion = Core.range.conversion(width); return new Date(x / conversion.scale + conversion.offset); } else { const hiddenDuration = getHiddenDurationBetween(Core.body.hiddenDates, Core.range.start, Core.range.end); const totalDuration = Core.range.end - Core.range.start - hiddenDuration; const partialDuration = totalDuration * x / width; const accumulatedHiddenDuration = getAccumulatedHiddenDuration(Core.body.hiddenDates, Core.range, partialDuration); return new Date(accumulatedHiddenDuration + partialDuration + Core.range.start); } } /** * Support function * * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {number} start * @param {number} end * @returns {number} */ function getHiddenDurationBetween(hiddenDates, start, end) { let duration = 0; for (let i = 0; i < hiddenDates.length; i++) { const startDate = hiddenDates[i].start; const endDate = hiddenDates[i].end; // if time after the cutout, and the if (startDate >= start && endDate < end) { duration += endDate - startDate; } } return duration; } /** * Support function * * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {number} start * @param {number} end * @returns {number} */ function getHiddenDurationBeforeStart(hiddenDates, start, end) { let duration = 0; for (let i = 0; i < hiddenDates.length; i++) { const startDate = hiddenDates[i].start; const endDate = hiddenDates[i].end; if (startDate >= start && endDate <= end) { duration += endDate - startDate; } } return duration; } /** * Support function * @param {function} moment * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {{start: number, end: number}} range * @param {Date} time * @returns {number} */ function correctTimeForHidden(moment, hiddenDates, range, time) { time = moment(time).toDate().valueOf(); time -= getHiddenDurationBefore(moment, hiddenDates,range,time); return time; } /** * Support function * @param {function} moment * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {{start: number, end: number}} range * @param {Date} time * @returns {number} */ function getHiddenDurationBefore(moment, hiddenDates, range, time) { let timeOffset = 0; time = moment(time).toDate().valueOf(); for (let i = 0; i < hiddenDates.length; i++) { const startDate = hiddenDates[i].start; const endDate = hiddenDates[i].end; // if time after the cutout, and the if (startDate >= range.start && endDate < range.end) { if (time >= endDate) { timeOffset += (endDate - startDate); } } } return timeOffset; } /** * sum the duration from start to finish, including the hidden duration, * until the required amount has been reached, return the accumulated hidden duration * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {{start: number, end: number}} range * @param {number} [requiredDuration=0] * @returns {number} */ function getAccumulatedHiddenDuration(hiddenDates, range, requiredDuration) { let hiddenDuration = 0; let duration = 0; let previousPoint = range.start; //printDates(hiddenDates) for (let i = 0; i < hiddenDates.length; i++) { const startDate = hiddenDates[i].start; const endDate = hiddenDates[i].end; // if time after the cutout, and the if (startDate >= range.start && endDate < range.end) { duration += startDate - previousPoint; previousPoint = endDate; if (duration >= requiredDuration) { break; } else { hiddenDuration += endDate - startDate; } } } return hiddenDuration; } /** * used to step over to either side of a hidden block. Correction is disabled on tablets, might be set to true * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @param {Date} time * @param {number} direction * @param {boolean} correctionEnabled * @returns {Date|number} */ function snapAwayFromHidden(hiddenDates, time, direction, correctionEnabled) { const isHidden = getIsHidden(time, hiddenDates); if (isHidden.hidden == true) { if (direction < 0) { if (correctionEnabled == true) { return isHidden.startDate - (isHidden.endDate - time) - 1; } else { return isHidden.startDate - 1; } } else { if (correctionEnabled == true) { return isHidden.endDate + (time - isHidden.startDate) + 1; } else { return isHidden.endDate + 1; } } } else { return time; } } /** * Check if a time is hidden * * @param {Date} time * @param {Array.<{start: Window.start, end: *}>} hiddenDates * @returns {{hidden: boolean, startDate: Window.start, endDate: *}} */ function getIsHidden(time, hiddenDates) { for (let i = 0; i < hiddenDates.length; i++) { var startDate = hiddenDates[i].start; var endDate = hiddenDates[i].end; if (time >= startDate && time < endDate) { // if the start is entering a hidden zone return {hidden: true, startDate, endDate}; } } return {hidden: false, startDate, endDate}; } /** * A Range controls a numeric range with a start and end value. * The Range adjusts the range based on mouse events or programmatic changes, * and triggers events when the range is changing or has been changed. */ class Range extends Component { /** * @param {{dom: Object, domProps: Object, emitter: Emitter}} body * @param {Object} [options] See description at Range.setOptions * @constructor Range * @extends Component */ constructor(body, options) { super(); const now = moment$1().hours(0).minutes(0).seconds(0).milliseconds(0); const start = now.clone().add(-3, 'days').valueOf(); const end = now.clone().add(3, 'days').valueOf(); this.millisecondsPerPixelCache = undefined; if(options === undefined) { this.start = start; this.end = end; } else { this.start = options.start || start; this.end = options.end || end; } this.rolling = false; this.body = body; this.deltaDifference = 0; this.scaleOffset = 0; this.startToFront = false; this.endToFront = true; // default options this.defaultOptions = { rtl: false, start: null, end: null, moment: moment$1, direction: 'horizontal', // 'horizontal' or 'vertical' moveable: true, zoomable: true, min: null, max: null, zoomMin: 10, // milliseconds zoomMax: 1000 * 60 * 60 * 24 * 365 * 10000, // milliseconds rollingMode: { follow: false, offset: 0.5 } }; this.options = util$3.extend({}, this.defaultOptions); this.props = { touch: {} }; this.animationTimer = null; // drag listeners for dragging this.body.emitter.on('panstart', this._onDragStart.bind(this)); this.body.emitter.on('panmove', this._onDrag.bind(this)); this.body.emitter.on('panend', this._onDragEnd.bind(this)); // mouse wheel for zooming this.body.emitter.on('mousewheel', this._onMouseWheel.bind(this)); // pinch to zoom this.body.emitter.on('touch', this._onTouch.bind(this)); this.body.emitter.on('pinch', this._onPinch.bind(this)); // on click of rolling mode button this.body.dom.rollingModeBtn.addEventListener('click', this.startRolling.bind(this)); this.setOptions(options); } /** * Set options for the range controller * @param {Object} options Available options: * {number | Date | String} start Start date for the range * {number | Date | String} end End date for the range * {number} min Minimum value for start * {number} max Maximum value for end * {number} zoomMin Set a minimum value for * (end - start). * {number} zoomMax Set a maximum value for * (end - start). * {boolean} moveable Enable moving of the range * by dragging. True by default * {boolean} zoomable Enable zooming of the range * by pinching/scrolling. True by default */ setOptions(options) { if (options) { // copy the options that we know const fields = [ 'animation', 'direction', 'min', 'max', 'zoomMin', 'zoomMax', 'moveable', 'zoomable', 'moment', 'activate', 'hiddenDates', 'zoomKey', 'zoomFriction', 'rtl', 'showCurrentTime', 'rollingMode', 'horizontalScroll' ]; util$3.selectiveExtend(fields, this.options, options); if (options.rollingMode && options.rollingMode.follow) { this.startRolling(); } if ('start' in options || 'end' in options) { // apply a new range. both start and end are optional this.setRange(options.start, options.end); } } } /** * Start auto refreshing the current time bar */ startRolling() { const me = this; /** * Updates the current time. */ function update () { me.stopRolling(); me.rolling = true; let interval = me.end - me.start; const t = util$3.convert(new Date(), 'Date').valueOf(); const rollingModeOffset = me.options.rollingMode && me.options.rollingMode.offset || 0.5; const start = t - interval * (rollingModeOffset); const end = t + interval * (1 - rollingModeOffset); const options = { animation: false }; me.setRange(start, end, options); // determine interval to refresh const scale = me.conversion(me.body.domProps.center.width).scale; interval = 1 / scale / 10; if (interval < 30) interval = 30; if (interval > 1000) interval = 1000; me.body.dom.rollingModeBtn.style.visibility = "hidden"; // start a renderTimer to adjust for the new time me.currentTimeTimer = setTimeout(update, interval); } update(); } /** * Stop auto refreshing the current time bar */ stopRolling() { if (this.currentTimeTimer !== undefined) { clearTimeout(this.currentTimeTimer); this.rolling = false; this.body.dom.rollingModeBtn.style.visibility = "visible"; } } /** * Set a new start and end range * @param {Date | number | string} start * @param {Date | number | string} end * @param {Object} options Available options: * {boolean | {duration: number, easingFunction: string}} [animation=false] * If true, the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * {boolean} [byUser=false] * {Event} event Mouse event * @param {Function} callback a callback function to be executed at the end of this function * @param {Function} frameCallback a callback function executed each frame of the range animation. * The callback will be passed three parameters: * {number} easeCoefficient an easing coefficent * {boolean} willDraw If true the caller will redraw after the callback completes * {boolean} done If true then animation is ending after the current frame * @return {void} */ setRange(start, end, options, callback, frameCallback) { if (!options) { options = {}; } if (options.byUser !== true) { options.byUser = false; } const me = this; const finalStart = start != undefined ? util$3.convert(start, 'Date').valueOf() : null; const finalEnd = end != undefined ? util$3.convert(end, 'Date').valueOf() : null; this._cancelAnimation(); this.millisecondsPerPixelCache = undefined; if (options.animation) { // true or an Object const initStart = this.start; const initEnd = this.end; const duration = (typeof options.animation === 'object' && 'duration' in options.animation) ? options.animation.duration : 500; const easingName = (typeof options.animation === 'object' && 'easingFunction' in options.animation) ? options.animation.easingFunction : 'easeInOutQuad'; const easingFunction = util$3.easingFunctions[easingName]; if (!easingFunction) { throw new Error(`Unknown easing function ${JSON.stringify(easingName)}. Choose from: ${Object.keys(util$3.easingFunctions).join(', ')}`); } const initTime = Date.now(); let anyChanged = false; const next = () => { if (!me.props.touch.dragging) { const now = Date.now(); const time = now - initTime; const ease = easingFunction(time / duration); const done = time > duration; const s = (done || finalStart === null) ? finalStart : initStart + (finalStart - initStart) * ease; const e = (done || finalEnd === null) ? finalEnd : initEnd + (finalEnd - initEnd) * ease; changed = me._applyRange(s, e); updateHiddenDates(me.options.moment, me.body, me.options.hiddenDates); anyChanged = anyChanged || changed; const params = { start: new Date(me.start), end: new Date(me.end), byUser: options.byUser, event: options.event }; if (frameCallback) { frameCallback(ease, changed, done); } if (changed) { me.body.emitter.emit('rangechange', params); } if (done) { if (anyChanged) { me.body.emitter.emit('rangechanged', params); if (callback) { return callback() } } } else { // animate with as high as possible frame rate, leave 20 ms in between // each to prevent the browser from blocking me.animationTimer = setTimeout(next, 20); } } }; return next(); } else { var changed = this._applyRange(finalStart, finalEnd); updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); if (changed) { const params = { start: new Date(this.start), end: new Date(this.end), byUser: options.byUser, event: options.event }; this.body.emitter.emit('rangechange', params); clearTimeout( me.timeoutID ); me.timeoutID = setTimeout( () => { me.body.emitter.emit('rangechanged', params); }, 200 ); if (callback) { return callback() } } } } /** * Get the number of milliseconds per pixel. * * @returns {undefined|number} */ getMillisecondsPerPixel() { if (this.millisecondsPerPixelCache === undefined) { this.millisecondsPerPixelCache = (this.end - this.start) / this.body.dom.center.clientWidth; } return this.millisecondsPerPixelCache; } /** * Stop an animation * @private */ _cancelAnimation() { if (this.animationTimer) { clearTimeout(this.animationTimer); this.animationTimer = null; } } /** * Set a new start and end range. This method is the same as setRange, but * does not trigger a range change and range changed event, and it returns * true when the range is changed * @param {number} [start] * @param {number} [end] * @return {boolean} changed * @private */ _applyRange(start, end) { let newStart = (start != null) ? util$3.convert(start, 'Date').valueOf() : this.start; let newEnd = (end != null) ? util$3.convert(end, 'Date').valueOf() : this.end; const max = (this.options.max != null) ? util$3.convert(this.options.max, 'Date').valueOf() : null; const min = (this.options.min != null) ? util$3.convert(this.options.min, 'Date').valueOf() : null; let diff; // check for valid number if (isNaN(newStart) || newStart === null) { throw new Error(`Invalid start "${start}"`); } if (isNaN(newEnd) || newEnd === null) { throw new Error(`Invalid end "${end}"`); } // prevent end < start if (newEnd < newStart) { newEnd = newStart; } // prevent start < min if (min !== null) { if (newStart < min) { diff = (min - newStart); newStart += diff; newEnd += diff; // prevent end > max if (max != null) { if (newEnd > max) { newEnd = max; } } } } // prevent end > max if (max !== null) { if (newEnd > max) { diff = (newEnd - max); newStart -= diff; newEnd -= diff; // prevent start < min if (min != null) { if (newStart < min) { newStart = min; } } } } // prevent (end-start) < zoomMin if (this.options.zoomMin !== null) { let zoomMin = parseFloat(this.options.zoomMin); if (zoomMin < 0) { zoomMin = 0; } if ((newEnd - newStart) < zoomMin) { // compensate for a scale of 0.5 ms const compensation = 0.5; if ((this.end - this.start) === zoomMin && newStart >= this.start - compensation && newEnd <= this.end) { // ignore this action, we are already zoomed to the minimum newStart = this.start; newEnd = this.end; } else { // zoom to the minimum diff = (zoomMin - (newEnd - newStart)); newStart -= diff / 2; newEnd += diff / 2; } } } // prevent (end-start) > zoomMax if (this.options.zoomMax !== null) { let zoomMax = parseFloat(this.options.zoomMax); if (zoomMax < 0) { zoomMax = 0; } if ((newEnd - newStart) > zoomMax) { if ((this.end - this.start) === zoomMax && newStart < this.start && newEnd > this.end) { // ignore this action, we are already zoomed to the maximum newStart = this.start; newEnd = this.end; } else { // zoom to the maximum diff = ((newEnd - newStart) - zoomMax); newStart += diff / 2; newEnd -= diff / 2; } } } const changed = (this.start != newStart || this.end != newEnd); // if the new range does NOT overlap with the old range, emit checkRangedItems to avoid not showing ranged items (ranged meaning has end time, not necessarily of type Range) if (!((newStart >= this.start && newStart <= this.end) || (newEnd >= this.start && newEnd <= this.end)) && !((this.start >= newStart && this.start <= newEnd) || (this.end >= newStart && this.end <= newEnd) )) { this.body.emitter.emit('checkRangedItems'); } this.start = newStart; this.end = newEnd; return changed; } /** * Retrieve the current range. * @return {Object} An object with start and end properties */ getRange() { return { start: this.start, end: this.end }; } /** * Calculate the conversion offset and scale for current range, based on * the provided width * @param {number} width * @param {number} [totalHidden=0] * @returns {{offset: number, scale: number}} conversion */ conversion(width, totalHidden) { return Range.conversion(this.start, this.end, width, totalHidden); } /** * Static method to calculate the conversion offset and scale for a range, * based on the provided start, end, and width * @param {number} start * @param {number} end * @param {number} width * @param {number} [totalHidden=0] * @returns {{offset: number, scale: number}} conversion */ static conversion(start, end, width, totalHidden) { if (totalHidden === undefined) { totalHidden = 0; } if (width != 0 && (end - start != 0)) { return { offset: start, scale: width / (end - start - totalHidden) } } else { return { offset: 0, scale: 1 }; } } /** * Start dragging horizontally or vertically * @param {Event} event * @private */ _onDragStart(event) { this.deltaDifference = 0; this.previousDelta = 0; // only allow dragging when configured as movable if (!this.options.moveable) return; // only start dragging when the mouse is inside the current range if (!this._isInsideRange(event)) return; // refuse to drag when we where pinching to prevent the timeline make a jump // when releasing the fingers in opposite order from the touch screen if (!this.props.touch.allowDragging) return; this.stopRolling(); this.props.touch.start = this.start; this.props.touch.end = this.end; this.props.touch.dragging = true; if (this.body.dom.root) { this.body.dom.root.style.cursor = 'move'; } } /** * Perform dragging operation * @param {Event} event * @private */ _onDrag(event) { if (!event) return; if (!this.props.touch.dragging) return; // only allow dragging when configured as movable if (!this.options.moveable) return; // TODO: this may be redundant in hammerjs2 // refuse to drag when we where pinching to prevent the timeline make a jump // when releasing the fingers in opposite order from the touch screen if (!this.props.touch.allowDragging) return; const direction = this.options.direction; validateDirection(direction); let delta = (direction == 'horizontal') ? event.deltaX : event.deltaY; delta -= this.deltaDifference; let interval = (this.props.touch.end - this.props.touch.start); // normalize dragging speed if cutout is in between. const duration = getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); interval -= duration; const width = (direction == 'horizontal') ? this.body.domProps.center.width : this.body.domProps.center.height; let diffRange; if (this.options.rtl) { diffRange = delta / width * interval; } else { diffRange = -delta / width * interval; } const newStart = this.props.touch.start + diffRange; const newEnd = this.props.touch.end + diffRange; // snapping times away from hidden zones const safeStart = snapAwayFromHidden(this.body.hiddenDates, newStart, this.previousDelta-delta, true); const safeEnd = snapAwayFromHidden(this.body.hiddenDates, newEnd, this.previousDelta-delta, true); if (safeStart != newStart || safeEnd != newEnd) { this.deltaDifference += delta; this.props.touch.start = safeStart; this.props.touch.end = safeEnd; this._onDrag(event); return; } this.previousDelta = delta; this._applyRange(newStart, newEnd); const startDate = new Date(this.start); const endDate = new Date(this.end); // fire a rangechange event this.body.emitter.emit('rangechange', { start: startDate, end: endDate, byUser: true, event }); // fire a panmove event this.body.emitter.emit('panmove'); } /** * Stop dragging operation * @param {event} event * @private */ _onDragEnd(event) { if (!this.props.touch.dragging) return; // only allow dragging when configured as movable if (!this.options.moveable) return; // TODO: this may be redundant in hammerjs2 // refuse to drag when we where pinching to prevent the timeline make a jump // when releasing the fingers in opposite order from the touch screen if (!this.props.touch.allowDragging) return; this.props.touch.dragging = false; if (this.body.dom.root) { this.body.dom.root.style.cursor = 'auto'; } // fire a rangechanged event this.body.emitter.emit('rangechanged', { start: new Date(this.start), end: new Date(this.end), byUser: true, event }); } /** * Event handler for mouse wheel event, used to zoom * Code from http://adomas.org/javascript-mouse-wheel/ * @param {Event} event * @private */ _onMouseWheel(event) { // retrieve delta let delta = 0; if (event.wheelDelta) { /* IE/Opera. */ delta = event.wheelDelta / 120; } else if (event.detail) { /* Mozilla case. */ // In Mozilla, sign of delta is different than in IE. // Also, delta is multiple of 3. delta = -event.detail / 3; } else if (event.deltaY) { delta = -event.deltaY / 3; } // don't allow zoom when the according key is pressed and the zoomKey option or not zoomable but movable if ((this.options.zoomKey && !event[this.options.zoomKey] && this.options.zoomable) || (!this.options.zoomable && this.options.moveable)) { return; } // only allow zooming when configured as zoomable and moveable if (!(this.options.zoomable && this.options.moveable)) return; // only zoom when the mouse is inside the current range if (!this._isInsideRange(event)) return; // If delta is nonzero, handle it. // Basically, delta is now positive if wheel was scrolled up, // and negative, if wheel was scrolled down. if (delta) { // perform the zoom action. Delta is normally 1 or -1 // adjust a negative delta such that zooming in with delta 0.1 // equals zooming out with a delta -0.1 const zoomFriction = this.options.zoomFriction || 5; let scale; if (delta < 0) { scale = 1 - (delta / zoomFriction); } else { scale = 1 / (1 + (delta / zoomFriction)) ; } // calculate center, the date to zoom around let pointerDate; if (this.rolling) { const rollingModeOffset = this.options.rollingMode && this.options.rollingMode.offset || 0.5; pointerDate = this.start + ((this.end - this.start) * rollingModeOffset); } else { const pointer = this.getPointer({x: event.clientX, y: event.clientY}, this.body.dom.center); pointerDate = this._pointerToDate(pointer); } this.zoom(scale, pointerDate, delta, event); // Prevent default actions caused by mouse wheel // (else the page and timeline both scroll) event.preventDefault(); } } /** * Start of a touch gesture * @param {Event} event * @private */ _onTouch(event) { // eslint-disable-line no-unused-vars this.props.touch.start = this.start; this.props.touch.end = this.end; this.props.touch.allowDragging = true; this.props.touch.center = null; this.props.touch.centerDate = null; this.scaleOffset = 0; this.deltaDifference = 0; // Disable the browser default handling of this event. util$3.preventDefault(event); } /** * Handle pinch event * @param {Event} event * @private */ _onPinch(event) { // only allow zooming when configured as zoomable and moveable if (!(this.options.zoomable && this.options.moveable)) return; // Disable the browser default handling of this event. util$3.preventDefault(event); this.props.touch.allowDragging = false; if (!this.props.touch.center) { this.props.touch.center = this.getPointer(event.center, this.body.dom.center); this.props.touch.centerDate = this._pointerToDate(this.props.touch.center); } this.stopRolling(); const scale = 1 / (event.scale + this.scaleOffset); const centerDate = this.props.touch.centerDate; const hiddenDuration = getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); const hiddenDurationBefore = getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, centerDate); const hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end let newStart = (centerDate - hiddenDurationBefore) + (this.props.touch.start - (centerDate - hiddenDurationBefore)) * scale; let newEnd = (centerDate + hiddenDurationAfter) + (this.props.touch.end - (centerDate + hiddenDurationAfter)) * scale; // snapping times away from hidden zones this.startToFront = 1 - scale <= 0; // used to do the right auto correction with periodic hidden times this.endToFront = scale - 1 <= 0; // used to do the right auto correction with periodic hidden times const safeStart = snapAwayFromHidden(this.body.hiddenDates, newStart, 1 - scale, true); const safeEnd = snapAwayFromHidden(this.body.hiddenDates, newEnd, scale - 1, true); if (safeStart != newStart || safeEnd != newEnd) { this.props.touch.start = safeStart; this.props.touch.end = safeEnd; this.scaleOffset = 1 - event.scale; newStart = safeStart; newEnd = safeEnd; } const options = { animation: false, byUser: true, event }; this.setRange(newStart, newEnd, options); this.startToFront = false; // revert to default this.endToFront = true; // revert to default } /** * Test whether the mouse from a mouse event is inside the visible window, * between the current start and end date * @param {Object} event * @return {boolean} Returns true when inside the visible window * @private */ _isInsideRange(event) { // calculate the time where the mouse is, check whether inside // and no scroll action should happen. const clientX = event.center ? event.center.x : event.clientX; const centerContainerRect = this.body.dom.centerContainer.getBoundingClientRect(); const x = this.options.rtl ? clientX - centerContainerRect.left : centerContainerRect.right - clientX; const time = this.body.util.toTime(x); return time >= this.start && time <= this.end; } /** * Helper function to calculate the center date for zooming * @param {{x: number, y: number}} pointer * @return {number} date * @private */ _pointerToDate(pointer) { let conversion; const direction = this.options.direction; validateDirection(direction); if (direction == 'horizontal') { return this.body.util.toTime(pointer.x).valueOf(); } else { const height = this.body.domProps.center.height; conversion = this.conversion(height); return pointer.y / conversion.scale + conversion.offset; } } /** * Get the pointer location relative to the location of the dom element * @param {{x: number, y: number}} touch * @param {Element} element HTML DOM element * @return {{x: number, y: number}} pointer * @private */ getPointer(touch, element) { const elementRect = element.getBoundingClientRect(); if (this.options.rtl) { return { x: elementRect.right - touch.x, y: touch.y - elementRect.top }; } else { return { x: touch.x - elementRect.left, y: touch.y - elementRect.top }; } } /** * Zoom the range the given scale in or out. Start and end date will * be adjusted, and the timeline will be redrawn. You can optionally give a * date around which to zoom. * For example, try scale = 0.9 or 1.1 * @param {number} scale Scaling factor. Values above 1 will zoom out, * values below 1 will zoom in. * @param {number} [center] Value representing a date around which will * be zoomed. * @param {number} delta * @param {Event} event */ zoom(scale, center, delta, event) { // if centerDate is not provided, take it half between start Date and end Date if (center == null) { center = (this.start + this.end) / 2; } const hiddenDuration = getHiddenDurationBetween(this.body.hiddenDates, this.start, this.end); const hiddenDurationBefore = getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this, center); const hiddenDurationAfter = hiddenDuration - hiddenDurationBefore; // calculate new start and end let newStart = (center-hiddenDurationBefore) + (this.start - (center-hiddenDurationBefore)) * scale; let newEnd = (center+hiddenDurationAfter) + (this.end - (center+hiddenDurationAfter)) * scale; // snapping times away from hidden zones this.startToFront = delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times this.endToFront = -delta > 0 ? false : true; // used to do the right autocorrection with periodic hidden times const safeStart = snapAwayFromHidden(this.body.hiddenDates, newStart, delta, true); const safeEnd = snapAwayFromHidden(this.body.hiddenDates, newEnd, -delta, true); if (safeStart != newStart || safeEnd != newEnd) { newStart = safeStart; newEnd = safeEnd; } const options = { animation: false, byUser: true, event }; this.setRange(newStart, newEnd, options); this.startToFront = false; // revert to default this.endToFront = true; // revert to default } /** * Move the range with a given delta to the left or right. Start and end * value will be adjusted. For example, try delta = 0.1 or -0.1 * @param {number} delta Moving amount. Positive value will move right, * negative value will move left */ move(delta) { // zoom start Date and end Date relative to the centerDate const diff = (this.end - this.start); // apply new values const newStart = this.start + diff * delta; const newEnd = this.end + diff * delta; // TODO: reckon with min and max range this.start = newStart; this.end = newEnd; } /** * Move the range to a new center point * @param {number} moveTo New center point of the range */ moveTo(moveTo) { const center = (this.start + this.end) / 2; const diff = center - moveTo; // calculate new start and end const newStart = this.start - diff; const newEnd = this.end - diff; const options = { animation: false, byUser: true, event: null }; this.setRange(newStart, newEnd, options); } } /** * Test whether direction has a valid value * @param {string} direction 'horizontal' or 'vertical' */ function validateDirection (direction) { if (direction != 'horizontal' && direction != 'vertical') { throw new TypeError(`Unknown direction "${direction}". Choose "horizontal" or "vertical".`); } } /** * Setup a mock hammer.js object, for unit testing. * * Inspiration: https://github.com/uber/deck.gl/pull/658 * * @returns {{on: noop, off: noop, destroy: noop, emit: noop, get: get}} */ function hammerMock$1() { const noop = () => {}; return { on: noop, off: noop, destroy: noop, emit: noop, get(m) { //eslint-disable-line no-unused-vars return { set: noop }; } }; } let modifiedHammer; if (typeof window !== 'undefined') { const OurHammer = window['Hammer'] || Hammer; modifiedHammer = propagating(OurHammer, { preventDefault: 'mouse' }); } else { modifiedHammer = () => // hammer.js is only available in a browser, not in node.js. Replacing it with a mock object. hammerMock$1(); } var Hammer$2 = modifiedHammer; /** * Register a touch event, taking place before a gesture * @param {Hammer} hammer A hammer instance * @param {function} callback Callback, called as callback(event) */ function onTouch (hammer, callback) { callback.inputHandler = function (event) { if (event.isFirst) { callback(event); } }; hammer.on('hammer.input', callback.inputHandler); } /** * Register a release event, taking place after a gesture * @param {Hammer} hammer A hammer instance * @param {function} callback Callback, called as callback(event) * @returns {*} */ function onRelease (hammer, callback) { callback.inputHandler = function (event) { if (event.isFinal) { callback(event); } }; return hammer.on('hammer.input', callback.inputHandler); } /** * Hack the PinchRecognizer such that it doesn't prevent default behavior * for vertical panning. * * Yeah ... this is quite a hack ... see https://github.com/hammerjs/hammer.js/issues/932 * * @param {Hammer.Pinch} pinchRecognizer * @return {Hammer.Pinch} returns the pinchRecognizer */ function disablePreventDefaultVertically (pinchRecognizer) { const TOUCH_ACTION_PAN_Y = 'pan-y'; pinchRecognizer.getTouchAction = function() { // default method returns [TOUCH_ACTION_NONE] return [TOUCH_ACTION_PAN_Y]; }; return pinchRecognizer; } /** * The class TimeStep is an iterator for dates. You provide a start date and an * end date. The class itself determines the best scale (step size) based on the * provided start Date, end Date, and minimumStep. * * If minimumStep is provided, the step size is chosen as close as possible * to the minimumStep but larger than minimumStep. If minimumStep is not * provided, the scale is set to 1 DAY. * The minimumStep should correspond with the onscreen size of about 6 characters * * Alternatively, you can set a scale by hand. * After creation, you can initialize the class by executing first(). Then you * can iterate from the start date to the end date via next(). You can check if * the end date is reached with the function hasNext(). After each step, you can * retrieve the current date via getCurrent(). * The TimeStep has scales ranging from milliseconds, seconds, minutes, hours, * days, to years. * * Version: 1.2 * */ class TimeStep { /** * @param {Date} [start] The start date, for example new Date(2010, 9, 21) * or new Date(2010, 9, 21, 23, 45, 00) * @param {Date} [end] The end date * @param {number} [minimumStep] Optional. Minimum step size in milliseconds * @param {Date|Array.<Date>} [hiddenDates] Optional. * @param {{showMajorLabels: boolean, showWeekScale: boolean}} [options] Optional. * @constructor TimeStep */ constructor(start, end, minimumStep, hiddenDates, options) { this.moment = (options && options.moment) || moment$1; this.options = options ? options : {}; // variables this.current = this.moment(); this._start = this.moment(); this._end = this.moment(); this.autoScale = true; this.scale = 'day'; this.step = 1; // initialize the range this.setRange(start, end, minimumStep); // hidden Dates options this.switchedDay = false; this.switchedMonth = false; this.switchedYear = false; if (Array.isArray(hiddenDates)) { this.hiddenDates = hiddenDates; } else if (hiddenDates != undefined) { this.hiddenDates = [hiddenDates]; } else { this.hiddenDates = []; } this.format = TimeStep.FORMAT; // default formatting } /** * Set custom constructor function for moment. Can be used to set dates * to UTC or to set a utcOffset. * @param {function} moment */ setMoment(moment) { this.moment = moment; // update the date properties, can have a new utcOffset this.current = this.moment(this.current.valueOf()); this._start = this.moment(this._start.valueOf()); this._end = this.moment(this._end.valueOf()); } /** * Set custom formatting for the minor an major labels of the TimeStep. * Both `minorLabels` and `majorLabels` are an Object with properties: * 'millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'week', 'month', 'year'. * @param {{minorLabels: Object, majorLabels: Object}} format */ setFormat(format) { const defaultFormat = util$3.deepExtend({}, TimeStep.FORMAT); this.format = util$3.deepExtend(defaultFormat, format); } /** * Set a new range * If minimumStep is provided, the step size is chosen as close as possible * to the minimumStep but larger than minimumStep. If minimumStep is not * provided, the scale is set to 1 DAY. * The minimumStep should correspond with the onscreen size of about 6 characters * @param {Date} [start] The start date and time. * @param {Date} [end] The end date and time. * @param {int} [minimumStep] Optional. Minimum step size in milliseconds */ setRange(start, end, minimumStep) { if (!(start instanceof Date) || !(end instanceof Date)) { throw "No legal start or end date in method setRange"; } this._start = (start != undefined) ? this.moment(start.valueOf()) : Date.now(); this._end = (end != undefined) ? this.moment(end.valueOf()) : Date.now(); if (this.autoScale) { this.setMinimumStep(minimumStep); } } /** * Set the range iterator to the start date. */ start() { this.current = this._start.clone(); this.roundToMinor(); } /** * Round the current date to the first minor date value * This must be executed once when the current date is set to start Date */ roundToMinor() { // round to floor // to prevent year & month scales rounding down to the first day of week we perform this separately if (this.scale == 'week') { this.current.weekday(0); } // IMPORTANT: we have no breaks in this switch! (this is no bug) // noinspection FallThroughInSwitchStatementJS switch (this.scale) { case 'year': this.current.year(this.step * Math.floor(this.current.year() / this.step)); this.current.month(0); case 'month': this.current.date(1); // eslint-disable-line no-fallthrough case 'week': // eslint-disable-line no-fallthrough case 'day': // eslint-disable-line no-fallthrough case 'weekday': this.current.hours(0); // eslint-disable-line no-fallthrough case 'hour': this.current.minutes(0); // eslint-disable-line no-fallthrough case 'minute': this.current.seconds(0); // eslint-disable-line no-fallthrough case 'second': this.current.milliseconds(0); // eslint-disable-line no-fallthrough //case 'millisecond': // nothing to do for milliseconds } if (this.step != 1) { // round down to the first minor value that is a multiple of the current step size let priorCurrent = this.current.clone(); switch (this.scale) { case 'millisecond': this.current.subtract(this.current.milliseconds() % this.step, 'milliseconds'); break; case 'second': this.current.subtract(this.current.seconds() % this.step, 'seconds'); break; case 'minute': this.current.subtract(this.current.minutes() % this.step, 'minutes'); break; case 'hour': this.current.subtract(this.current.hours() % this.step, 'hours'); break; case 'weekday': // intentional fall through case 'day': this.current.subtract((this.current.date() - 1) % this.step, 'day'); break; case 'week': this.current.subtract(this.current.week() % this.step, 'week'); break; case 'month': this.current.subtract(this.current.month() % this.step, 'month'); break; case 'year': this.current.subtract(this.current.year() % this.step, 'year'); break; } if (!priorCurrent.isSame(this.current)) { this.current = this.moment(snapAwayFromHidden(this.hiddenDates, this.current.valueOf(), -1, true)); } } } /** * Check if the there is a next step * @return {boolean} true if the current date has not passed the end date */ hasNext() { return (this.current.valueOf() <= this._end.valueOf()); } /** * Do the next step */ next() { const prev = this.current.valueOf(); // Two cases, needed to prevent issues with switching daylight savings // (end of March and end of October) switch (this.scale) { case 'millisecond': this.current.add(this.step, 'millisecond'); break; case 'second': this.current.add(this.step, 'second'); break; case 'minute': this.current.add(this.step, 'minute'); break; case 'hour': this.current.add(this.step, 'hour'); if (this.current.month() < 6) { this.current.subtract(this.current.hours() % this.step, 'hour'); } else { if (this.current.hours() % this.step !== 0) { this.current.add(this.step - this.current.hours() % this.step, 'hour'); } } break; case 'weekday': // intentional fall through case 'day': this.current.add(this.step, 'day'); break; case 'week': if (this.current.weekday() !== 0){ // we had a month break not correlating with a week's start before this.current.weekday(0); // switch back to week cycles this.current.add(this.step, 'week'); } else if(this.options.showMajorLabels === false) { this.current.add(this.step, 'week'); // the default case } else { // first day of the week const nextWeek = this.current.clone(); nextWeek.add(1, 'week'); if(nextWeek.isSame(this.current, 'month')){ // is the first day of the next week in the same month? this.current.add(this.step, 'week'); // the default case } else { // inject a step at each first day of the month this.current.add(this.step, 'week'); this.current.date(1); } } break; case 'month': this.current.add(this.step, 'month'); break; case 'year': this.current.add(this.step, 'year'); break; } if (this.step != 1) { // round down to the correct major value switch (this.scale) { case 'millisecond': if(this.current.milliseconds() > 0 && this.current.milliseconds() < this.step) this.current.milliseconds(0); break; case 'second': if(this.current.seconds() > 0 && this.current.seconds() < this.step) this.current.seconds(0); break; case 'minute': if(this.current.minutes() > 0 && this.current.minutes() < this.step) this.current.minutes(0); break; case 'hour': if(this.current.hours() > 0 && this.current.hours() < this.step) this.current.hours(0); break; case 'weekday': // intentional fall through case 'day': if(this.current.date() < this.step+1) this.current.date(1); break; case 'week': if(this.current.week() < this.step) this.current.week(1); break; // week numbering starts at 1, not 0 case 'month': if(this.current.month() < this.step) this.current.month(0); break; } } // safety mechanism: if current time is still unchanged, move to the end if (this.current.valueOf() == prev) { this.current = this._end.clone(); } // Reset switches for year, month and day. Will get set to true where appropriate in DateUtil.stepOverHiddenDates this.switchedDay = false; this.switchedMonth = false; this.switchedYear = false; stepOverHiddenDates(this.moment, this, prev); } /** * Get the current datetime * @return {Moment} current The current date */ getCurrent() { return this.current.clone(); } /** * Set a custom scale. Autoscaling will be disabled. * For example setScale('minute', 5) will result * in minor steps of 5 minutes, and major steps of an hour. * * @param {{scale: string, step: number}} params * An object containing two properties: * - A string 'scale'. Choose from 'millisecond', 'second', * 'minute', 'hour', 'weekday', 'day', 'week', 'month', 'year'. * - A number 'step'. A step size, by default 1. * Choose for example 1, 2, 5, or 10. */ setScale(params) { if (params && typeof params.scale == 'string') { this.scale = params.scale; this.step = params.step > 0 ? params.step : 1; this.autoScale = false; } } /** * Enable or disable autoscaling * @param {boolean} enable If true, autoascaling is set true */ setAutoScale(enable) { this.autoScale = enable; } /** * Automatically determine the scale that bests fits the provided minimum step * @param {number} [minimumStep] The minimum step size in milliseconds */ setMinimumStep(minimumStep) { if (minimumStep == undefined) { return; } //var b = asc + ds; const stepYear = (1000 * 60 * 60 * 24 * 30 * 12); const stepMonth = (1000 * 60 * 60 * 24 * 30); const stepDay = (1000 * 60 * 60 * 24); const stepHour = (1000 * 60 * 60); const stepMinute = (1000 * 60); const stepSecond = (1000); const stepMillisecond= (1); // find the smallest step that is larger than the provided minimumStep if (stepYear*1000 > minimumStep) {this.scale = 'year'; this.step = 1000;} if (stepYear*500 > minimumStep) {this.scale = 'year'; this.step = 500;} if (stepYear*100 > minimumStep) {this.scale = 'year'; this.step = 100;} if (stepYear*50 > minimumStep) {this.scale = 'year'; this.step = 50;} if (stepYear*10 > minimumStep) {this.scale = 'year'; this.step = 10;} if (stepYear*5 > minimumStep) {this.scale = 'year'; this.step = 5;} if (stepYear > minimumStep) {this.scale = 'year'; this.step = 1;} if (stepMonth*3 > minimumStep) {this.scale = 'month'; this.step = 3;} if (stepMonth > minimumStep) {this.scale = 'month'; this.step = 1;} if (stepDay*7 > minimumStep && this.options.showWeekScale) {this.scale = 'week'; this.step = 1;} if (stepDay*2 > minimumStep) {this.scale = 'day'; this.step = 2;} if (stepDay > minimumStep) {this.scale = 'day'; this.step = 1;} if (stepDay/2 > minimumStep) {this.scale = 'weekday'; this.step = 1;} if (stepHour*4 > minimumStep) {this.scale = 'hour'; this.step = 4;} if (stepHour > minimumStep) {this.scale = 'hour'; this.step = 1;} if (stepMinute*15 > minimumStep) {this.scale = 'minute'; this.step = 15;} if (stepMinute*10 > minimumStep) {this.scale = 'minute'; this.step = 10;} if (stepMinute*5 > minimumStep) {this.scale = 'minute'; this.step = 5;} if (stepMinute > minimumStep) {this.scale = 'minute'; this.step = 1;} if (stepSecond*15 > minimumStep) {this.scale = 'second'; this.step = 15;} if (stepSecond*10 > minimumStep) {this.scale = 'second'; this.step = 10;} if (stepSecond*5 > minimumStep) {this.scale = 'second'; this.step = 5;} if (stepSecond > minimumStep) {this.scale = 'second'; this.step = 1;} if (stepMillisecond*200 > minimumStep) {this.scale = 'millisecond'; this.step = 200;} if (stepMillisecond*100 > minimumStep) {this.scale = 'millisecond'; this.step = 100;} if (stepMillisecond*50 > minimumStep) {this.scale = 'millisecond'; this.step = 50;} if (stepMillisecond*10 > minimumStep) {this.scale = 'millisecond'; this.step = 10;} if (stepMillisecond*5 > minimumStep) {this.scale = 'millisecond'; this.step = 5;} if (stepMillisecond > minimumStep) {this.scale = 'millisecond'; this.step = 1;} } /** * Snap a date to a rounded value. * The snap intervals are dependent on the current scale and step. * Static function * @param {Date} date the date to be snapped. * @param {string} scale Current scale, can be 'millisecond', 'second', * 'minute', 'hour', 'weekday, 'day', 'week', 'month', 'year'. * @param {number} step Current step (1, 2, 4, 5, ... * @return {Date} snappedDate */ static snap(date, scale, step) { const clone = moment$1(date); if (scale == 'year') { const year = clone.year() + Math.round(clone.month() / 12); clone.year(Math.round(year / step) * step); clone.month(0); clone.date(0); clone.hours(0); clone.minutes(0); clone.seconds(0); clone.milliseconds(0); } else if (scale == 'month') { if (clone.date() > 15) { clone.date(1); clone.add(1, 'month'); // important: first set Date to 1, after that change the month. } else { clone.date(1); } clone.hours(0); clone.minutes(0); clone.seconds(0); clone.milliseconds(0); } else if (scale == 'week') { if (clone.weekday() > 2) { // doing it the momentjs locale aware way clone.weekday(0); clone.add(1, 'week'); } else { clone.weekday(0); } clone.hours(0); clone.minutes(0); clone.seconds(0); clone.milliseconds(0); } else if (scale == 'day') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 5: case 2: clone.hours(Math.round(clone.hours() / 24) * 24); break; default: clone.hours(Math.round(clone.hours() / 12) * 12); break; } clone.minutes(0); clone.seconds(0); clone.milliseconds(0); } else if (scale == 'weekday') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 5: case 2: clone.hours(Math.round(clone.hours() / 12) * 12); break; default: clone.hours(Math.round(clone.hours() / 6) * 6); break; } clone.minutes(0); clone.seconds(0); clone.milliseconds(0); } else if (scale == 'hour') { switch (step) { case 4: clone.minutes(Math.round(clone.minutes() / 60) * 60); break; default: clone.minutes(Math.round(clone.minutes() / 30) * 30); break; } clone.seconds(0); clone.milliseconds(0); } else if (scale == 'minute') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 15: case 10: clone.minutes(Math.round(clone.minutes() / 5) * 5); clone.seconds(0); break; case 5: clone.seconds(Math.round(clone.seconds() / 60) * 60); break; default: clone.seconds(Math.round(clone.seconds() / 30) * 30); break; } clone.milliseconds(0); } else if (scale == 'second') { //noinspection FallthroughInSwitchStatementJS switch (step) { case 15: case 10: clone.seconds(Math.round(clone.seconds() / 5) * 5); clone.milliseconds(0); break; case 5: clone.milliseconds(Math.round(clone.milliseconds() / 1000) * 1000); break; default: clone.milliseconds(Math.round(clone.milliseconds() / 500) * 500); break; } } else if (scale == 'millisecond') { const _step = step > 5 ? step / 2 : 1; clone.milliseconds(Math.round(clone.milliseconds() / _step) * _step); } return clone; } /** * Check if the current value is a major value (for example when the step * is DAY, a major value is each first day of the MONTH) * @return {boolean} true if current date is major, else false. */ isMajor() { if (this.switchedYear == true) { switch (this.scale) { case 'year': case 'month': case 'week': case 'weekday': case 'day': case 'hour': case 'minute': case 'second': case 'millisecond': return true; default: return false; } } else if (this.switchedMonth == true) { switch (this.scale) { case 'week': case 'weekday': case 'day': case 'hour': case 'minute': case 'second': case 'millisecond': return true; default: return false; } } else if (this.switchedDay == true) { switch (this.scale) { case 'millisecond': case 'second': case 'minute': case 'hour': return true; default: return false; } } const date = this.moment(this.current); switch (this.scale) { case 'millisecond': return (date.milliseconds() == 0); case 'second': return (date.seconds() == 0); case 'minute': return (date.hours() == 0) && (date.minutes() == 0); case 'hour': return (date.hours() == 0); case 'weekday': // intentional fall through case 'day': return (date.date() == 1); case 'week': return (date.date() == 1); case 'month': return (date.month() == 0); case 'year': return false; default: return false; } } /** * Returns formatted text for the minor axislabel, depending on the current * date and the scale. For example when scale is MINUTE, the current time is * formatted as "hh:mm". * @param {Date} [date=this.current] custom date. if not provided, current date is taken * @returns {String} */ getLabelMinor(date) { if (date == undefined) { date = this.current; } if (date instanceof Date) { date = this.moment(date); } if (typeof(this.format.minorLabels) === "function") { return this.format.minorLabels(date, this.scale, this.step); } const format = this.format.minorLabels[this.scale]; // noinspection FallThroughInSwitchStatementJS switch (this.scale) { case 'week': // Don't draw the minor label if this date is the first day of a month AND if it's NOT the start of the week. // The 'date' variable may actually be the 'next' step when called from TimeAxis' _repaintLabels. if(date.date() === 1 && date.weekday() !== 0){ return ""; } default: // eslint-disable-line no-fallthrough return (format && format.length > 0) ? this.moment(date).format(format) : ''; } } /** * Returns formatted text for the major axis label, depending on the current * date and the scale. For example when scale is MINUTE, the major scale is * hours, and the hour will be formatted as "hh". * @param {Date} [date=this.current] custom date. if not provided, current date is taken * @returns {String} */ getLabelMajor(date) { if (date == undefined) { date = this.current; } if (date instanceof Date) { date = this.moment(date); } if (typeof(this.format.majorLabels) === "function") { return this.format.majorLabels(date, this.scale, this.step); } const format = this.format.majorLabels[this.scale]; return (format && format.length > 0) ? this.moment(date).format(format) : ''; } /** * get class name * @return {string} class name */ getClassName() { const _moment = this.moment; const m = this.moment(this.current); const current = m.locale ? m.locale('en') : m.lang('en'); // old versions of moment have .lang() function const step = this.step; const classNames = []; /** * * @param {number} value * @returns {String} */ function even(value) { return (value / step % 2 == 0) ? ' vis-even' : ' vis-odd'; } /** * * @param {Date} date * @returns {String} */ function today(date) { if (date.isSame(Date.now(), 'day')) { return ' vis-today'; } if (date.isSame(_moment().add(1, 'day'), 'day')) { return ' vis-tomorrow'; } if (date.isSame(_moment().add(-1, 'day'), 'day')) { return ' vis-yesterday'; } return ''; } /** * * @param {Date} date * @returns {String} */ function currentWeek(date) { return date.isSame(Date.now(), 'week') ? ' vis-current-week' : ''; } /** * * @param {Date} date * @returns {String} */ function currentMonth(date) { return date.isSame(Date.now(), 'month') ? ' vis-current-month' : ''; } /** * * @param {Date} date * @returns {String} */ function currentYear(date) { return date.isSame(Date.now(), 'year') ? ' vis-current-year' : ''; } switch (this.scale) { case 'millisecond': classNames.push(today(current)); classNames.push(even(current.milliseconds())); break; case 'second': classNames.push(today(current)); classNames.push(even(current.seconds())); break; case 'minute': classNames.push(today(current)); classNames.push(even(current.minutes())); break; case 'hour': classNames.push(`vis-h${current.hours()}${this.step == 4 ? '-h' + (current.hours() + 4) : ''}`); classNames.push(today(current)); classNames.push(even(current.hours())); break; case 'weekday': classNames.push(`vis-${current.format('dddd').toLowerCase()}`); classNames.push(today(current)); classNames.push(currentWeek(current)); classNames.push(even(current.date())); break; case 'day': classNames.push(`vis-day${current.date()}`); classNames.push(`vis-${current.format('MMMM').toLowerCase()}`); classNames.push(today(current)); classNames.push(currentMonth(current)); classNames.push(this.step <= 2 ? today(current) : ''); classNames.push(this.step <= 2 ? `vis-${current.format('dddd').toLowerCase()}` : ''); classNames.push(even(current.date() - 1)); break; case 'week': classNames.push(`vis-week${current.format('w')}`); classNames.push(currentWeek(current)); classNames.push(even(current.week())); break; case 'month': classNames.push(`vis-${current.format('MMMM').toLowerCase()}`); classNames.push(currentMonth(current)); classNames.push(even(current.month())); break; case 'year': classNames.push(`vis-year${current.year()}`); classNames.push(currentYear(current)); classNames.push(even(current.year())); break; } return classNames.filter(String).join(" "); } } // Time formatting TimeStep.FORMAT = { minorLabels: { millisecond:'SSS', second: 's', minute: 'HH:mm', hour: 'HH:mm', weekday: 'ddd D', day: 'D', week: 'w', month: 'MMM', year: 'YYYY' }, majorLabels: { millisecond:'HH:mm:ss', second: 'D MMMM HH:mm', minute: 'ddd D MMMM', hour: 'ddd D MMMM', weekday: 'MMMM YYYY', day: 'MMMM YYYY', week: 'MMMM YYYY', month: 'YYYY', year: '' } }; /** A horizontal time axis */ class TimeAxis extends Component { /** * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body * @param {Object} [options] See TimeAxis.setOptions for the available * options. * @constructor TimeAxis * @extends Component */ constructor(body, options) { super(); this.dom = { foreground: null, lines: [], majorTexts: [], minorTexts: [], redundant: { lines: [], majorTexts: [], minorTexts: [] } }; this.props = { range: { start: 0, end: 0, minimumStep: 0 }, lineTop: 0 }; this.defaultOptions = { orientation: { axis: 'bottom' }, // axis orientation: 'top' or 'bottom' showMinorLabels: true, showMajorLabels: true, showWeekScale: false, maxMinorChars: 7, format: util$3.extend({}, TimeStep.FORMAT), moment: moment$1, timeAxis: null }; this.options = util$3.extend({}, this.defaultOptions); this.body = body; // create the HTML DOM this._create(); this.setOptions(options); } /** * Set options for the TimeAxis. * Parameters will be merged in current options. * @param {Object} options Available options: * {string} [orientation.axis] * {boolean} [showMinorLabels] * {boolean} [showMajorLabels] * {boolean} [showWeekScale] */ setOptions(options) { if (options) { // copy all options that we know util$3.selectiveExtend([ 'showMinorLabels', 'showMajorLabels', 'showWeekScale', 'maxMinorChars', 'hiddenDates', 'timeAxis', 'moment', 'rtl' ], this.options, options); // deep copy the format options util$3.selectiveDeepExtend(['format'], this.options, options); if ('orientation' in options) { if (typeof options.orientation === 'string') { this.options.orientation.axis = options.orientation; } else if (typeof options.orientation === 'object' && 'axis' in options.orientation) { this.options.orientation.axis = options.orientation.axis; } } // apply locale to moment.js // TODO: not so nice, this is applied globally to moment.js if ('locale' in options) { if (typeof moment$1.locale === 'function') { // moment.js 2.8.1+ moment$1.locale(options.locale); } else { moment$1.lang(options.locale); } } } } /** * Create the HTML DOM for the TimeAxis */ _create() { this.dom.foreground = document.createElement('div'); this.dom.background = document.createElement('div'); this.dom.foreground.className = 'vis-time-axis vis-foreground'; this.dom.background.className = 'vis-time-axis vis-background'; } /** * Destroy the TimeAxis */ destroy() { // remove from DOM if (this.dom.foreground.parentNode) { this.dom.foreground.parentNode.removeChild(this.dom.foreground); } if (this.dom.background.parentNode) { this.dom.background.parentNode.removeChild(this.dom.background); } this.body = null; } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { const props = this.props; const foreground = this.dom.foreground; const background = this.dom.background; // determine the correct parent DOM element (depending on option orientation) const parent = (this.options.orientation.axis == 'top') ? this.body.dom.top : this.body.dom.bottom; const parentChanged = (foreground.parentNode !== parent); // calculate character width and height this._calculateCharSize(); // TODO: recalculate sizes only needed when parent is resized or options is changed const showMinorLabels = this.options.showMinorLabels && this.options.orientation.axis !== 'none'; const showMajorLabels = this.options.showMajorLabels && this.options.orientation.axis !== 'none'; // determine the width and height of the elemens for the axis props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; props.height = props.minorLabelHeight + props.majorLabelHeight; props.width = foreground.offsetWidth; props.minorLineHeight = this.body.domProps.root.height - props.majorLabelHeight - (this.options.orientation.axis == 'top' ? this.body.domProps.bottom.height : this.body.domProps.top.height); props.minorLineWidth = 1; // TODO: really calculate width props.majorLineHeight = props.minorLineHeight + props.majorLabelHeight; props.majorLineWidth = 1; // TODO: really calculate width // take foreground and background offline while updating (is almost twice as fast) const foregroundNextSibling = foreground.nextSibling; const backgroundNextSibling = background.nextSibling; foreground.parentNode && foreground.parentNode.removeChild(foreground); background.parentNode && background.parentNode.removeChild(background); foreground.style.height = `${this.props.height}px`; this._repaintLabels(); // put DOM online again (at the same place) if (foregroundNextSibling) { parent.insertBefore(foreground, foregroundNextSibling); } else { parent.appendChild(foreground); } if (backgroundNextSibling) { this.body.dom.backgroundVertical.insertBefore(background, backgroundNextSibling); } else { this.body.dom.backgroundVertical.appendChild(background); } return this._isResized() || parentChanged; } /** * Repaint major and minor text labels and vertical grid lines * @private */ _repaintLabels() { const orientation = this.options.orientation.axis; // calculate range and step (step such that we have space for 7 characters per label) const start = util$3.convert(this.body.range.start, 'Number'); const end = util$3.convert(this.body.range.end, 'Number'); const timeLabelsize = this.body.util.toTime((this.props.minorCharWidth || 10) * this.options.maxMinorChars).valueOf(); let minimumStep = timeLabelsize - getHiddenDurationBefore(this.options.moment, this.body.hiddenDates, this.body.range, timeLabelsize); minimumStep -= this.body.util.toTime(0).valueOf(); const step = new TimeStep(new Date(start), new Date(end), minimumStep, this.body.hiddenDates, this.options); step.setMoment(this.options.moment); if (this.options.format) { step.setFormat(this.options.format); } if (this.options.timeAxis) { step.setScale(this.options.timeAxis); } this.step = step; // Move all DOM elements to a "redundant" list, where they // can be picked for re-use, and clear the lists with lines and texts. // At the end of the function _repaintLabels, left over elements will be cleaned up const dom = this.dom; dom.redundant.lines = dom.lines; dom.redundant.majorTexts = dom.majorTexts; dom.redundant.minorTexts = dom.minorTexts; dom.lines = []; dom.majorTexts = []; dom.minorTexts = []; let current; let next; let x; let xNext; let isMajor; let showMinorGrid; let width = 0; let prevWidth; let line; let xFirstMajorLabel = undefined; let count = 0; const MAX = 1000; let className; step.start(); next = step.getCurrent(); xNext = this.body.util.toScreen(next); while (step.hasNext() && count < MAX) { count++; isMajor = step.isMajor(); className = step.getClassName(); current = next; x = xNext; step.next(); next = step.getCurrent(); xNext = this.body.util.toScreen(next); prevWidth = width; width = xNext - x; switch (step.scale) { case 'week': showMinorGrid = true; break; default: showMinorGrid = (width >= prevWidth * 0.4); break; // prevent displaying of the 31th of the month on a scale of 5 days } if (this.options.showMinorLabels && showMinorGrid) { var label = this._repaintMinorText(x, step.getLabelMinor(current), orientation, className); label.style.width = `${width}px`; // set width to prevent overflow } if (isMajor && this.options.showMajorLabels) { if (x > 0) { if (xFirstMajorLabel == undefined) { xFirstMajorLabel = x; } label = this._repaintMajorText(x, step.getLabelMajor(current), orientation, className); } line = this._repaintMajorLine(x, width, orientation, className); } else { // minor line if (showMinorGrid) { line = this._repaintMinorLine(x, width, orientation, className); } else { if (line) { // adjust the width of the previous grid line.style.width = `${parseInt(line.style.width) + width}px`; } } } } if (count === MAX && !warnedForOverflow) { console.warn(`Something is wrong with the Timeline scale. Limited drawing of grid lines to ${MAX} lines.`); warnedForOverflow = true; } // create a major label on the left when needed if (this.options.showMajorLabels) { const leftTime = this.body.util.toTime(0); // upper bound estimation const leftText = step.getLabelMajor(leftTime); const widthText = leftText.length * (this.props.majorCharWidth || 10) + 10; if (xFirstMajorLabel == undefined || widthText < xFirstMajorLabel) { this._repaintMajorText(0, leftText, orientation, className); } } // Cleanup leftover DOM elements from the redundant list util$3.forEach(this.dom.redundant, arr => { while (arr.length) { const elem = arr.pop(); if (elem && elem.parentNode) { elem.parentNode.removeChild(elem); } } }); } /** * Create a minor label for the axis at position x * @param {number} x * @param {string} text * @param {string} orientation "top" or "bottom" (default) * @param {string} className * @return {Element} Returns the HTML element of the created label * @private */ _repaintMinorText(x, text, orientation, className) { // reuse redundant label let label = this.dom.redundant.minorTexts.shift(); if (!label) { // create new label const content = document.createTextNode(''); label = document.createElement('div'); label.appendChild(content); this.dom.foreground.appendChild(label); } this.dom.minorTexts.push(label); label.innerHTML = util$3.xss(text); let y = (orientation == 'top') ? this.props.majorLabelHeight : 0; this._setXY(label, x, y); label.className = `vis-text vis-minor ${className}`; //label.title = title; // TODO: this is a heavy operation return label; } /** * Create a Major label for the axis at position x * @param {number} x * @param {string} text * @param {string} orientation "top" or "bottom" (default) * @param {string} className * @return {Element} Returns the HTML element of the created label * @private */ _repaintMajorText(x, text, orientation, className) { // reuse redundant label let label = this.dom.redundant.majorTexts.shift(); if (!label) { // create label const content = document.createElement('div'); label = document.createElement('div'); label.appendChild(content); this.dom.foreground.appendChild(label); } label.childNodes[0].innerHTML = util$3.xss(text); label.className = `vis-text vis-major ${className}`; //label.title = title; // TODO: this is a heavy operation let y = (orientation == 'top') ? 0 : this.props.minorLabelHeight; this._setXY(label, x, y); this.dom.majorTexts.push(label); return label; } /** * sets xy * @param {string} label * @param {number} x * @param {number} y * @private */ _setXY(label, x, y) { // If rtl is true, inverse x. const directionX = this.options.rtl ? (x * -1) : x; label.style.transform = `translate(${directionX}px, ${y}px)`; } /** * Create a minor line for the axis at position x * @param {number} left * @param {number} width * @param {string} orientation "top" or "bottom" (default) * @param {string} className * @return {Element} Returns the created line * @private */ _repaintMinorLine(left, width, orientation, className) { // reuse redundant line let line = this.dom.redundant.lines.shift(); if (!line) { // create vertical line line = document.createElement('div'); this.dom.background.appendChild(line); } this.dom.lines.push(line); const props = this.props; line.style.width = `${width}px`; line.style.height = `${props.minorLineHeight}px`; let y = (orientation == 'top') ? props.majorLabelHeight : this.body.domProps.top.height; let x = left - props.minorLineWidth / 2; this._setXY(line, x, y); line.className = `vis-grid ${this.options.rtl ? 'vis-vertical-rtl' : 'vis-vertical'} vis-minor ${className}`; return line; } /** * Create a Major line for the axis at position x * @param {number} left * @param {number} width * @param {string} orientation "top" or "bottom" (default) * @param {string} className * @return {Element} Returns the created line * @private */ _repaintMajorLine(left, width, orientation, className) { // reuse redundant line let line = this.dom.redundant.lines.shift(); if (!line) { // create vertical line line = document.createElement('div'); this.dom.background.appendChild(line); } this.dom.lines.push(line); const props = this.props; line.style.width = `${width}px`; line.style.height = `${props.majorLineHeight}px`; let y = (orientation == 'top') ? 0 : this.body.domProps.top.height; let x = left - props.majorLineWidth / 2; this._setXY(line, x, y); line.className = `vis-grid ${this.options.rtl ? 'vis-vertical-rtl' : 'vis-vertical'} vis-major ${className}`; return line; } /** * Determine the size of text on the axis (both major and minor axis). * The size is calculated only once and then cached in this.props. * @private */ _calculateCharSize() { // Note: We calculate char size with every redraw. Size may change, for // example when any of the timelines parents had display:none for example. // determine the char width and height on the minor axis if (!this.dom.measureCharMinor) { this.dom.measureCharMinor = document.createElement('DIV'); this.dom.measureCharMinor.className = 'vis-text vis-minor vis-measure'; this.dom.measureCharMinor.style.position = 'absolute'; this.dom.measureCharMinor.appendChild(document.createTextNode('0')); this.dom.foreground.appendChild(this.dom.measureCharMinor); } this.props.minorCharHeight = this.dom.measureCharMinor.clientHeight; this.props.minorCharWidth = this.dom.measureCharMinor.clientWidth; // determine the char width and height on the major axis if (!this.dom.measureCharMajor) { this.dom.measureCharMajor = document.createElement('DIV'); this.dom.measureCharMajor.className = 'vis-text vis-major vis-measure'; this.dom.measureCharMajor.style.position = 'absolute'; this.dom.measureCharMajor.appendChild(document.createTextNode('0')); this.dom.foreground.appendChild(this.dom.measureCharMajor); } this.props.majorCharHeight = this.dom.measureCharMajor.clientHeight; this.props.majorCharWidth = this.dom.measureCharMajor.clientWidth; } } var warnedForOverflow = false; /** * Turn an element into an clickToUse element. * When not active, the element has a transparent overlay. When the overlay is * clicked, the mode is changed to active. * When active, the element is displayed with a blue border around it, and * the interactive contents of the element can be used. When clicked outside * the element, the elements mode is changed to inactive. * @param {Element} container * @constructor Activator */ function Activator$2(container) { this.active = false; this.dom = { container: container }; this.dom.overlay = document.createElement('div'); this.dom.overlay.className = 'vis-overlay'; this.dom.container.appendChild(this.dom.overlay); this.hammer = Hammer$2(this.dom.overlay); this.hammer.on('tap', this._onTapOverlay.bind(this)); // block all touch events (except tap) var me = this; var events = [ 'tap', 'doubletap', 'press', 'pinch', 'pan', 'panstart', 'panmove', 'panend' ]; events.forEach(function (event) { me.hammer.on(event, function (event) { event.stopPropagation(); }); }); // attach a click event to the window, in order to deactivate when clicking outside the timeline if (document && document.body) { this.onClick = function (event) { if (!_hasParent$1(event.target, container)) { me.deactivate(); } }; document.body.addEventListener('click', this.onClick); } if (this.keycharm !== undefined) { this.keycharm.destroy(); } this.keycharm = keycharm(); // keycharm listener only bounded when active) this.escListener = this.deactivate.bind(this); } // turn into an event emitter componentEmitter(Activator$2.prototype); // The currently active activator Activator$2.current = null; /** * Destroy the activator. Cleans up all created DOM and event listeners */ Activator$2.prototype.destroy = function () { this.deactivate(); // remove dom this.dom.overlay.parentNode.removeChild(this.dom.overlay); // remove global event listener if (this.onClick) { document.body.removeEventListener('click', this.onClick); } // remove keycharm if (this.keycharm !== undefined) { this.keycharm.destroy(); } this.keycharm = null; // cleanup hammer instances this.hammer.destroy(); this.hammer = null; // FIXME: cleaning up hammer instances doesn't work (Timeline not removed from memory) }; /** * Activate the element * Overlay is hidden, element is decorated with a blue shadow border */ Activator$2.prototype.activate = function () { // we allow only one active activator at a time if (Activator$2.current) { Activator$2.current.deactivate(); } Activator$2.current = this; this.active = true; this.dom.overlay.style.display = 'none'; util$3.addClassName(this.dom.container, 'vis-active'); this.emit('change'); this.emit('activate'); // ugly hack: bind ESC after emitting the events, as the Network rebinds all // keyboard events on a 'change' event this.keycharm.bind('esc', this.escListener); }; /** * Deactivate the element * Overlay is displayed on top of the element */ Activator$2.prototype.deactivate = function () { if (Activator$2.current === this) { Activator$2.current = null; } this.active = false; this.dom.overlay.style.display = ''; util$3.removeClassName(this.dom.container, 'vis-active'); this.keycharm.unbind('esc', this.escListener); this.emit('change'); this.emit('deactivate'); }; /** * Handle a tap event: activate the container * @param {Event} event The event * @private */ Activator$2.prototype._onTapOverlay = function (event) { // activate the container this.activate(); event.stopPropagation(); }; /** * Test whether the element has the requested parent element somewhere in * its chain of parent nodes. * @param {HTMLElement} element * @param {HTMLElement} parent * @returns {boolean} Returns true when the parent is found somewhere in the * chain of parent nodes. * @private */ function _hasParent$1(element, parent) { while (element) { if (element === parent) { return true } element = element.parentNode; } return false; } /* * IMPORTANT: Locales for Moment has to be imported in the legacy and standalone * entry points. For the peer build it's users responsibility to do so. */ // English const en = { current: 'current', time: 'time', deleteSelected: 'Delete selected', }; const en_EN = en; const en_US = en; // Italiano const it = { current: 'attuale', time: 'tempo', deleteSelected: 'Cancella la selezione', }; const it_IT = it; const it_CH = it; // Dutch const nl = { current: 'huidige', time: 'tijd', deleteSelected: 'Selectie verwijderen' }; const nl_NL = nl; const nl_BE = nl; // German const de = { current: 'Aktuelle', time: 'Zeit', deleteSelected: 'L\u00f6sche Auswahl', }; const de_DE = de; // French const fr = { current: 'actuel', time: 'heure', deleteSelected: 'Effacer la selection', }; const fr_FR = fr; const fr_CA = fr; const fr_BE = fr; // Espanol const es = { current: 'corriente', time: 'hora', deleteSelected: 'Eliminar selecci\u00f3n', }; const es_ES = es; // Ukrainian const uk = { current: 'поточний', time: 'час', deleteSelected: 'Видалити обране', }; const uk_UA = uk; // Russian const ru = { current: 'текущее', time: 'время', deleteSelected: 'Удалить выбранное', }; const ru_RU = ru; // Polish const pl = { current: 'aktualny', time: 'czas', deleteSelected: 'Usuń wybrane', }; const pl_PL = pl; // Portuguese const pt = { current: 'atual', time: 'data', deleteSelected: 'Apagar selecionado', }; const pt_BR = pt; const pt_PT = pt; // Japanese const ja = { current: '現在', time: '時刻', deleteSelected: '選択されたものを削除', }; const ja_JP = ja; const locales = { en, en_EN, en_US, it, it_IT, it_CH, nl, nl_NL, nl_BE, de, de_DE, fr, fr_FR, fr_CA, fr_BE, es, es_ES, uk, uk_UA, ru, ru_RU, pl, pl_PL, pt, pt_BR, pt_PT, ja, ja_JP, }; /** A custom time bar */ class CustomTime extends Component { /** * @param {{range: Range, dom: Object}} body * @param {Object} [options] Available parameters: * {number | string} id * {string} locales * {string} locale * @constructor CustomTime * @extends Component */ constructor(body, options) { super(); this.body = body; // default options this.defaultOptions = { moment: moment$1, locales, locale: 'en', id: undefined, title: undefined }; this.options = util$3.extend({}, this.defaultOptions); this.setOptions(options); this.options.locales = util$3.extend({}, locales, this.options.locales); const defaultLocales = this.defaultOptions.locales[this.defaultOptions.locale]; Object.keys(this.options.locales).forEach(locale => { this.options.locales[locale] = util$3.extend( {}, defaultLocales, this.options.locales[locale] ); }); if (options && options.time != null) { this.customTime = options.time; } else { this.customTime = new Date(); } this.eventParams = {}; // stores state parameters while dragging the bar // create the DOM this._create(); } /** * Set options for the component. Options will be merged in current options. * @param {Object} options Available parameters: * {number | string} id * {string} locales * {string} locale */ setOptions(options) { if (options) { // copy all options that we know util$3.selectiveExtend(['moment', 'locale', 'locales', 'id', 'title', 'rtl', 'snap'], this.options, options); } } /** * Create the DOM for the custom time * @private */ _create() { const bar = document.createElement('div'); bar['custom-time'] = this; bar.className = `vis-custom-time ${this.options.id || ''}`; bar.style.position = 'absolute'; bar.style.top = '0px'; bar.style.height = '100%'; this.bar = bar; const drag = document.createElement('div'); drag.style.position = 'relative'; drag.style.top = '0px'; if(this.options.rtl) { drag.style.right = '-10px'; } else { drag.style.left = '-10px'; } drag.style.height = '100%'; drag.style.width = '20px'; /** * * @param {WheelEvent} e */ function onMouseWheel (e) { this.body.range._onMouseWheel(e); } if (drag.addEventListener) { // IE9, Chrome, Safari, Opera drag.addEventListener("mousewheel", onMouseWheel.bind(this), false); // Firefox drag.addEventListener("DOMMouseScroll", onMouseWheel.bind(this), false); } else { // IE 6/7/8 drag.attachEvent("onmousewheel", onMouseWheel.bind(this)); } bar.appendChild(drag); // attach event listeners this.hammer = new Hammer$2(drag); this.hammer.on('panstart', this._onDragStart.bind(this)); this.hammer.on('panmove', this._onDrag.bind(this)); this.hammer.on('panend', this._onDragEnd.bind(this)); this.hammer.get('pan').set({threshold:5, direction: Hammer$2.DIRECTION_ALL}); } /** * Destroy the CustomTime bar */ destroy() { this.hide(); this.hammer.destroy(); this.hammer = null; this.body = null; } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { const parent = this.body.dom.backgroundVertical; if (this.bar.parentNode != parent) { // attach to the dom if (this.bar.parentNode) { this.bar.parentNode.removeChild(this.bar); } parent.appendChild(this.bar); } const x = this.body.util.toScreen(this.customTime); let locale = this.options.locales[this.options.locale]; if (!locale) { if (!this.warned) { console.warn(`WARNING: options.locales['${this.options.locale}'] not found. See https://visjs.github.io/vis-timeline/docs/timeline/#Localization`); this.warned = true; } locale = this.options.locales['en']; // fall back on english when not available } let title = this.options.title; // To hide the title completely use empty string ''. if (title === undefined) { title = `${locale.time}: ${this.options.moment(this.customTime).format('dddd, MMMM Do YYYY, H:mm:ss')}`; title = title.charAt(0).toUpperCase() + title.substring(1); } else if (typeof title === "function") { title = title.call(this, this.customTime); } this.options.rtl ? this.bar.style.right = `${x}px` : this.bar.style.left = `${x}px`; this.bar.title = title; return false; } /** * Remove the CustomTime from the DOM */ hide() { // remove the line from the DOM if (this.bar.parentNode) { this.bar.parentNode.removeChild(this.bar); } } /** * Set custom time. * @param {Date | number | string} time */ setCustomTime(time) { this.customTime = util$3.convert(time, 'Date'); this.redraw(); } /** * Retrieve the current custom time. * @return {Date} customTime */ getCustomTime() { return new Date(this.customTime.valueOf()); } /** * Set custom marker. * @param {string} [title] Title of the custom marker * @param {boolean} [editable] Make the custom marker editable. */ setCustomMarker(title, editable) { const marker = document.createElement('div'); marker.className = `vis-custom-time-marker`; marker.innerHTML = util$3.xss(title); marker.style.position = 'absolute'; if (editable) { marker.setAttribute('contenteditable', 'true'); marker.addEventListener('pointerdown', function () { marker.focus(); }); marker.addEventListener('input', this._onMarkerChange.bind(this)); // The editable div element has no change event, so here emulates the change event. marker.title = title; marker.addEventListener('blur', function (event) { if (this.title != event.target.innerHTML) { this._onMarkerChanged(event); this.title = event.target.innerHTML; } }.bind(this)); } this.bar.appendChild(marker); } /** * Set custom title. * @param {Date | number | string} title */ setCustomTitle(title) { this.options.title = title; } /** * Start moving horizontally * @param {Event} event * @private */ _onDragStart(event) { this.eventParams.dragging = true; this.eventParams.customTime = this.customTime; event.stopPropagation(); } /** * Perform moving operating. * @param {Event} event * @private */ _onDrag(event) { if (!this.eventParams.dragging) return; let deltaX = this.options.rtl ? (-1) * event.deltaX : event.deltaX; const x = this.body.util.toScreen(this.eventParams.customTime) + deltaX; const time = this.body.util.toTime(x); const scale = this.body.util.getScale(); const step = this.body.util.getStep(); const snap = this.options.snap; const snappedTime = snap ? snap(time, scale, step) : time; this.setCustomTime(snappedTime); // fire a timechange event this.body.emitter.emit('timechange', { id: this.options.id, time: new Date(this.customTime.valueOf()), event }); event.stopPropagation(); } /** * Stop moving operating. * @param {Event} event * @private */ _onDragEnd(event) { if (!this.eventParams.dragging) return; // fire a timechanged event this.body.emitter.emit('timechanged', { id: this.options.id, time: new Date(this.customTime.valueOf()), event }); event.stopPropagation(); } /** * Perform input operating. * @param {Event} event * @private */ _onMarkerChange(event) { this.body.emitter.emit('markerchange', { id: this.options.id, title: event.target.innerHTML, event }); event.stopPropagation(); } /** * Perform change operating. * @param {Event} event * @private */ _onMarkerChanged(event) { this.body.emitter.emit('markerchanged', { id: this.options.id, title: event.target.innerHTML, event }); event.stopPropagation(); } /** * Find a custom time from an event target: * searches for the attribute 'custom-time' in the event target's element tree * @param {Event} event * @return {CustomTime | null} customTime */ static customTimeFromTarget(event) { let target = event.target; while (target) { if (target.hasOwnProperty('custom-time')) { return target['custom-time']; } target = target.parentNode; } return null; } } /** * Create a timeline visualization * @constructor Core */ class Core { /** * Create the main DOM for the Core: a root panel containing left, right, * top, bottom, content, and background panel. * @param {Element} container The container element where the Core will * be attached. * @protected */ _create(container) { this.dom = {}; this.dom.container = container; this.dom.container.style.position = 'relative'; this.dom.root = document.createElement('div'); this.dom.background = document.createElement('div'); this.dom.backgroundVertical = document.createElement('div'); this.dom.backgroundHorizontal = document.createElement('div'); this.dom.centerContainer = document.createElement('div'); this.dom.leftContainer = document.createElement('div'); this.dom.rightContainer = document.createElement('div'); this.dom.center = document.createElement('div'); this.dom.left = document.createElement('div'); this.dom.right = document.createElement('div'); this.dom.top = document.createElement('div'); this.dom.bottom = document.createElement('div'); this.dom.shadowTop = document.createElement('div'); this.dom.shadowBottom = document.createElement('div'); this.dom.shadowTopLeft = document.createElement('div'); this.dom.shadowBottomLeft = document.createElement('div'); this.dom.shadowTopRight = document.createElement('div'); this.dom.shadowBottomRight = document.createElement('div'); this.dom.rollingModeBtn = document.createElement('div'); this.dom.loadingScreen = document.createElement('div'); this.dom.root.className = 'vis-timeline'; this.dom.background.className = 'vis-panel vis-background'; this.dom.backgroundVertical.className = 'vis-panel vis-background vis-vertical'; this.dom.backgroundHorizontal.className = 'vis-panel vis-background vis-horizontal'; this.dom.centerContainer.className = 'vis-panel vis-center'; this.dom.leftContainer.className = 'vis-panel vis-left'; this.dom.rightContainer.className = 'vis-panel vis-right'; this.dom.top.className = 'vis-panel vis-top'; this.dom.bottom.className = 'vis-panel vis-bottom'; this.dom.left.className = 'vis-content'; this.dom.center.className = 'vis-content'; this.dom.right.className = 'vis-content'; this.dom.shadowTop.className = 'vis-shadow vis-top'; this.dom.shadowBottom.className = 'vis-shadow vis-bottom'; this.dom.shadowTopLeft.className = 'vis-shadow vis-top'; this.dom.shadowBottomLeft.className = 'vis-shadow vis-bottom'; this.dom.shadowTopRight.className = 'vis-shadow vis-top'; this.dom.shadowBottomRight.className = 'vis-shadow vis-bottom'; this.dom.rollingModeBtn.className = 'vis-rolling-mode-btn'; this.dom.loadingScreen.className = 'vis-loading-screen'; this.dom.root.appendChild(this.dom.background); this.dom.root.appendChild(this.dom.backgroundVertical); this.dom.root.appendChild(this.dom.backgroundHorizontal); this.dom.root.appendChild(this.dom.centerContainer); this.dom.root.appendChild(this.dom.leftContainer); this.dom.root.appendChild(this.dom.rightContainer); this.dom.root.appendChild(this.dom.top); this.dom.root.appendChild(this.dom.bottom); this.dom.root.appendChild(this.dom.rollingModeBtn); this.dom.centerContainer.appendChild(this.dom.center); this.dom.leftContainer.appendChild(this.dom.left); this.dom.rightContainer.appendChild(this.dom.right); this.dom.centerContainer.appendChild(this.dom.shadowTop); this.dom.centerContainer.appendChild(this.dom.shadowBottom); this.dom.leftContainer.appendChild(this.dom.shadowTopLeft); this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft); this.dom.rightContainer.appendChild(this.dom.shadowTopRight); this.dom.rightContainer.appendChild(this.dom.shadowBottomRight); // size properties of each of the panels this.props = { root: {}, background: {}, centerContainer: {}, leftContainer: {}, rightContainer: {}, center: {}, left: {}, right: {}, top: {}, bottom: {}, border: {}, scrollTop: 0, scrollTopMin: 0 }; this.on('rangechange', () => { if (this.initialDrawDone === true) { this._redraw(); } }); this.on('rangechanged', () => { if (!this.initialRangeChangeDone) { this.initialRangeChangeDone = true; } }); this.on('touch', this._onTouch.bind(this)); this.on('panmove', this._onDrag.bind(this)); const me = this; this._origRedraw = this._redraw.bind(this); this._redraw = util$3.throttle(this._origRedraw); this.on('_change', properties => { if (me.itemSet && me.itemSet.initialItemSetDrawn && properties && properties.queue == true) { me._redraw(); } else { me._origRedraw(); } }); // create event listeners for all interesting events, these events will be // emitted via emitter this.hammer = new Hammer$2(this.dom.root); const pinchRecognizer = this.hammer.get('pinch').set({enable: true}); pinchRecognizer && disablePreventDefaultVertically(pinchRecognizer); this.hammer.get('pan').set({threshold:5, direction: Hammer$2.DIRECTION_ALL}); this.timelineListeners = {}; const events = [ 'tap', 'doubletap', 'press', 'pinch', 'pan', 'panstart', 'panmove', 'panend' // TODO: cleanup //'touch', 'pinch', //'tap', 'doubletap', 'hold', //'dragstart', 'drag', 'dragend', //'mousewheel', 'DOMMouseScroll' // DOMMouseScroll is needed for Firefox ]; events.forEach(type => { const listener = event => { if (me.isActive()) { me.emit(type, event); } }; me.hammer.on(type, listener); me.timelineListeners[type] = listener; }); // emulate a touch event (emitted before the start of a pan, pinch, tap, or press) onTouch(this.hammer, event => { me.emit('touch', event); }); // emulate a release event (emitted after a pan, pinch, tap, or press) onRelease(this.hammer, event => { me.emit('release', event); }); /** * * @param {WheelEvent} event */ function onMouseWheel(event) { // Reasonable default wheel deltas const LINE_HEIGHT = 40; const PAGE_HEIGHT = 800; if (this.isActive()) { this.emit('mousewheel', event); } // deltaX and deltaY normalization from jquery.mousewheel.js let deltaX = 0; let deltaY = 0; // Old school scrollwheel delta if ( 'detail' in event ) { deltaY = event.detail * -1; } if ( 'wheelDelta' in event ) { deltaY = event.wheelDelta; } if ( 'wheelDeltaY' in event ) { deltaY = event.wheelDeltaY; } if ( 'wheelDeltaX' in event ) { deltaX = event.wheelDeltaX * -1; } // Firefox < 17 horizontal scrolling related to DOMMouseScroll event if ( 'axis' in event && event.axis === event.HORIZONTAL_AXIS ) { deltaX = deltaY * -1; deltaY = 0; } // New school wheel delta (wheel event) if ( 'deltaY' in event ) { deltaY = event.deltaY * -1; } if ( 'deltaX' in event ) { deltaX = event.deltaX; } // Normalize deltas if (event.deltaMode) { if (event.deltaMode === 1) { // delta in LINE units deltaX *= LINE_HEIGHT; deltaY *= LINE_HEIGHT; } else { // delta in PAGE units deltaX *= LINE_HEIGHT; deltaY *= PAGE_HEIGHT; } } // Prevent scrolling when zooming (no zoom key, or pressing zoom key) if (this.options.preferZoom) { if (!this.options.zoomKey || event[this.options.zoomKey]) return; } else { if (this.options.zoomKey && event[this.options.zoomKey]) return } // Don't preventDefault if you can't scroll if (!this.options.verticalScroll && !this.options.horizontalScroll) return; if (this.options.verticalScroll && Math.abs(deltaY) >= Math.abs(deltaX)) { const current = this.props.scrollTop; const adjusted = current + deltaY; if (this.isActive()) { const newScrollTop = this._setScrollTop(adjusted); if (newScrollTop !== current) { this._redraw(); this.emit('scroll', event); // Prevent default actions caused by mouse wheel // (else the page and timeline both scroll) event.preventDefault(); } } } else if (this.options.horizontalScroll) { const delta = Math.abs(deltaX) >= Math.abs(deltaY) ? deltaX : deltaY; // calculate a single scroll jump relative to the range scale const diff = (delta / 120) * (this.range.end - this.range.start) / 20; // calculate new start and end const newStart = this.range.start + diff; const newEnd = this.range.end + diff; const options = { animation: false, byUser: true, event }; this.range.setRange(newStart, newEnd, options); event.preventDefault(); } } // Add modern wheel event listener const wheelType = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel" document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel" // DOMMouseScroll - Older Firefox versions use "DOMMouseScroll" // onmousewheel - All the use "onmousewheel" this.dom.centerContainer.addEventListener ? "DOMMouseScroll" : "onmousewheel"; this.dom.top.addEventListener ? "DOMMouseScroll" : "onmousewheel"; this.dom.bottom.addEventListener ? "DOMMouseScroll" : "onmousewheel"; this.dom.centerContainer.addEventListener(wheelType, onMouseWheel.bind(this), false); this.dom.top.addEventListener(wheelType, onMouseWheel.bind(this), false); this.dom.bottom.addEventListener(wheelType, onMouseWheel.bind(this), false); /** * * @param {scroll} event */ function onMouseScrollSide(event) { if (!me.options.verticalScroll) return; event.preventDefault(); if (me.isActive()) { const adjusted = -event.target.scrollTop; me._setScrollTop(adjusted); me._redraw(); me.emit('scrollSide', event); } } this.dom.left.parentNode.addEventListener('scroll', onMouseScrollSide.bind(this)); this.dom.right.parentNode.addEventListener('scroll', onMouseScrollSide.bind(this)); let itemAddedToTimeline = false; /** * * @param {dragover} event * @returns {boolean} */ function handleDragOver(event) { if (event.preventDefault) { me.emit('dragover', me.getEventProperties(event)); event.preventDefault(); // Necessary. Allows us to drop. } // make sure your target is a timeline element if (!(event.target.className.indexOf("timeline") > -1)) return; // make sure only one item is added every time you're over the timeline if (itemAddedToTimeline) return; event.dataTransfer.dropEffect = 'move'; itemAddedToTimeline = true; return false; } /** * * @param {drop} event * @returns {boolean} */ function handleDrop(event) { // prevent redirect to blank page - Firefox if(event.preventDefault) { event.preventDefault(); } if(event.stopPropagation) { event.stopPropagation(); } // return when dropping non-timeline items try { var itemData = JSON.parse(event.dataTransfer.getData("text")); if (!itemData || !itemData.content) return } catch (err) { return false; } itemAddedToTimeline = false; event.center = { x: event.clientX, y: event.clientY }; if (itemData.target !== 'item') { me.itemSet._onAddItem(event); } else { me.itemSet._onDropObjectOnItem(event); } me.emit('drop', me.getEventProperties(event)); return false; } this.dom.center.addEventListener('dragover', handleDragOver.bind(this), false); this.dom.center.addEventListener('drop', handleDrop.bind(this), false); this.customTimes = []; // store state information needed for touch events this.touch = {}; this.redrawCount = 0; this.initialDrawDone = false; this.initialRangeChangeDone = false; // attach the root panel to the provided container if (!container) throw new Error('No container provided'); container.appendChild(this.dom.root); container.appendChild(this.dom.loadingScreen); } /** * Set options. Options will be passed to all components loaded in the Timeline. * @param {Object} [options] * {String} orientation * Vertical orientation for the Timeline, * can be 'bottom' (default) or 'top'. * {string | number} width * Width for the timeline, a number in pixels or * a css string like '1000px' or '75%'. '100%' by default. * {string | number} height * Fixed height for the Timeline, a number in pixels or * a css string like '400px' or '75%'. If undefined, * The Timeline will automatically size such that * its contents fit. * {string | number} minHeight * Minimum height for the Timeline, a number in pixels or * a css string like '400px' or '75%'. * {string | number} maxHeight * Maximum height for the Timeline, a number in pixels or * a css string like '400px' or '75%'. * {number | Date | string} start * Start date for the visible window * {number | Date | string} end * End date for the visible window */ setOptions(options) { if (options) { // copy the known options const fields = [ 'width', 'height', 'minHeight', 'maxHeight', 'autoResize', 'start', 'end', 'clickToUse', 'dataAttributes', 'hiddenDates', 'locale', 'locales', 'moment', 'preferZoom', 'rtl', 'zoomKey', 'horizontalScroll', 'verticalScroll', 'longSelectPressTime', 'snap' ]; util$3.selectiveExtend(fields, this.options, options); this.dom.rollingModeBtn.style.visibility = 'hidden'; if (this.options.rtl) { this.dom.container.style.direction = "rtl"; this.dom.backgroundVertical.className = 'vis-panel vis-background vis-vertical-rtl'; } if (this.options.verticalScroll) { if (this.options.rtl) { this.dom.rightContainer.className = 'vis-panel vis-right vis-vertical-scroll'; } else { this.dom.leftContainer.className = 'vis-panel vis-left vis-vertical-scroll'; } } if (typeof this.options.orientation !== 'object') { this.options.orientation = {item:undefined,axis:undefined}; } if ('orientation' in options) { if (typeof options.orientation === 'string') { this.options.orientation = { item: options.orientation, axis: options.orientation }; } else if (typeof options.orientation === 'object') { if ('item' in options.orientation) { this.options.orientation.item = options.orientation.item; } if ('axis' in options.orientation) { this.options.orientation.axis = options.orientation.axis; } } } if (this.options.orientation.axis === 'both') { if (!this.timeAxis2) { const timeAxis2 = this.timeAxis2 = new TimeAxis(this.body); timeAxis2.setOptions = options => { const _options = options ? util$3.extend({}, options) : {}; _options.orientation = 'top'; // override the orientation option, always top TimeAxis.prototype.setOptions.call(timeAxis2, _options); }; this.components.push(timeAxis2); } } else { if (this.timeAxis2) { const index = this.components.indexOf(this.timeAxis2); if (index !== -1) { this.components.splice(index, 1); } this.timeAxis2.destroy(); this.timeAxis2 = null; } } // if the graph2d's drawPoints is a function delegate the callback to the onRender property if (typeof options.drawPoints == 'function') { options.drawPoints = { onRender: options.drawPoints }; } if ('hiddenDates' in this.options) { convertHiddenOptions(this.options.moment, this.body, this.options.hiddenDates); } if ('clickToUse' in options) { if (options.clickToUse) { if (!this.activator) { this.activator = new Activator$2(this.dom.root); } } else { if (this.activator) { this.activator.destroy(); delete this.activator; } } } // enable/disable autoResize this._initAutoResize(); } // propagate options to all components this.components.forEach(component => component.setOptions(options)); // enable/disable configure if ('configure' in options) { if (!this.configurator) { this.configurator = this._createConfigurator(); } this.configurator.setOptions(options.configure); // collect the settings of all components, and pass them to the configuration system const appliedOptions = util$3.deepExtend({}, this.options); this.components.forEach(component => { util$3.deepExtend(appliedOptions, component.options); }); this.configurator.setModuleOptions({global: appliedOptions}); } this._redraw(); } /** * Returns true when the Timeline is active. * @returns {boolean} */ isActive() { return !this.activator || this.activator.active; } /** * Destroy the Core, clean up all DOM elements and event listeners. */ destroy() { // unbind datasets this.setItems(null); this.setGroups(null); // remove all event listeners this.off(); // stop checking for changed size this._stopAutoResize(); // remove from DOM if (this.dom.root.parentNode) { this.dom.root.parentNode.removeChild(this.dom.root); } this.dom = null; // remove Activator if (this.activator) { this.activator.destroy(); delete this.activator; } // cleanup hammer touch events for (const event in this.timelineListeners) { if (this.timelineListeners.hasOwnProperty(event)) { delete this.timelineListeners[event]; } } this.timelineListeners = null; this.hammer && this.hammer.destroy(); this.hammer = null; // give all components the opportunity to cleanup this.components.forEach(component => component.destroy()); this.body = null; } /** * Set a custom time bar * @param {Date} time * @param {number} [id=undefined] Optional id of the custom time bar to be adjusted. */ setCustomTime(time, id) { const customTimes = this.customTimes.filter(component => id === component.options.id); if (customTimes.length === 0) { throw new Error(`No custom time bar found with id ${JSON.stringify(id)}`) } if (customTimes.length > 0) { customTimes[0].setCustomTime(time); } } /** * Retrieve the current custom time. * @param {number} [id=undefined] Id of the custom time bar. * @return {Date | undefined} customTime */ getCustomTime(id) { const customTimes = this.customTimes.filter(component => component.options.id === id); if (customTimes.length === 0) { throw new Error(`No custom time bar found with id ${JSON.stringify(id)}`) } return customTimes[0].getCustomTime(); } /** * Set a custom marker for the custom time bar. * @param {string} [title] Title of the custom marker. * @param {number} [id=undefined] Id of the custom marker. * @param {boolean} [editable=false] Make the custom marker editable. */ setCustomTimeMarker(title, id, editable) { const customTimes = this.customTimes.filter(component => component.options.id === id); if (customTimes.length === 0) { throw new Error(`No custom time bar found with id ${JSON.stringify(id)}`) } if (customTimes.length > 0) { customTimes[0].setCustomMarker(title, editable); } } /** * Set a custom title for the custom time bar. * @param {string} [title] Custom title * @param {number} [id=undefined] Id of the custom time bar. * @returns {*} */ setCustomTimeTitle(title, id) { const customTimes = this.customTimes.filter(component => component.options.id === id); if (customTimes.length === 0) { throw new Error(`No custom time bar found with id ${JSON.stringify(id)}`) } if (customTimes.length > 0) { return customTimes[0].setCustomTitle(title); } } /** * Retrieve meta information from an event. * Should be overridden by classes extending Core * @param {Event} event * @return {Object} An object with related information. */ getEventProperties(event) { return { event }; } /** * Add custom vertical bar * @param {Date | string | number} [time] A Date, unix timestamp, or * ISO date string. Time point where * the new bar should be placed. * If not provided, `new Date()` will * be used. * @param {number | string} [id=undefined] Id of the new bar. Optional * @return {number | string} Returns the id of the new bar */ addCustomTime(time, id) { const timestamp = time !== undefined ? util$3.convert(time, 'Date') : new Date(); const exists = this.customTimes.some(customTime => customTime.options.id === id); if (exists) { throw new Error(`A custom time with id ${JSON.stringify(id)} already exists`); } const customTime = new CustomTime(this.body, util$3.extend({}, this.options, { time: timestamp, id, snap: this.itemSet ? this.itemSet.options.snap : this.options.snap })); this.customTimes.push(customTime); this.components.push(customTime); this._redraw(); return id; } /** * Remove previously added custom bar * @param {int} id ID of the custom bar to be removed * [at]returns {boolean} True if the bar exists and is removed, false otherwise */ removeCustomTime(id) { const customTimes = this.customTimes.filter(bar => bar.options.id === id); if (customTimes.length === 0) { throw new Error(`No custom time bar found with id ${JSON.stringify(id)}`) } customTimes.forEach(customTime => { this.customTimes.splice(this.customTimes.indexOf(customTime), 1); this.components.splice(this.components.indexOf(customTime), 1); customTime.destroy(); }); } /** * Get the id's of the currently visible items. * @returns {Array} The ids of the visible items */ getVisibleItems() { return this.itemSet && this.itemSet.getVisibleItems() || []; } /** * Get the id's of the currently visible groups. * @returns {Array} The ids of the visible groups */ getVisibleGroups() { return this.itemSet && this.itemSet.getVisibleGroups() || []; } /** * Set Core window such that it fits all items * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] a callback funtion to be executed at the end of this function */ fit(options, callback) { const range = this.getDataRange(); // skip range set if there is no min and max date if (range.min === null && range.max === null) { return; } // apply a margin of 1% left and right of the data const interval = range.max - range.min; const min = new Date(range.min.valueOf() - interval * 0.01); const max = new Date(range.max.valueOf() + interval * 0.01); const animation = (options && options.animation !== undefined) ? options.animation : true; this.range.setRange(min, max, { animation }, callback); } /** * Calculate the data range of the items start and end dates * [at]returns {{min: [Date], max: [Date]}} * @protected */ getDataRange() { // must be implemented by Timeline and Graph2d throw new Error('Cannot invoke abstract method getDataRange'); } /** * Set the visible window. Both parameters are optional, you can change only * start or only end. Syntax: * * TimeLine.setWindow(start, end) * TimeLine.setWindow(start, end, options) * TimeLine.setWindow(range) * * Where start and end can be a Date, number, or string, and range is an * object with properties start and end. * * @param {Date | number | string | Object} [start] Start date of visible window * @param {Date | number | string} [end] End date of visible window * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] a callback funtion to be executed at the end of this function */ setWindow(start, end, options, callback) { if (typeof arguments[2] == "function") { callback = arguments[2]; options = {}; } let animation; let range; if (arguments.length == 1) { range = arguments[0]; animation = (range.animation !== undefined) ? range.animation : true; this.range.setRange(range.start, range.end, { animation }); } else if (arguments.length == 2 && typeof arguments[1] == "function") { range = arguments[0]; callback = arguments[1]; animation = (range.animation !== undefined) ? range.animation : true; this.range.setRange(range.start, range.end, { animation }, callback); } else { animation = (options && options.animation !== undefined) ? options.animation : true; this.range.setRange(start, end, { animation }, callback); } } /** * Move the window such that given time is centered on screen. * @param {Date | number | string} time * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] a callback funtion to be executed at the end of this function */ moveTo(time, options, callback) { if (typeof arguments[1] == "function") { callback = arguments[1]; options = {}; } const interval = this.range.end - this.range.start; const t = util$3.convert(time, 'Date').valueOf(); const start = t - interval / 2; const end = t + interval / 2; const animation = (options && options.animation !== undefined) ? options.animation : true; this.range.setRange(start, end, { animation }, callback); } /** * Get the visible window * @return {{start: Date, end: Date}} Visible range */ getWindow() { const range = this.range.getRange(); return { start: new Date(range.start), end: new Date(range.end) }; } /** * Zoom in the window such that given time is centered on screen. * @param {number} percentage - must be between [0..1] * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] a callback funtion to be executed at the end of this function */ zoomIn(percentage, options, callback) { if (!percentage || percentage < 0 || percentage > 1) return; if (typeof arguments[1] == "function") { callback = arguments[1]; options = {}; } const range = this.getWindow(); const start = range.start.valueOf(); const end = range.end.valueOf(); const interval = end - start; const newInterval = interval / (1 + percentage); const distance = (interval - newInterval) / 2; const newStart = start + distance; const newEnd = end - distance; this.setWindow(newStart, newEnd, options, callback); } /** * Zoom out the window such that given time is centered on screen. * @param {number} percentage - must be between [0..1] * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] a callback funtion to be executed at the end of this function */ zoomOut(percentage, options, callback) { if (!percentage || percentage < 0 || percentage > 1) return if (typeof arguments[1] == "function") { callback = arguments[1]; options = {}; } const range = this.getWindow(); const start = range.start.valueOf(); const end = range.end.valueOf(); const interval = end - start; const newStart = start - interval * percentage / 2; const newEnd = end + interval * percentage / 2; this.setWindow(newStart, newEnd, options, callback); } /** * Force a redraw. Can be overridden by implementations of Core * * Note: this function will be overridden on construction with a trottled version */ redraw() { this._redraw(); } /** * Redraw for internal use. Redraws all components. See also the public * method redraw. * @protected */ _redraw() { this.redrawCount++; const dom = this.dom; if (!dom || !dom.container || dom.root.offsetWidth == 0) return; // when destroyed, or invisible let resized = false; const options = this.options; const props = this.props; updateHiddenDates(this.options.moment, this.body, this.options.hiddenDates); // update class names if (options.orientation == 'top') { util$3.addClassName(dom.root, 'vis-top'); util$3.removeClassName(dom.root, 'vis-bottom'); } else { util$3.removeClassName(dom.root, 'vis-top'); util$3.addClassName(dom.root, 'vis-bottom'); } if (options.rtl) { util$3.addClassName(dom.root, 'vis-rtl'); util$3.removeClassName(dom.root, 'vis-ltr'); } else { util$3.addClassName(dom.root, 'vis-ltr'); util$3.removeClassName(dom.root, 'vis-rtl'); } // update root width and height options dom.root.style.maxHeight = util$3.option.asSize(options.maxHeight, ''); dom.root.style.minHeight = util$3.option.asSize(options.minHeight, ''); dom.root.style.width = util$3.option.asSize(options.width, ''); const rootOffsetWidth = dom.root.offsetWidth; // calculate border widths props.border.left = 1; props.border.right = 1; props.border.top = 1; props.border.bottom = 1; // calculate the heights. If any of the side panels is empty, we set the height to // minus the border width, such that the border will be invisible props.center.height = dom.center.offsetHeight; props.left.height = dom.left.offsetHeight; props.right.height = dom.right.offsetHeight; props.top.height = dom.top.clientHeight || -props.border.top; props.bottom.height = Math.round(dom.bottom.getBoundingClientRect().height) || dom.bottom.clientHeight || -props.border.bottom; // TODO: compensate borders when any of the panels is empty. // apply auto height // TODO: only calculate autoHeight when needed (else we cause an extra reflow/repaint of the DOM) const contentHeight = Math.max(props.left.height, props.center.height, props.right.height); const autoHeight = props.top.height + contentHeight + props.bottom.height + props.border.top + props.border.bottom; dom.root.style.height = util$3.option.asSize(options.height, `${autoHeight}px`); // calculate heights of the content panels props.root.height = dom.root.offsetHeight; props.background.height = props.root.height; const containerHeight = props.root.height - props.top.height - props.bottom.height; props.centerContainer.height = containerHeight; props.leftContainer.height = containerHeight; props.rightContainer.height = props.leftContainer.height; // calculate the widths of the panels props.root.width = rootOffsetWidth; props.background.width = props.root.width; if (!this.initialDrawDone) { props.scrollbarWidth = util$3.getScrollBarWidth(); } const leftContainerClientWidth = dom.leftContainer.clientWidth; const rightContainerClientWidth = dom.rightContainer.clientWidth; if (options.verticalScroll) { if (options.rtl) { props.left.width = leftContainerClientWidth || -props.border.left; props.right.width = rightContainerClientWidth + props.scrollbarWidth || -props.border.right; } else { props.left.width = leftContainerClientWidth + props.scrollbarWidth || -props.border.left; props.right.width = rightContainerClientWidth || -props.border.right; } } else { props.left.width = leftContainerClientWidth || -props.border.left; props.right.width = rightContainerClientWidth || -props.border.right; } this._setDOM(); // update the scrollTop, feasible range for the offset can be changed // when the height of the Core or of the contents of the center changed let offset = this._updateScrollTop(); // reposition the scrollable contents if (options.orientation.item != 'top') { offset += Math.max(props.centerContainer.height - props.center.height - props.border.top - props.border.bottom, 0); } dom.center.style.transform = `translateY(${offset}px)`; // show shadows when vertical scrolling is available const visibilityTop = props.scrollTop == 0 ? 'hidden' : ''; const visibilityBottom = props.scrollTop == props.scrollTopMin ? 'hidden' : ''; dom.shadowTop.style.visibility = visibilityTop; dom.shadowBottom.style.visibility = visibilityBottom; dom.shadowTopLeft.style.visibility = visibilityTop; dom.shadowBottomLeft.style.visibility = visibilityBottom; dom.shadowTopRight.style.visibility = visibilityTop; dom.shadowBottomRight.style.visibility = visibilityBottom; if (options.verticalScroll) { dom.rightContainer.className = 'vis-panel vis-right vis-vertical-scroll'; dom.leftContainer.className = 'vis-panel vis-left vis-vertical-scroll'; dom.shadowTopRight.style.visibility = "hidden"; dom.shadowBottomRight.style.visibility = "hidden"; dom.shadowTopLeft.style.visibility = "hidden"; dom.shadowBottomLeft.style.visibility = "hidden"; dom.left.style.top = '0px'; dom.right.style.top = '0px'; } if (!options.verticalScroll || props.center.height < props.centerContainer.height) { dom.left.style.top = `${offset}px`; dom.right.style.top = `${offset}px`; dom.rightContainer.className = dom.rightContainer.className.replace(new RegExp('(?:^|\\s)'+ 'vis-vertical-scroll' + '(?:\\s|$)'), ' '); dom.leftContainer.className = dom.leftContainer.className.replace(new RegExp('(?:^|\\s)'+ 'vis-vertical-scroll' + '(?:\\s|$)'), ' '); props.left.width = leftContainerClientWidth || -props.border.left; props.right.width = rightContainerClientWidth || -props.border.right; this._setDOM(); } // enable/disable vertical panning const contentsOverflow = props.center.height > props.centerContainer.height; this.hammer.get('pan').set({ direction: contentsOverflow ? Hammer$2.DIRECTION_ALL : Hammer$2.DIRECTION_HORIZONTAL }); // set the long press time this.hammer.get('press').set({ time: this.options.longSelectPressTime }); // redraw all components this.components.forEach(component => { resized = component.redraw() || resized; }); const MAX_REDRAW = 5; if (resized) { if (this.redrawCount < MAX_REDRAW) { this.body.emitter.emit('_change'); return; } else { console.log('WARNING: infinite loop in redraw?'); } } else { this.redrawCount = 0; } //Emit public 'changed' event for UI updates, see issue #1592 this.body.emitter.emit("changed"); } /** * sets the basic DOM components needed for the timeline\graph2d */ _setDOM() { const props = this.props; const dom = this.dom; props.leftContainer.width = props.left.width; props.rightContainer.width = props.right.width; const centerWidth = props.root.width - props.left.width - props.right.width; props.center.width = centerWidth; props.centerContainer.width = centerWidth; props.top.width = centerWidth; props.bottom.width = centerWidth; // resize the panels dom.background.style.height = `${props.background.height}px`; dom.backgroundVertical.style.height = `${props.background.height}px`; dom.backgroundHorizontal.style.height = `${props.centerContainer.height}px`; dom.centerContainer.style.height = `${props.centerContainer.height}px`; dom.leftContainer.style.height = `${props.leftContainer.height}px`; dom.rightContainer.style.height = `${props.rightContainer.height}px`; dom.background.style.width = `${props.background.width}px`; dom.backgroundVertical.style.width = `${props.centerContainer.width}px`; dom.backgroundHorizontal.style.width = `${props.background.width}px`; dom.centerContainer.style.width = `${props.center.width}px`; dom.top.style.width = `${props.top.width}px`; dom.bottom.style.width = `${props.bottom.width}px`; // reposition the panels dom.background.style.left = '0'; dom.background.style.top = '0'; dom.backgroundVertical.style.left = `${props.left.width + props.border.left}px`; dom.backgroundVertical.style.top = '0'; dom.backgroundHorizontal.style.left = '0'; dom.backgroundHorizontal.style.top = `${props.top.height}px`; dom.centerContainer.style.left = `${props.left.width}px`; dom.centerContainer.style.top = `${props.top.height}px`; dom.leftContainer.style.left = '0'; dom.leftContainer.style.top = `${props.top.height}px`; dom.rightContainer.style.left = `${props.left.width + props.center.width}px`; dom.rightContainer.style.top = `${props.top.height}px`; dom.top.style.left = `${props.left.width}px`; dom.top.style.top = '0'; dom.bottom.style.left = `${props.left.width}px`; dom.bottom.style.top = `${props.top.height + props.centerContainer.height}px`; dom.center.style.left = '0'; dom.left.style.left = '0'; dom.right.style.left = '0'; } /** * Set a current time. This can be used for example to ensure that a client's * time is synchronized with a shared server time. * Only applicable when option `showCurrentTime` is true. * @param {Date | string | number} time A Date, unix timestamp, or * ISO date string. */ setCurrentTime(time) { if (!this.currentTime) { throw new Error('Option showCurrentTime must be true'); } this.currentTime.setCurrentTime(time); } /** * Get the current time. * Only applicable when option `showCurrentTime` is true. * @return {Date} Returns the current time. */ getCurrentTime() { if (!this.currentTime) { throw new Error('Option showCurrentTime must be true'); } return this.currentTime.getCurrentTime(); } /** * Convert a position on screen (pixels) to a datetime * @param {int} x Position on the screen in pixels * @return {Date} time The datetime the corresponds with given position x * @protected * TODO: move this function to Range */ _toTime(x) { return toTime(this, x, this.props.center.width); } /** * Convert a position on the global screen (pixels) to a datetime * @param {int} x Position on the screen in pixels * @return {Date} time The datetime the corresponds with given position x * @protected * TODO: move this function to Range */ _toGlobalTime(x) { return toTime(this, x, this.props.root.width); //var conversion = this.range.conversion(this.props.root.width); //return new Date(x / conversion.scale + conversion.offset); } /** * Convert a datetime (Date object) into a position on the screen * @param {Date} time A date * @return {int} x The position on the screen in pixels which corresponds * with the given date. * @protected * TODO: move this function to Range */ _toScreen(time) { return toScreen(this, time, this.props.center.width); } /** * Convert a datetime (Date object) into a position on the root * This is used to get the pixel density estimate for the screen, not the center panel * @param {Date} time A date * @return {int} x The position on root in pixels which corresponds * with the given date. * @protected * TODO: move this function to Range */ _toGlobalScreen(time) { return toScreen(this, time, this.props.root.width); //var conversion = this.range.conversion(this.props.root.width); //return (time.valueOf() - conversion.offset) * conversion.scale; } /** * Initialize watching when option autoResize is true * @private */ _initAutoResize() { if (this.options.autoResize == true) { this._startAutoResize(); } else { this._stopAutoResize(); } } /** * Watch for changes in the size of the container. On resize, the Panel will * automatically redraw itself. * @private */ _startAutoResize() { const me = this; this._stopAutoResize(); this._onResize = () => { if (me.options.autoResize != true) { // stop watching when the option autoResize is changed to false me._stopAutoResize(); return; } if (me.dom.root) { const rootOffsetHeight = me.dom.root.offsetHeight; const rootOffsetWidth = me.dom.root.offsetWidth; // check whether the frame is resized // Note: we compare offsetWidth here, not clientWidth. For some reason, // IE does not restore the clientWidth from 0 to the actual width after // changing the timeline's container display style from none to visible if ((rootOffsetWidth != me.props.lastWidth) || (rootOffsetHeight != me.props.lastHeight)) { me.props.lastWidth = rootOffsetWidth; me.props.lastHeight = rootOffsetHeight; me.props.scrollbarWidth = util$3.getScrollBarWidth(); me.body.emitter.emit('_change'); } } }; // add event listener to window resize util$3.addEventListener(window, 'resize', this._onResize); //Prevent initial unnecessary redraw if (me.dom.root) { me.props.lastWidth = me.dom.root.offsetWidth; me.props.lastHeight = me.dom.root.offsetHeight; } this.watchTimer = setInterval(this._onResize, 1000); } /** * Stop watching for a resize of the frame. * @private */ _stopAutoResize() { if (this.watchTimer) { clearInterval(this.watchTimer); this.watchTimer = undefined; } // remove event listener on window.resize if (this._onResize) { util$3.removeEventListener(window, 'resize', this._onResize); this._onResize = null; } } /** * Start moving the timeline vertically * @param {Event} event * @private */ _onTouch(event) { // eslint-disable-line no-unused-vars this.touch.allowDragging = true; this.touch.initialScrollTop = this.props.scrollTop; } /** * Start moving the timeline vertically * @param {Event} event * @private */ _onPinch(event) { // eslint-disable-line no-unused-vars this.touch.allowDragging = false; } /** * Move the timeline vertically * @param {Event} event * @private */ _onDrag(event) { if (!event) return // refuse to drag when we where pinching to prevent the timeline make a jump // when releasing the fingers in opposite order from the touch screen if (!this.touch.allowDragging) return; const delta = event.deltaY; const oldScrollTop = this._getScrollTop(); const newScrollTop = this._setScrollTop(this.touch.initialScrollTop + delta); if (this.options.verticalScroll) { this.dom.left.parentNode.scrollTop = -this.props.scrollTop; this.dom.right.parentNode.scrollTop = -this.props.scrollTop; } if (newScrollTop != oldScrollTop) { this.emit("verticalDrag"); } } /** * Apply a scrollTop * @param {number} scrollTop * @returns {number} scrollTop Returns the applied scrollTop * @private */ _setScrollTop(scrollTop) { this.props.scrollTop = scrollTop; this._updateScrollTop(); return this.props.scrollTop; } /** * Update the current scrollTop when the height of the containers has been changed * @returns {number} scrollTop Returns the applied scrollTop * @private */ _updateScrollTop() { // recalculate the scrollTopMin const scrollTopMin = Math.min(this.props.centerContainer.height - this.props.border.top - this.props.border.bottom - this.props.center.height, 0); // is negative or zero if (scrollTopMin != this.props.scrollTopMin) { // in case of bottom orientation, change the scrollTop such that the contents // do not move relative to the time axis at the bottom if (this.options.orientation.item != 'top') { this.props.scrollTop += (scrollTopMin - this.props.scrollTopMin); } this.props.scrollTopMin = scrollTopMin; } // limit the scrollTop to the feasible scroll range if (this.props.scrollTop > 0) this.props.scrollTop = 0; if (this.props.scrollTop < scrollTopMin) this.props.scrollTop = scrollTopMin; if (this.options.verticalScroll) { this.dom.left.parentNode.scrollTop = -this.props.scrollTop; this.dom.right.parentNode.scrollTop = -this.props.scrollTop; } return this.props.scrollTop; } /** * Get the current scrollTop * @returns {number} scrollTop * @private */ _getScrollTop() { return this.props.scrollTop; } /** * Load a configurator * [at]returns {Object} * @private */ _createConfigurator() { throw new Error('Cannot invoke abstract method _createConfigurator'); } } // turn Core into an event emitter componentEmitter(Core.prototype); /** * A current time bar */ class CurrentTime extends Component { /** * @param {{range: Range, dom: Object, domProps: Object}} body * @param {Object} [options] Available parameters: * {Boolean} [showCurrentTime] * {String} [alignCurrentTime] * @constructor CurrentTime * @extends Component */ constructor(body, options) { super(); this.body = body; // default options this.defaultOptions = { rtl: false, showCurrentTime: true, alignCurrentTime: undefined, moment: moment$1, locales, locale: 'en' }; this.options = util$3.extend({}, this.defaultOptions); this.setOptions(options); this.options.locales = util$3.extend({}, locales, this.options.locales); const defaultLocales = this.defaultOptions.locales[this.defaultOptions.locale]; Object.keys(this.options.locales).forEach(locale => { this.options.locales[locale] = util$3.extend( {}, defaultLocales, this.options.locales[locale] ); }); this.offset = 0; this._create(); } /** * Create the HTML DOM for the current time bar * @private */ _create() { const bar = document.createElement('div'); bar.className = 'vis-current-time'; bar.style.position = 'absolute'; bar.style.top = '0px'; bar.style.height = '100%'; this.bar = bar; } /** * Destroy the CurrentTime bar */ destroy() { this.options.showCurrentTime = false; this.redraw(); // will remove the bar from the DOM and stop refreshing this.body = null; } /** * Set options for the component. Options will be merged in current options. * @param {Object} options Available parameters: * {boolean} [showCurrentTime] * {String} [alignCurrentTime] */ setOptions(options) { if (options) { // copy all options that we know util$3.selectiveExtend(['rtl', 'showCurrentTime', 'alignCurrentTime', 'moment', 'locale', 'locales'], this.options, options); } } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { if (this.options.showCurrentTime) { const parent = this.body.dom.backgroundVertical; if (this.bar.parentNode != parent) { // attach to the dom if (this.bar.parentNode) { this.bar.parentNode.removeChild(this.bar); } parent.appendChild(this.bar); this.start(); } let now = this.options.moment(Date.now() + this.offset); if (this.options.alignCurrentTime) { now = now.startOf(this.options.alignCurrentTime); } const x = this.body.util.toScreen(now); let locale = this.options.locales[this.options.locale]; if (!locale) { if (!this.warned) { console.warn(`WARNING: options.locales['${this.options.locale}'] not found. See https://visjs.github.io/vis-timeline/docs/timeline/#Localization`); this.warned = true; } locale = this.options.locales['en']; // fall back on english when not available } let title = `${locale.current} ${locale.time}: ${now.format('dddd, MMMM Do YYYY, H:mm:ss')}`; title = title.charAt(0).toUpperCase() + title.substring(1); if (this.options.rtl) { this.bar.style.transform = `translateX(${x * -1}px)`; } else { this.bar.style.transform = `translateX(${x}px)`; } this.bar.title = title; } else { // remove the line from the DOM if (this.bar.parentNode) { this.bar.parentNode.removeChild(this.bar); } this.stop(); } return false; } /** * Start auto refreshing the current time bar */ start() { const me = this; /** * Updates the current time. */ function update () { me.stop(); // determine interval to refresh const scale = me.body.range.conversion(me.body.domProps.center.width).scale; let interval = 1 / scale / 10; if (interval < 30) interval = 30; if (interval > 1000) interval = 1000; me.redraw(); me.body.emitter.emit('currentTimeTick'); // start a renderTimer to adjust for the new time me.currentTimeTimer = setTimeout(update, interval); } update(); } /** * Stop auto refreshing the current time bar */ stop() { if (this.currentTimeTimer !== undefined) { clearTimeout(this.currentTimeTimer); delete this.currentTimeTimer; } } /** * Set a current time. This can be used for example to ensure that a client's * time is synchronized with a shared server time. * @param {Date | string | number} time A Date, unix timestamp, or * ISO date string. */ setCurrentTime(time) { const t = util$3.convert(time, 'Date').valueOf(); const now = Date.now(); this.offset = t - now; this.redraw(); } /** * Get the current time. * @return {Date} Returns the current time. */ getCurrentTime() { return new Date(Date.now() + this.offset); } } // Utility functions for ordering and stacking of items const EPSILON = 0.001; // used when checking collisions, to prevent round-off errors /** * Order items by their start data * @param {Item[]} items */ function orderByStart(items) { items.sort((a, b) => a.data.start - b.data.start); } /** * Order items by their end date. If they have no end date, their start date * is used. * @param {Item[]} items */ function orderByEnd(items) { items.sort((a, b) => { const aTime = ('end' in a.data) ? a.data.end : a.data.start; const bTime = ('end' in b.data) ? b.data.end : b.data.start; return aTime - bTime; }); } /** * Adjust vertical positions of the items such that they don't overlap each * other. * @param {Item[]} items * All visible items * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. * @param {boolean} [force=false] * If true, all items will be repositioned. If false (default), only * items having a top===null will be re-stacked * @param {function} shouldBailItemsRedrawFunction * bailing function * @return {boolean} shouldBail */ function stack(items, margin, force, shouldBailItemsRedrawFunction) { if (force) { // reset top position of all items for (var i = 0; i < items.length; i++) { items[i].top = null; } } // calculate new, non-overlapping positions for (var i = 0; i < items.length; i++) { // eslint-disable-line no-redeclare const item = items[i]; if (item.stack && item.top === null) { // initialize top position item.top = margin.axis; var shouldBail = false; do { // TODO: optimize checking for overlap. when there is a gap without items, // you only need to check for items from the next item on, not from zero var collidingItem = null; for (let j = 0, jj = items.length; j < jj; j++) { const other = items[j]; shouldBail = shouldBailItemsRedrawFunction() || false; if (shouldBail) { return true; } if (other.top !== null && other !== item && other.stack && collision(item, other, margin.item, other.options.rtl)) { collidingItem = other; break; } } if (collidingItem != null) { // There is a collision. Reposition the items above the colliding element item.top = collidingItem.top + collidingItem.height + margin.item.vertical; } } while (collidingItem); } } return shouldBail; } /** * Adjust vertical positions of the items within a single subgroup such that they * don't overlap each other. * @param {Item[]} items * All items withina subgroup * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. * @param {subgroup} subgroup * The subgroup that is being stacked */ function substack(items, margin, subgroup) { for (var i = 0; i < items.length; i++) { items[i].top = null; } // Set the initial height let subgroupHeight = subgroup.height; // calculate new, non-overlapping positions for (i = 0; i < items.length; i++) { const item = items[i]; if (item.stack && item.top === null) { // initialize top position item.top = item.baseTop;//margin.axis + item.baseTop; do { // TODO: optimize checking for overlap. when there is a gap without items, // you only need to check for items from the next item on, not from zero var collidingItem = null; for (let j = 0, jj = items.length; j < jj; j++) { const other = items[j]; if (other.top !== null && other !== item /*&& other.stack*/ && collision(item, other, margin.item, other.options.rtl)) { collidingItem = other; break; } } if (collidingItem != null) { // There is a collision. Reposition the items above the colliding element item.top = collidingItem.top + collidingItem.height + margin.item.vertical;// + item.baseTop; } if (item.top + item.height > subgroupHeight) { subgroupHeight = item.top + item.height; } } while (collidingItem); } } // Set the new height subgroup.height = subgroupHeight - subgroup.top + 0.5 * margin.item.vertical; } /** * Adjust vertical positions of the items without stacking them * @param {Item[]} items * All visible items * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. * @param {subgroups[]} subgroups * All subgroups * @param {boolean} isStackSubgroups */ function nostack(items, margin, subgroups, isStackSubgroups) { for (let i = 0; i < items.length; i++) { if (items[i].data.subgroup == undefined) { items[i].top = margin.item.vertical; } else if (items[i].data.subgroup !== undefined && isStackSubgroups) { let newTop = 0; for (const subgroup in subgroups) { if (subgroups.hasOwnProperty(subgroup)) { if (subgroups[subgroup].visible == true && subgroups[subgroup].index < subgroups[items[i].data.subgroup].index) { newTop += subgroups[subgroup].height; subgroups[items[i].data.subgroup].top = newTop; } } } items[i].top = newTop + 0.5 * margin.item.vertical; } } if (!isStackSubgroups) { stackSubgroups(items, margin, subgroups); } } /** * Adjust vertical positions of the subgroups such that they don't overlap each * other. * @param {Array.<timeline.Item>} items * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin Margins between items and between items and the axis. * @param {subgroups[]} subgroups * All subgroups */ function stackSubgroups(items, margin, subgroups) { for (const subgroup in subgroups) { if (subgroups.hasOwnProperty(subgroup)) { subgroups[subgroup].top = 0; do { // TODO: optimize checking for overlap. when there is a gap without items, // you only need to check for items from the next item on, not from zero var collidingItem = null; for (const otherSubgroup in subgroups) { if (subgroups[otherSubgroup].top !== null && otherSubgroup !== subgroup && subgroups[subgroup].index > subgroups[otherSubgroup].index && collisionByTimes(subgroups[subgroup], subgroups[otherSubgroup])) { collidingItem = subgroups[otherSubgroup]; break; } } if (collidingItem != null) { // There is a collision. Reposition the subgroups above the colliding element subgroups[subgroup].top = collidingItem.top + collidingItem.height; } } while (collidingItem); } } for (let i = 0; i < items.length; i++) { if (items[i].data.subgroup !== undefined) { items[i].top = subgroups[items[i].data.subgroup].top + 0.5 * margin.item.vertical; } } } /** * Adjust vertical positions of the subgroups such that they don't overlap each * other, then stacks the contents of each subgroup individually. * @param {Item[]} subgroupItems * All the items in a subgroup * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * Margins between items and between items and the axis. * @param {subgroups[]} subgroups * All subgroups */ function stackSubgroupsWithInnerStack(subgroupItems, margin, subgroups) { let doSubStack = false; // Run subgroups in their order (if any) const subgroupOrder = []; for(var subgroup in subgroups) { if (subgroups[subgroup].hasOwnProperty("index")) { subgroupOrder[subgroups[subgroup].index] = subgroup; } else { subgroupOrder.push(subgroup); } } for(let j = 0; j < subgroupOrder.length; j++) { subgroup = subgroupOrder[j]; if (subgroups.hasOwnProperty(subgroup)) { doSubStack = doSubStack || subgroups[subgroup].stack; subgroups[subgroup].top = 0; for (const otherSubgroup in subgroups) { if (subgroups[otherSubgroup].visible && subgroups[subgroup].index > subgroups[otherSubgroup].index) { subgroups[subgroup].top += subgroups[otherSubgroup].height; } } const items = subgroupItems[subgroup]; for(let i = 0; i < items.length; i++) { if (items[i].data.subgroup !== undefined) { items[i].top = subgroups[items[i].data.subgroup].top + 0.5 * margin.item.vertical; if (subgroups[subgroup].stack) { items[i].baseTop = items[i].top; } } } if (doSubStack && subgroups[subgroup].stack) { substack(subgroupItems[subgroup], margin, subgroups[subgroup]); } } } } /** * Test if the two provided items collide * The items must have parameters left, width, top, and height. * @param {Item} a The first item * @param {Item} b The second item * @param {{horizontal: number, vertical: number}} margin * An object containing a horizontal and vertical * minimum required margin. * @param {boolean} rtl * @return {boolean} true if a and b collide, else false */ function collision(a, b, margin, rtl) { if (rtl) { return ((a.right - margin.horizontal + EPSILON) < (b.right + b.width) && (a.right + a.width + margin.horizontal - EPSILON) > b.right && (a.top - margin.vertical + EPSILON) < (b.top + b.height) && (a.top + a.height + margin.vertical - EPSILON) > b.top); } else { return ((a.left - margin.horizontal + EPSILON) < (b.left + b.width) && (a.left + a.width + margin.horizontal - EPSILON) > b.left && (a.top - margin.vertical + EPSILON) < (b.top + b.height) && (a.top + a.height + margin.vertical - EPSILON) > b.top); } } /** * Test if the two provided objects collide * The objects must have parameters start, end, top, and height. * @param {Object} a The first Object * @param {Object} b The second Object * @return {boolean} true if a and b collide, else false */ function collisionByTimes(a, b) { // Check for overlap by time and height. Abutting is OK and // not considered a collision while overlap is considered a collision. const timeOverlap = a.start < b.end && a.end > b.start; const heightOverlap = a.top < (b.top + b.height) && (a.top + a.height) > b.top; return timeOverlap && heightOverlap; } const UNGROUPED = '__ungrouped__'; // reserved group id for ungrouped items const BACKGROUND = '__background__'; // reserved group id for background items without group const ReservedGroupIds = { UNGROUPED, BACKGROUND }; /** * @constructor Group */ class Group { /** * @param {number | string} groupId * @param {Object} data * @param {ItemSet} itemSet * @constructor Group */ constructor(groupId, data, itemSet) { this.groupId = groupId; this.subgroups = {}; this.subgroupStack = {}; this.subgroupStackAll = false; this.subgroupVisibility = {}; this.doInnerStack = false; this.shouldBailStackItems = false; this.subgroupIndex = 0; this.subgroupOrderer = data && data.subgroupOrder; this.itemSet = itemSet; this.isVisible = null; this.stackDirty = true; // if true, items will be restacked on next redraw // This is a stack of functions (`() => void`) that will be executed before // the instance is disposed off (method `dispose`). Anything that needs to // be manually disposed off before garbage collection happens (or so that // garbage collection can happen) should be added to this stack. this._disposeCallbacks = []; if (data && data.nestedGroups) { this.nestedGroups = data.nestedGroups; if (data.showNested == false) { this.showNested = false; } else { this.showNested = true; } } if (data && data.subgroupStack) { if (typeof data.subgroupStack === "boolean") { this.doInnerStack = data.subgroupStack; this.subgroupStackAll = data.subgroupStack; } else { // We might be doing stacking on specific sub groups, but only // if at least one is set to do stacking for(const key in data.subgroupStack) { this.subgroupStack[key] = data.subgroupStack[key]; this.doInnerStack = this.doInnerStack || data.subgroupStack[key]; } } } if (data && data.heightMode) { this.heightMode = data.heightMode; } else { this.heightMode = itemSet.options.groupHeightMode; } this.nestedInGroup = null; this.dom = {}; this.props = { label: { width: 0, height: 0 } }; this.className = null; this.items = {}; // items filtered by groupId of this group this.visibleItems = []; // items currently visible in window this.itemsInRange = []; // items currently in range this.orderedItems = { byStart: [], byEnd: [] }; this.checkRangedItems = false; // needed to refresh the ranged items if the window is programatically changed with NO overlap. const handleCheckRangedItems = () => { this.checkRangedItems = true; }; this.itemSet.body.emitter.on("checkRangedItems", handleCheckRangedItems); this._disposeCallbacks.push(() => { this.itemSet.body.emitter.off("checkRangedItems", handleCheckRangedItems); }); this._create(); this.setData(data); } /** * Create DOM elements for the group * @private */ _create() { const label = document.createElement('div'); if (this.itemSet.options.groupEditable.order) { label.className = 'vis-label draggable'; } else { label.className = 'vis-label'; } this.dom.label = label; const inner = document.createElement('div'); inner.className = 'vis-inner'; label.appendChild(inner); this.dom.inner = inner; const foreground = document.createElement('div'); foreground.className = 'vis-group'; foreground['vis-group'] = this; this.dom.foreground = foreground; this.dom.background = document.createElement('div'); this.dom.background.className = 'vis-group'; this.dom.axis = document.createElement('div'); this.dom.axis.className = 'vis-group'; // create a hidden marker to detect when the Timelines container is attached // to the DOM, or the style of a parent of the Timeline is changed from // display:none is changed to visible. this.dom.marker = document.createElement('div'); this.dom.marker.style.visibility = 'hidden'; this.dom.marker.style.position = 'absolute'; this.dom.marker.innerHTML = ''; this.dom.background.appendChild(this.dom.marker); } /** * Set the group data for this group * @param {Object} data Group data, can contain properties content and className */ setData(data) { if (this.itemSet.groupTouchParams.isDragging) return; // update contents let content; let templateFunction; if (data && data.subgroupVisibility) { for (const key in data.subgroupVisibility) { this.subgroupVisibility[key] = data.subgroupVisibility[key]; } } if (this.itemSet.options && this.itemSet.options.groupTemplate) { templateFunction = this.itemSet.options.groupTemplate.bind(this); content = templateFunction(data, this.dom.inner); } else { content = data && data.content; } if (content instanceof Element) { while (this.dom.inner.firstChild) { this.dom.inner.removeChild(this.dom.inner.firstChild); } this.dom.inner.appendChild(content); } else if (content instanceof Object && content.isReactComponent) ; else if (content instanceof Object) { templateFunction(data, this.dom.inner); } else if (content !== undefined && content !== null) { this.dom.inner.innerHTML = util$3.xss(content); } else { this.dom.inner.innerHTML = util$3.xss(this.groupId || ''); // groupId can be null } // update title this.dom.label.title = data && data.title || ''; if (!this.dom.inner.firstChild) { util$3.addClassName(this.dom.inner, 'vis-hidden'); } else { util$3.removeClassName(this.dom.inner, 'vis-hidden'); } if (data && data.nestedGroups) { if (!this.nestedGroups || this.nestedGroups != data.nestedGroups) { this.nestedGroups = data.nestedGroups; } if (data.showNested !== undefined || this.showNested === undefined) { if (data.showNested == false) { this.showNested = false; } else { this.showNested = true; } } util$3.addClassName(this.dom.label, 'vis-nesting-group'); if (this.showNested) { util$3.removeClassName(this.dom.label, 'collapsed'); util$3.addClassName(this.dom.label, 'expanded'); } else { util$3.removeClassName(this.dom.label, 'expanded'); util$3.addClassName(this.dom.label, 'collapsed'); } } else if (this.nestedGroups) { this.nestedGroups = null; util$3.removeClassName(this.dom.label, 'collapsed'); util$3.removeClassName(this.dom.label, 'expanded'); util$3.removeClassName(this.dom.label, 'vis-nesting-group'); } if (data && (data.treeLevel|| data.nestedInGroup)) { util$3.addClassName(this.dom.label, 'vis-nested-group'); if (data.treeLevel) { util$3.addClassName(this.dom.label, 'vis-group-level-' + data.treeLevel); } else { // Nesting level is unknown, but we're sure it's at least 1 util$3.addClassName(this.dom.label, 'vis-group-level-unknown-but-gte1'); } } else { util$3.addClassName(this.dom.label, 'vis-group-level-0'); } // update className const className = data && data.className || null; if (className != this.className) { if (this.className) { util$3.removeClassName(this.dom.label, this.className); util$3.removeClassName(this.dom.foreground, this.className); util$3.removeClassName(this.dom.background, this.className); util$3.removeClassName(this.dom.axis, this.className); } util$3.addClassName(this.dom.label, className); util$3.addClassName(this.dom.foreground, className); util$3.addClassName(this.dom.background, className); util$3.addClassName(this.dom.axis, className); this.className = className; } // update style if (this.style) { util$3.removeCssText(this.dom.label, this.style); this.style = null; } if (data && data.style) { util$3.addCssText(this.dom.label, data.style); this.style = data.style; } } /** * Get the width of the group label * @return {number} width */ getLabelWidth() { return this.props.label.width; } /** * check if group has had an initial height hange * @returns {boolean} */ _didMarkerHeightChange() { const markerHeight = this.dom.marker.clientHeight; if (markerHeight != this.lastMarkerHeight) { this.lastMarkerHeight = markerHeight; const redrawQueue = {}; let redrawQueueLength = 0; util$3.forEach(this.items, (item, key) => { item.dirty = true; if (item.displayed) { const returnQueue = true; redrawQueue[key] = item.redraw(returnQueue); redrawQueueLength = redrawQueue[key].length; } }); const needRedraw = redrawQueueLength > 0; if (needRedraw) { // redraw all regular items for (let i = 0; i < redrawQueueLength; i++) { util$3.forEach(redrawQueue, fns => { fns[i](); }); } } return true; } else { return false; } } /** * calculate group dimentions and position * @param {number} pixels */ _calculateGroupSizeAndPosition() { const { offsetTop, offsetLeft, offsetWidth } = this.dom.foreground; this.top = offsetTop; this.right = offsetLeft; this.width = offsetWidth; } /** * checks if should bail redraw of items * @returns {boolean} should bail */ _shouldBailItemsRedraw() { const me = this; const timeoutOptions = this.itemSet.options.onTimeout; const bailOptions = { relativeBailingTime: this.itemSet.itemsSettingTime, bailTimeMs: timeoutOptions && timeoutOptions.timeoutMs, userBailFunction: timeoutOptions && timeoutOptions.callback, shouldBailStackItems: this.shouldBailStackItems }; let bail = null; if (!this.itemSet.initialDrawDone) { if (bailOptions.shouldBailStackItems) { return true; } if (Math.abs(Date.now() - new Date(bailOptions.relativeBailingTime)) > bailOptions.bailTimeMs) { if (bailOptions.userBailFunction && this.itemSet.userContinueNotBail == null) { bailOptions.userBailFunction(didUserContinue => { me.itemSet.userContinueNotBail = didUserContinue; bail = !didUserContinue; }); } else if (me.itemSet.userContinueNotBail == false) { bail = true; } else { bail = false; } } } return bail; } /** * redraws items * @param {boolean} forceRestack * @param {boolean} lastIsVisible * @param {number} margin * @param {object} range * @private */ _redrawItems(forceRestack, lastIsVisible, margin, range) { const restack = forceRestack || this.stackDirty || this.isVisible && !lastIsVisible; // if restacking, reposition visible items vertically if (restack) { const orderedItems = { byEnd: this.orderedItems.byEnd.filter(item => !item.isCluster), byStart: this.orderedItems.byStart.filter(item => !item.isCluster) }; const orderedClusters = { byEnd: [...new Set(this.orderedItems.byEnd.map(item => item.cluster).filter(item => !!item))], byStart: [...new Set(this.orderedItems.byStart.map(item => item.cluster).filter(item => !!item))], }; /** * Get all visible items in range * @return {array} items */ const getVisibleItems = () => { const visibleItems = this._updateItemsInRange(orderedItems, this.visibleItems.filter(item => !item.isCluster), range); const visibleClusters = this._updateClustersInRange(orderedClusters, this.visibleItems.filter(item => item.isCluster), range); return [...visibleItems, ...visibleClusters]; }; /** * Get visible items grouped by subgroup * @param {function} orderFn An optional function to order items inside the subgroups * @return {Object} */ const getVisibleItemsGroupedBySubgroup = orderFn => { let visibleSubgroupsItems = {}; for (const subgroup in this.subgroups) { const items = this.visibleItems.filter(item => item.data.subgroup === subgroup); visibleSubgroupsItems[subgroup] = orderFn ? items.sort((a, b) => orderFn(a.data, b.data)) : items; } return visibleSubgroupsItems; }; if (typeof this.itemSet.options.order === 'function') { // a custom order function //show all items const me = this; if (this.doInnerStack && this.itemSet.options.stackSubgroups) { // Order the items within each subgroup const visibleSubgroupsItems = getVisibleItemsGroupedBySubgroup(this.itemSet.options.order); stackSubgroupsWithInnerStack(visibleSubgroupsItems, margin, this.subgroups); this.visibleItems = getVisibleItems(); this._updateSubGroupHeights(margin); } else { this.visibleItems = getVisibleItems(); this._updateSubGroupHeights(margin); // order all items and force a restacking // order all items outside clusters and force a restacking const customOrderedItems = this.visibleItems .slice() .filter(item => item.isCluster || (!item.isCluster && !item.cluster)) .sort((a, b) => { return me.itemSet.options.order(a.data, b.data); }); this.shouldBailStackItems = stack(customOrderedItems, margin, true, this._shouldBailItemsRedraw.bind(this)); } } else { // no custom order function, lazy stacking this.visibleItems = getVisibleItems(); this._updateSubGroupHeights(margin); if (this.itemSet.options.stack) { if (this.doInnerStack && this.itemSet.options.stackSubgroups) { const visibleSubgroupsItems = getVisibleItemsGroupedBySubgroup(); stackSubgroupsWithInnerStack(visibleSubgroupsItems, margin, this.subgroups); } else { // TODO: ugly way to access options... this.shouldBailStackItems = stack(this.visibleItems, margin, true, this._shouldBailItemsRedraw.bind(this)); } } else { // no stacking nostack(this.visibleItems, margin, this.subgroups, this.itemSet.options.stackSubgroups); } } for (let i = 0; i < this.visibleItems.length; i++) { this.visibleItems[i].repositionX(); if (this.subgroupVisibility[this.visibleItems[i].data.subgroup] !== undefined) { if (!this.subgroupVisibility[this.visibleItems[i].data.subgroup]) { this.visibleItems[i].hide(); } } } if (this.itemSet.options.cluster) { util$3.forEach(this.items, item => { if (item.cluster && item.displayed) { item.hide(); } }); } if (this.shouldBailStackItems) { this.itemSet.body.emitter.emit('destroyTimeline'); } this.stackDirty = false; } } /** * check if group resized * @param {boolean} resized * @param {number} height * @return {boolean} did resize */ _didResize(resized, height) { resized = util$3.updateProperty(this, 'height', height) || resized; // recalculate size of label const labelWidth = this.dom.inner.clientWidth; const labelHeight = this.dom.inner.clientHeight; resized = util$3.updateProperty(this.props.label, 'width', labelWidth) || resized; resized = util$3.updateProperty(this.props.label, 'height', labelHeight) || resized; return resized; } /** * apply group height * @param {number} height */ _applyGroupHeight(height) { this.dom.background.style.height = `${height}px`; this.dom.foreground.style.height = `${height}px`; this.dom.label.style.height = `${height}px`; } /** * update vertical position of items after they are re-stacked and the height of the group is calculated * @param {number} margin */ _updateItemsVerticalPosition(margin) { for (let i = 0, ii = this.visibleItems.length; i < ii; i++) { const item = this.visibleItems[i]; item.repositionY(margin); if (!this.isVisible && this.groupId != ReservedGroupIds.BACKGROUND) { if (item.displayed) item.hide(); } } } /** * Repaint this group * @param {{start: number, end: number}} range * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * @param {boolean} [forceRestack=false] Force restacking of all items * @param {boolean} [returnQueue=false] return the queue or if the group resized * @return {boolean} Returns true if the group is resized or the redraw queue if returnQueue=true */ redraw(range, margin, forceRestack, returnQueue) { let resized = false; const lastIsVisible = this.isVisible; let height; const queue = [ () => { forceRestack = this._didMarkerHeightChange.call(this) || forceRestack; }, // recalculate the height of the subgroups this._updateSubGroupHeights.bind(this, margin), // calculate actual size and position this._calculateGroupSizeAndPosition.bind(this), () => { this.isVisible = this._isGroupVisible.bind(this)(range, margin); }, () => { this._redrawItems.bind(this)(forceRestack, lastIsVisible, margin, range); }, // update subgroups this._updateSubgroupsSizes.bind(this), () => { height = this._calculateHeight.bind(this)(margin); }, // calculate actual size and position again this._calculateGroupSizeAndPosition.bind(this), () => { resized = this._didResize.bind(this)(resized, height); }, () => { this._applyGroupHeight.bind(this)(height); }, () => { this._updateItemsVerticalPosition.bind(this)(margin); }, (() => { if (!this.isVisible && this.height) { resized = false; } return resized }).bind(this) ]; if (returnQueue) { return queue; } else { let result; queue.forEach(fn => { result = fn(); }); return result; } } /** * recalculate the height of the subgroups * * @param {{item: timeline.Item}} margin * @private */ _updateSubGroupHeights(margin) { if (Object.keys(this.subgroups).length > 0) { const me = this; this._resetSubgroups(); util$3.forEach(this.visibleItems, item => { if (item.data.subgroup !== undefined) { me.subgroups[item.data.subgroup].height = Math.max(me.subgroups[item.data.subgroup].height, item.height + margin.item.vertical); me.subgroups[item.data.subgroup].visible = typeof this.subgroupVisibility[item.data.subgroup] === 'undefined' ? true : Boolean(this.subgroupVisibility[item.data.subgroup]); } }); } } /** * check if group is visible * * @param {timeline.Range} range * @param {{axis: timeline.DataAxis}} margin * @returns {boolean} is visible * @private */ _isGroupVisible(range, margin) { return (this.top <= range.body.domProps.centerContainer.height - range.body.domProps.scrollTop + margin.axis) && (this.top + this.height + margin.axis >= - range.body.domProps.scrollTop); } /** * recalculate the height of the group * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * @returns {number} Returns the height * @private */ _calculateHeight(margin) { // recalculate the height of the group let height; let items; if (this.heightMode === 'fixed') { items = util$3.toArray(this.items); } else { // default or 'auto' items = this.visibleItems; } if (items.length > 0) { let min = items[0].top; let max = items[0].top + items[0].height; util$3.forEach(items, item => { min = Math.min(min, item.top); max = Math.max(max, (item.top + item.height)); }); if (min > margin.axis) { // there is an empty gap between the lowest item and the axis const offset = min - margin.axis; max -= offset; util$3.forEach(items, item => { item.top -= offset; }); } height = Math.ceil(max + margin.item.vertical / 2); if (this.heightMode !== "fitItems") { height = Math.max(height, this.props.label.height); } } else { height = this.props.label.height; } return height; } /** * Show this group: attach to the DOM */ show() { if (!this.dom.label.parentNode) { this.itemSet.dom.labelSet.appendChild(this.dom.label); } if (!this.dom.foreground.parentNode) { this.itemSet.dom.foreground.appendChild(this.dom.foreground); } if (!this.dom.background.parentNode) { this.itemSet.dom.background.appendChild(this.dom.background); } if (!this.dom.axis.parentNode) { this.itemSet.dom.axis.appendChild(this.dom.axis); } } /** * Hide this group: remove from the DOM */ hide() { const label = this.dom.label; if (label.parentNode) { label.parentNode.removeChild(label); } const foreground = this.dom.foreground; if (foreground.parentNode) { foreground.parentNode.removeChild(foreground); } const background = this.dom.background; if (background.parentNode) { background.parentNode.removeChild(background); } const axis = this.dom.axis; if (axis.parentNode) { axis.parentNode.removeChild(axis); } } /** * Add an item to the group * @param {Item} item */ add(item) { this.items[item.id] = item; item.setParent(this); this.stackDirty = true; // add to if (item.data.subgroup !== undefined) { this._addToSubgroup(item); this.orderSubgroups(); } if (!this.visibleItems.includes(item)) { const range = this.itemSet.body.range; // TODO: not nice accessing the range like this this._checkIfVisible(item, this.visibleItems, range); } } /** * add item to subgroup * @param {object} item * @param {string} subgroupId */ _addToSubgroup(item, subgroupId=item.data.subgroup) { if (subgroupId != undefined && this.subgroups[subgroupId] === undefined) { this.subgroups[subgroupId] = { height: 0, top: 0, start: item.data.start, end: item.data.end || item.data.start, visible: false, index: this.subgroupIndex, items: [], stack: this.subgroupStackAll || this.subgroupStack[subgroupId] || false }; this.subgroupIndex++; } if (new Date(item.data.start) < new Date(this.subgroups[subgroupId].start)) { this.subgroups[subgroupId].start = item.data.start; } const itemEnd = item.data.end || item.data.start; if (new Date(itemEnd) > new Date(this.subgroups[subgroupId].end)) { this.subgroups[subgroupId].end = itemEnd; } this.subgroups[subgroupId].items.push(item); } /** * update subgroup sizes */ _updateSubgroupsSizes() { const me = this; if (me.subgroups) { for (const subgroup in me.subgroups) { const initialEnd = me.subgroups[subgroup].items[0].data.end || me.subgroups[subgroup].items[0].data.start; let newStart = me.subgroups[subgroup].items[0].data.start; let newEnd = initialEnd - 1; me.subgroups[subgroup].items.forEach(item => { if (new Date(item.data.start) < new Date(newStart)) { newStart = item.data.start; } const itemEnd = item.data.end || item.data.start; if (new Date(itemEnd) > new Date(newEnd)) { newEnd = itemEnd; } }); me.subgroups[subgroup].start = newStart; me.subgroups[subgroup].end = new Date(newEnd - 1); // -1 to compensate for colliding end to start subgroups; } } } /** * order subgroups */ orderSubgroups() { if (this.subgroupOrderer !== undefined) { const sortArray = []; if (typeof this.subgroupOrderer == 'string') { for (const subgroup in this.subgroups) { sortArray.push({subgroup, sortField: this.subgroups[subgroup].items[0].data[this.subgroupOrderer]}); } sortArray.sort((a, b) => a.sortField - b.sortField); } else if (typeof this.subgroupOrderer == 'function') { for (const subgroup in this.subgroups) { sortArray.push(this.subgroups[subgroup].items[0].data); } sortArray.sort(this.subgroupOrderer); } if (sortArray.length > 0) { for (let i = 0; i < sortArray.length; i++) { this.subgroups[sortArray[i].subgroup].index = i; } } } } /** * add item to subgroup */ _resetSubgroups() { for (const subgroup in this.subgroups) { if (this.subgroups.hasOwnProperty(subgroup)) { this.subgroups[subgroup].visible = false; this.subgroups[subgroup].height = 0; } } } /** * Remove an item from the group * @param {Item} item */ remove(item) { delete this.items[item.id]; item.setParent(null); this.stackDirty = true; // remove from visible items const index = this.visibleItems.indexOf(item); if (index != -1) this.visibleItems.splice(index, 1); if(item.data.subgroup !== undefined){ this._removeFromSubgroup(item); this.orderSubgroups(); } } /** * remove item from subgroup * @param {object} item * @param {string} subgroupId */ _removeFromSubgroup(item, subgroupId=item.data.subgroup) { if (subgroupId != undefined) { const subgroup = this.subgroups[subgroupId]; if (subgroup){ const itemIndex = subgroup.items.indexOf(item); // Check the item is actually in this subgroup. How should items not in the group be handled? if (itemIndex >= 0) { subgroup.items.splice(itemIndex,1); if (!subgroup.items.length){ delete this.subgroups[subgroupId]; } else { this._updateSubgroupsSizes(); } } } } } /** * Remove an item from the corresponding DataSet * @param {Item} item */ removeFromDataSet(item) { this.itemSet.removeItem(item.id); } /** * Reorder the items */ order() { const array = util$3.toArray(this.items); const startArray = []; const endArray = []; for (let i = 0; i < array.length; i++) { if (array[i].data.end !== undefined) { endArray.push(array[i]); } startArray.push(array[i]); } this.orderedItems = { byStart: startArray, byEnd: endArray }; orderByStart(this.orderedItems.byStart); orderByEnd(this.orderedItems.byEnd); } /** * Update the visible items * @param {{byStart: Item[], byEnd: Item[]}} orderedItems All items ordered by start date and by end date * @param {Item[]} oldVisibleItems The previously visible items. * @param {{start: number, end: number}} range Visible range * @return {Item[]} visibleItems The new visible items. * @private */ _updateItemsInRange(orderedItems, oldVisibleItems, range) { const visibleItems = []; const visibleItemsLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems if (!this.isVisible && this.groupId != ReservedGroupIds.BACKGROUND) { for (let i = 0; i < oldVisibleItems.length; i++) { var item = oldVisibleItems[i]; if (item.displayed) item.hide(); } return visibleItems; } const interval = (range.end - range.start) / 4; const lowerBound = range.start - interval; const upperBound = range.end + interval; // this function is used to do the binary search for items having start date only. const startSearchFunction = value => { if (value < lowerBound) {return -1;} else if (value <= upperBound) {return 0;} else {return 1;} }; // this function is used to do the binary search for items having start and end dates (range). const endSearchFunction = data => { const {start, end} = data; if (end < lowerBound) {return -1;} else if (start <= upperBound) {return 0;} else {return 1;} }; // first check if the items that were in view previously are still in view. // IMPORTANT: this handles the case for the items with startdate before the window and enddate after the window! // also cleans up invisible items. if (oldVisibleItems.length > 0) { for (let i = 0; i < oldVisibleItems.length; i++) { this._checkIfVisibleWithReference(oldVisibleItems[i], visibleItems, visibleItemsLookup, range); } } // we do a binary search for the items that have only start values. const initialPosByStart = util$3.binarySearchCustom(orderedItems.byStart, startSearchFunction, 'data','start'); // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the start values. this._traceVisible(initialPosByStart, orderedItems.byStart, visibleItems, visibleItemsLookup, item => item.data.start < lowerBound || item.data.start > upperBound); // if the window has changed programmatically without overlapping the old window, the ranged items with start < lowerBound and end > upperbound are not shown. // We therefore have to brute force check all items in the byEnd list if (this.checkRangedItems == true) { this.checkRangedItems = false; for (let i = 0; i < orderedItems.byEnd.length; i++) { this._checkIfVisibleWithReference(orderedItems.byEnd[i], visibleItems, visibleItemsLookup, range); } } else { // we do a binary search for the items that have defined end times. const initialPosByEnd = util$3.binarySearchCustom(orderedItems.byEnd, endSearchFunction, 'data'); // trace the visible items from the inital start pos both ways until an invisible item is found, we only look at the end values. this._traceVisible(initialPosByEnd, orderedItems.byEnd, visibleItems, visibleItemsLookup, item => item.data.end < lowerBound || item.data.start > upperBound); } const redrawQueue = {}; let redrawQueueLength = 0; for (let i = 0; i < visibleItems.length; i++) { const item = visibleItems[i]; if (!item.displayed) { const returnQueue = true; redrawQueue[i] = item.redraw(returnQueue); redrawQueueLength = redrawQueue[i].length; } } const needRedraw = redrawQueueLength > 0; if (needRedraw) { // redraw all regular items for (let j = 0; j < redrawQueueLength; j++) { util$3.forEach(redrawQueue, fns => { fns[j](); }); } } for (let i = 0; i < visibleItems.length; i++) { visibleItems[i].repositionX(); } return visibleItems; } /** * trace visible items in group * @param {number} initialPos * @param {array} items * @param {aray} visibleItems * @param {object} visibleItemsLookup * @param {function} breakCondition */ _traceVisible(initialPos, items, visibleItems, visibleItemsLookup, breakCondition) { if (initialPos != -1) { for (let i = initialPos; i >= 0; i--) { let item = items[i]; if (breakCondition(item)) { break; } else { if (!(item.isCluster && !item.hasItems()) && !item.cluster) { if (visibleItemsLookup[item.id] === undefined) { visibleItemsLookup[item.id] = true; visibleItems.push(item); } } } } for (let i = initialPos + 1; i < items.length; i++) { let item = items[i]; if (breakCondition(item)) { break; } else { if (!(item.isCluster && !item.hasItems()) && !item.cluster) { if (visibleItemsLookup[item.id] === undefined) { visibleItemsLookup[item.id] = true; visibleItems.push(item); } } } } } } /** * this function is very similar to the _checkIfInvisible() but it does not * return booleans, hides the item if it should not be seen and always adds to * the visibleItems. * this one is for brute forcing and hiding. * * @param {Item} item * @param {Array} visibleItems * @param {{start:number, end:number}} range * @private */ _checkIfVisible(item, visibleItems, range) { if (item.isVisible(range)) { if (!item.displayed) item.show(); // reposition item horizontally item.repositionX(); visibleItems.push(item); } else { if (item.displayed) item.hide(); } } /** * this function is very similar to the _checkIfInvisible() but it does not * return booleans, hides the item if it should not be seen and always adds to * the visibleItems. * this one is for brute forcing and hiding. * * @param {Item} item * @param {Array.<timeline.Item>} visibleItems * @param {Object<number, boolean>} visibleItemsLookup * @param {{start:number, end:number}} range * @private */ _checkIfVisibleWithReference(item, visibleItems, visibleItemsLookup, range) { if (item.isVisible(range)) { if (visibleItemsLookup[item.id] === undefined) { visibleItemsLookup[item.id] = true; visibleItems.push(item); } } else { if (item.displayed) item.hide(); } } /** * Update the visible items * @param {array} orderedClusters * @param {array} oldVisibleClusters * @param {{start: number, end: number}} range * @return {Item[]} visibleItems * @private */ _updateClustersInRange(orderedClusters, oldVisibleClusters, range) { // Clusters can overlap each other so we cannot use binary search here const visibleClusters = []; const visibleClustersLookup = {}; // we keep this to quickly look up if an item already exists in the list without using indexOf on visibleItems if (oldVisibleClusters.length > 0) { for (let i = 0; i < oldVisibleClusters.length; i++) { this._checkIfVisibleWithReference(oldVisibleClusters[i], visibleClusters, visibleClustersLookup, range); } } for (let i = 0; i < orderedClusters.byStart.length; i++) { this._checkIfVisibleWithReference(orderedClusters.byStart[i], visibleClusters, visibleClustersLookup, range); } for (let i = 0; i < orderedClusters.byEnd.length; i++) { this._checkIfVisibleWithReference(orderedClusters.byEnd[i], visibleClusters, visibleClustersLookup, range); } const redrawQueue = {}; let redrawQueueLength = 0; for (let i = 0; i < visibleClusters.length; i++) { const item = visibleClusters[i]; if (!item.displayed) { const returnQueue = true; redrawQueue[i] = item.redraw(returnQueue); redrawQueueLength = redrawQueue[i].length; } } const needRedraw = redrawQueueLength > 0; if (needRedraw) { // redraw all regular items for (var j = 0; j < redrawQueueLength; j++) { util$3.forEach(redrawQueue, function (fns) { fns[j](); }); } } for (let i = 0; i < visibleClusters.length; i++) { visibleClusters[i].repositionX(); } return visibleClusters; } /** * change item subgroup * @param {object} item * @param {string} oldSubgroup * @param {string} newSubgroup */ changeSubgroup(item, oldSubgroup, newSubgroup) { this._removeFromSubgroup(item, oldSubgroup); this._addToSubgroup(item, newSubgroup); this.orderSubgroups(); } /** * Call this method before you lose the last reference to an instance of this. * It will remove listeners etc. */ dispose() { this.hide(); let disposeCallback; while ((disposeCallback = this._disposeCallbacks.pop())) { disposeCallback(); } } } /** * @constructor BackgroundGroup * @extends Group */ class BackgroundGroup extends Group { /** * @param {number | string} groupId * @param {Object} data * @param {ItemSet} itemSet */ constructor(groupId, data, itemSet) { super(groupId, data, itemSet); // Group.call(this, groupId, data, itemSet); this.width = 0; this.height = 0; this.top = 0; this.left = 0; } /** * Repaint this group * @param {{start: number, end: number}} range * @param {{item: {horizontal: number, vertical: number}, axis: number}} margin * @param {boolean} [forceRestack=false] Force restacking of all items * @return {boolean} Returns true if the group is resized */ redraw(range, margin, forceRestack) { // eslint-disable-line no-unused-vars const resized = false; this.visibleItems = this._updateItemsInRange(this.orderedItems, this.visibleItems, range); // calculate actual size this.width = this.dom.background.offsetWidth; // apply new height (just always zero for BackgroundGroup this.dom.background.style.height = '0'; // update vertical position of items after they are re-stacked and the height of the group is calculated for (let i = 0, ii = this.visibleItems.length; i < ii; i++) { const item = this.visibleItems[i]; item.repositionY(margin); } return resized; } /** * Show this group: attach to the DOM */ show() { if (!this.dom.background.parentNode) { this.itemSet.dom.background.appendChild(this.dom.background); } } } /** * Item */ class Item { /** * @constructor Item * @param {Object} data Object containing (optional) parameters type, * start, end, content, group, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} options Configuration options * // TODO: describe available options */ constructor(data, conversion, options) { this.id = null; this.parent = null; this.data = data; this.dom = null; this.conversion = conversion || {}; this.defaultOptions = { locales, locale: 'en' }; this.options = util$3.extend({}, this.defaultOptions, options); this.options.locales = util$3.extend({}, locales, this.options.locales); const defaultLocales = this.defaultOptions.locales[this.defaultOptions.locale]; Object.keys(this.options.locales).forEach(locale => { this.options.locales[locale] = util$3.extend( {}, defaultLocales, this.options.locales[locale] ); }); this.selected = false; this.displayed = false; this.groupShowing = true; this.selectable = (options && options.selectable) || false; this.dirty = true; this.top = null; this.right = null; this.left = null; this.width = null; this.height = null; this.setSelectability(data); this.editable = null; this._updateEditStatus(); } /** * Select current item */ select() { if (this.selectable) { this.selected = true; this.dirty = true; if (this.displayed) this.redraw(); } } /** * Unselect current item */ unselect() { this.selected = false; this.dirty = true; if (this.displayed) this.redraw(); } /** * Set data for the item. Existing data will be updated. The id should not * be changed. When the item is displayed, it will be redrawn immediately. * @param {Object} data */ setData(data) { const groupChanged = data.group != undefined && this.data.group != data.group; if (groupChanged && this.parent != null) { this.parent.itemSet._moveToGroup(this, data.group); } this.setSelectability(data); if (this.parent) { this.parent.stackDirty = true; } const subGroupChanged = data.subgroup != undefined && this.data.subgroup != data.subgroup; if (subGroupChanged && this.parent != null) { this.parent.changeSubgroup(this, this.data.subgroup, data.subgroup); } this.data = data; this._updateEditStatus(); this.dirty = true; if (this.displayed) this.redraw(); } /** * Set whether the item can be selected. * Can only be set/unset if the timeline's `selectable` configuration option is `true`. * @param {Object} data `data` from `constructor` and `setData` */ setSelectability(data) { if (data) { this.selectable = typeof data.selectable === 'undefined' ? true : Boolean(data.selectable); } } /** * Set a parent for the item * @param {Group} parent */ setParent(parent) { if (this.displayed) { this.hide(); this.parent = parent; if (this.parent) { this.show(); } } else { this.parent = parent; } } /** * Check whether this item is visible inside given range * @param {timeline.Range} range with a timestamp for start and end * @returns {boolean} True if visible */ isVisible(range) { // eslint-disable-line no-unused-vars return false; } /** * Show the Item in the DOM (when not already visible) * @return {Boolean} changed */ show() { return false; } /** * Hide the Item from the DOM (when visible) * @return {Boolean} changed */ hide() { return false; } /** * Repaint the item */ redraw() { // should be implemented by the item } /** * Reposition the Item horizontally */ repositionX() { // should be implemented by the item } /** * Reposition the Item vertically */ repositionY() { // should be implemented by the item } /** * Repaint a drag area on the center of the item when the item is selected * @protected */ _repaintDragCenter() { if (this.selected && this.editable.updateTime && !this.dom.dragCenter) { const me = this; // create and show drag area const dragCenter = document.createElement('div'); dragCenter.className = 'vis-drag-center'; dragCenter.dragCenterItem = this; this.hammerDragCenter = new Hammer$2(dragCenter); this.hammerDragCenter.on('tap', event => { me.parent.itemSet.body.emitter.emit('click', { event, item: me.id }); }); this.hammerDragCenter.on('doubletap', event => { event.stopPropagation(); me.parent.itemSet._onUpdateItem(me); me.parent.itemSet.body.emitter.emit('doubleClick', { event, item: me.id }); }); this.hammerDragCenter.on('panstart', event => { // do not allow this event to propagate to the Range event.stopPropagation(); me.parent.itemSet._onDragStart(event); }); this.hammerDragCenter.on('panmove', me.parent.itemSet._onDrag.bind(me.parent.itemSet)); this.hammerDragCenter.on('panend', me.parent.itemSet._onDragEnd.bind(me.parent.itemSet)); if (this.dom.box) { if (this.dom.dragLeft) { this.dom.box.insertBefore(dragCenter, this.dom.dragLeft); } else { this.dom.box.appendChild(dragCenter); } } else if (this.dom.point) { this.dom.point.appendChild(dragCenter); } this.dom.dragCenter = dragCenter; } else if (!this.selected && this.dom.dragCenter) { // delete drag area if (this.dom.dragCenter.parentNode) { this.dom.dragCenter.parentNode.removeChild(this.dom.dragCenter); } this.dom.dragCenter = null; if (this.hammerDragCenter) { this.hammerDragCenter.destroy(); this.hammerDragCenter = null; } } } /** * Repaint a delete button on the top right of the item when the item is selected * @param {HTMLElement} anchor * @protected */ _repaintDeleteButton(anchor) { const editable = ((this.options.editable.overrideItems || this.editable == null) && this.options.editable.remove) || (!this.options.editable.overrideItems && this.editable != null && this.editable.remove); if (this.selected && editable && !this.dom.deleteButton) { // create and show button const me = this; const deleteButton = document.createElement('div'); if (this.options.rtl) { deleteButton.className = 'vis-delete-rtl'; } else { deleteButton.className = 'vis-delete'; } let optionsLocale = this.options.locales[this.options.locale]; if (!optionsLocale) { if (!this.warned) { console.warn(`WARNING: options.locales['${this.options.locale}'] not found. See https://visjs.github.io/vis-timeline/docs/timeline/#Localization`); this.warned = true; } optionsLocale = this.options.locales['en']; // fall back on english when not available } deleteButton.title = optionsLocale.deleteSelected; // TODO: be able to destroy the delete button this.hammerDeleteButton = new Hammer$2(deleteButton).on('tap', event => { event.stopPropagation(); me.parent.removeFromDataSet(me); }); anchor.appendChild(deleteButton); this.dom.deleteButton = deleteButton; } else if (!this.selected && this.dom.deleteButton) { // remove button if (this.dom.deleteButton.parentNode) { this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton); } this.dom.deleteButton = null; if (this.hammerDeleteButton) { this.hammerDeleteButton.destroy(); this.hammerDeleteButton = null; } } } /** * Repaint a onChange tooltip on the top right of the item when the item is selected * @param {HTMLElement} anchor * @protected */ _repaintOnItemUpdateTimeTooltip(anchor) { if (!this.options.tooltipOnItemUpdateTime) return; const editable = (this.options.editable.updateTime || this.data.editable === true) && this.data.editable !== false; if (this.selected && editable && !this.dom.onItemUpdateTimeTooltip) { const onItemUpdateTimeTooltip = document.createElement('div'); onItemUpdateTimeTooltip.className = 'vis-onUpdateTime-tooltip'; anchor.appendChild(onItemUpdateTimeTooltip); this.dom.onItemUpdateTimeTooltip = onItemUpdateTimeTooltip; } else if (!this.selected && this.dom.onItemUpdateTimeTooltip) { // remove button if (this.dom.onItemUpdateTimeTooltip.parentNode) { this.dom.onItemUpdateTimeTooltip.parentNode.removeChild(this.dom.onItemUpdateTimeTooltip); } this.dom.onItemUpdateTimeTooltip = null; } // position onChange tooltip if (this.dom.onItemUpdateTimeTooltip) { // only show when editing this.dom.onItemUpdateTimeTooltip.style.visibility = this.parent.itemSet.touchParams.itemIsDragging ? 'visible' : 'hidden'; // position relative to item's content this.dom.onItemUpdateTimeTooltip.style.transform = 'translateX(-50%)'; this.dom.onItemUpdateTimeTooltip.style.left = '50%'; // position above or below the item depending on the item's position in the window const tooltipOffset = 50; // TODO: should be tooltip height (depends on template) const scrollTop = this.parent.itemSet.body.domProps.scrollTop; // TODO: this.top for orientation:true is actually the items distance from the bottom... // (should be this.bottom) let itemDistanceFromTop; if (this.options.orientation.item == 'top') { itemDistanceFromTop = this.top; } else { itemDistanceFromTop = (this.parent.height - this.top - this.height); } const isCloseToTop = itemDistanceFromTop + this.parent.top - tooltipOffset < -scrollTop; if (isCloseToTop) { this.dom.onItemUpdateTimeTooltip.style.bottom = ""; this.dom.onItemUpdateTimeTooltip.style.top = `${this.height + 2}px`; } else { this.dom.onItemUpdateTimeTooltip.style.top = ""; this.dom.onItemUpdateTimeTooltip.style.bottom = `${this.height + 2}px`; } // handle tooltip content let content; let templateFunction; if (this.options.tooltipOnItemUpdateTime && this.options.tooltipOnItemUpdateTime.template) { templateFunction = this.options.tooltipOnItemUpdateTime.template.bind(this); content = templateFunction(this.data); } else { content = `start: ${moment$1(this.data.start).format('MM/DD/YYYY hh:mm')}`; if (this.data.end) { content += `<br> end: ${moment$1(this.data.end).format('MM/DD/YYYY hh:mm')}`; } } this.dom.onItemUpdateTimeTooltip.innerHTML = util$3.xss(content); } } /** * get item data * @return {object} * @private */ _getItemData() { return this.parent.itemSet.itemsData.get(this.id); } /** * Set HTML contents for the item * @param {Element} element HTML element to fill with the contents * @private */ _updateContents(element) { let content; let changed; let templateFunction; let itemVisibleFrameContent; let visibleFrameTemplateFunction; const itemData = this._getItemData(); // get a clone of the data from the dataset const frameElement = this.dom.box || this.dom.point; const itemVisibleFrameContentElement = frameElement.getElementsByClassName('vis-item-visible-frame')[0]; if (this.options.visibleFrameTemplate) { visibleFrameTemplateFunction = this.options.visibleFrameTemplate.bind(this); itemVisibleFrameContent = util$3.xss(visibleFrameTemplateFunction(itemData, itemVisibleFrameContentElement)); } else { itemVisibleFrameContent = ''; } if (itemVisibleFrameContentElement) { if ((itemVisibleFrameContent instanceof Object) && !(itemVisibleFrameContent instanceof Element)) { visibleFrameTemplateFunction(itemData, itemVisibleFrameContentElement); } else { changed = this._contentToString(this.itemVisibleFrameContent) !== this._contentToString(itemVisibleFrameContent); if (changed) { // only replace the content when changed if (itemVisibleFrameContent instanceof Element) { itemVisibleFrameContentElement.innerHTML = ''; itemVisibleFrameContentElement.appendChild(itemVisibleFrameContent); } else if (itemVisibleFrameContent != undefined) { itemVisibleFrameContentElement.innerHTML = util$3.xss(itemVisibleFrameContent); } else { if (!(this.data.type == 'background' && this.data.content === undefined)) { throw new Error(`Property "content" missing in item ${this.id}`); } } this.itemVisibleFrameContent = itemVisibleFrameContent; } } } if (this.options.template) { templateFunction = this.options.template.bind(this); content = templateFunction(itemData, element, this.data); } else { content = this.data.content; } if ((content instanceof Object) && !(content instanceof Element)) { templateFunction(itemData, element); } else { changed = this._contentToString(this.content) !== this._contentToString(content); if (changed) { // only replace the content when changed if (content instanceof Element) { element.innerHTML = ''; element.appendChild(content); } else if (content != undefined) { element.innerHTML = util$3.xss(content); } else { if (!(this.data.type == 'background' && this.data.content === undefined)) { throw new Error(`Property "content" missing in item ${this.id}`); } } this.content = content; } } } /** * Process dataAttributes timeline option and set as data- attributes on dom.content * @param {Element} element HTML element to which the attributes will be attached * @private */ _updateDataAttributes(element) { if (this.options.dataAttributes && this.options.dataAttributes.length > 0) { let attributes = []; if (Array.isArray(this.options.dataAttributes)) { attributes = this.options.dataAttributes; } else if (this.options.dataAttributes == 'all') { attributes = Object.keys(this.data); } else { return; } for (const name of attributes) { const value = this.data[name]; if (value != null) { element.setAttribute(`data-${name}`, value); } else { element.removeAttribute(`data-${name}`); } } } } /** * Update custom styles of the element * @param {Element} element * @private */ _updateStyle(element) { // remove old styles if (this.style) { util$3.removeCssText(element, this.style); this.style = null; } // append new styles if (this.data.style) { util$3.addCssText(element, this.data.style); this.style = this.data.style; } } /** * Stringify the items contents * @param {string | Element | undefined} content * @returns {string | undefined} * @private */ _contentToString(content) { if (typeof content === 'string') return content; if (content && 'outerHTML' in content) return content.outerHTML; return content; } /** * Update the editability of this item. */ _updateEditStatus() { if (this.options) { if(typeof this.options.editable === 'boolean') { this.editable = { updateTime: this.options.editable, updateGroup: this.options.editable, remove: this.options.editable }; } else if(typeof this.options.editable === 'object') { this.editable = {}; util$3.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, this.options.editable); } } // Item data overrides, except if options.editable.overrideItems is set. if (!this.options || !(this.options.editable) || (this.options.editable.overrideItems !== true)) { if (this.data) { if (typeof this.data.editable === 'boolean') { this.editable = { updateTime: this.data.editable, updateGroup: this.data.editable, remove: this.data.editable }; } else if (typeof this.data.editable === 'object') { // TODO: in timeline.js 5.0, we should change this to not reset options from the timeline configuration. // Basically just remove the next line... this.editable = {}; util$3.selectiveExtend(['updateTime', 'updateGroup', 'remove'], this.editable, this.data.editable); } } } } /** * Return the width of the item left from its start date * @return {number} */ getWidthLeft() { return 0; } /** * Return the width of the item right from the max of its start and end date * @return {number} */ getWidthRight() { return 0; } /** * Return the title of the item * @return {string | undefined} */ getTitle() { if (this.options.tooltip && this.options.tooltip.template) { const templateFunction = this.options.tooltip.template.bind(this); return templateFunction(this._getItemData(), this.data); } return this.data.title; } } Item.prototype.stack = true; /** * @constructor BoxItem * @extends Item */ class BoxItem extends Item { /** * @param {Object} data Object containing parameters start * content, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} [options] Configuration options * // TODO: describe available options */ constructor(data, conversion, options) { super(data, conversion, options); this.props = { dot: { width: 0, height: 0 }, line: { width: 0, height: 0 } }; // validate data if (data) { if (data.start == undefined) { throw new Error(`Property "start" missing in item ${data}`); } } } /** * Check whether this item is visible inside given range * @param {{start: number, end: number}} range with a timestamp for start and end * @returns {boolean} True if visible */ isVisible(range) { if (this.cluster) { return false; } // determine visibility let isVisible; const align = this.data.align || this.options.align; const widthInMs = this.width * range.getMillisecondsPerPixel(); if (align == 'right') { isVisible = (this.data.start.getTime() > range.start) && (this.data.start.getTime() - widthInMs < range.end); } else if (align == 'left') { isVisible = (this.data.start.getTime() + widthInMs > range.start) && (this.data.start.getTime() < range.end); } else { // default or 'center' isVisible = (this.data.start.getTime() + widthInMs / 2 > range.start ) && (this.data.start.getTime() - widthInMs/2 < range.end); } return isVisible; } /** * create DOM element * @private */ _createDomElement() { if (!this.dom) { // create DOM this.dom = {}; // create main box this.dom.box = document.createElement('DIV'); // contents box (inside the background box). used for making margins this.dom.content = document.createElement('DIV'); this.dom.content.className = 'vis-item-content'; this.dom.box.appendChild(this.dom.content); // line to axis this.dom.line = document.createElement('DIV'); this.dom.line.className = 'vis-line'; // dot on axis this.dom.dot = document.createElement('DIV'); this.dom.dot.className = 'vis-dot'; // attach this item as attribute this.dom.box['vis-item'] = this; this.dirty = true; } } /** * append DOM element * @private */ _appendDomElement() { if (!this.parent) { throw new Error('Cannot redraw item: no parent attached'); } if (!this.dom.box.parentNode) { const foreground = this.parent.dom.foreground; if (!foreground) throw new Error('Cannot redraw item: parent has no foreground container element'); foreground.appendChild(this.dom.box); } if (!this.dom.line.parentNode) { var background = this.parent.dom.background; if (!background) throw new Error('Cannot redraw item: parent has no background container element'); background.appendChild(this.dom.line); } if (!this.dom.dot.parentNode) { const axis = this.parent.dom.axis; if (!background) throw new Error('Cannot redraw item: parent has no axis container element'); axis.appendChild(this.dom.dot); } this.displayed = true; } /** * update dirty DOM element * @private */ _updateDirtyDomComponents() { // An item is marked dirty when: // - the item is not yet rendered // - the item's data is changed // - the item is selected/deselected if (this.dirty) { this._updateContents(this.dom.content); this._updateDataAttributes(this.dom.box); this._updateStyle(this.dom.box); const editable = (this.editable.updateTime || this.editable.updateGroup); // update class const className = (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + (editable ? ' vis-editable' : ' vis-readonly'); this.dom.box.className = `vis-item vis-box${className}`; this.dom.line.className = `vis-item vis-line${className}`; this.dom.dot.className = `vis-item vis-dot${className}`; } } /** * get DOM components sizes * @return {object} * @private */ _getDomComponentsSizes() { return { previous: { right: this.dom.box.style.right, left: this.dom.box.style.left }, dot: { height: this.dom.dot.offsetHeight, width: this.dom.dot.offsetWidth }, line: { width: this.dom.line.offsetWidth }, box: { width: this.dom.box.offsetWidth, height: this.dom.box.offsetHeight } } } /** * update DOM components sizes * @param {object} sizes * @private */ _updateDomComponentsSizes(sizes) { if (this.options.rtl) { this.dom.box.style.right = "0px"; } else { this.dom.box.style.left = "0px"; } // recalculate size this.props.dot.height = sizes.dot.height; this.props.dot.width = sizes.dot.width; this.props.line.width = sizes.line.width; this.width = sizes.box.width; this.height = sizes.box.height; // restore previous position if (this.options.rtl) { this.dom.box.style.right = sizes.previous.right; } else { this.dom.box.style.left = sizes.previous.left; } this.dirty = false; } /** * repaint DOM additionals * @private */ _repaintDomAdditionals() { this._repaintOnItemUpdateTimeTooltip(this.dom.box); this._repaintDragCenter(); this._repaintDeleteButton(this.dom.box); } /** * Repaint the item * @param {boolean} [returnQueue=false] return the queue * @return {boolean} the redraw queue if returnQueue=true */ redraw(returnQueue) { let sizes; const queue = [ // create item DOM this._createDomElement.bind(this), // append DOM to parent DOM this._appendDomElement.bind(this), // update dirty DOM this._updateDirtyDomComponents.bind(this), () => { if (this.dirty) { sizes = this._getDomComponentsSizes(); } }, () => { if (this.dirty) { this._updateDomComponentsSizes.bind(this)(sizes); } }, // repaint DOM additionals this._repaintDomAdditionals.bind(this) ]; if (returnQueue) { return queue; } else { let result; queue.forEach(fn => { result = fn(); }); return result; } } /** * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. * @param {boolean} [returnQueue=false] whether to return a queue of functions to execute instead of just executing them * @return {boolean} the redraw queue if returnQueue=true */ show(returnQueue) { if (!this.displayed) { return this.redraw(returnQueue); } } /** * Hide the item from the DOM (when visible) */ hide() { if (this.displayed) { const dom = this.dom; if (dom.box.remove) dom.box.remove(); else if (dom.box.parentNode) dom.box.parentNode.removeChild(dom.box); // IE11 if (dom.line.remove) dom.line.remove(); else if (dom.line.parentNode) dom.line.parentNode.removeChild(dom.line); // IE11 if (dom.dot.remove) dom.dot.remove(); else if (dom.dot.parentNode) dom.dot.parentNode.removeChild(dom.dot); // IE11 this.displayed = false; } } /** * Reposition the item XY */ repositionXY() { const rtl = this.options.rtl; const repositionXY = (element, x, y, rtl = false) => { if (x === undefined && y === undefined) return; // If rtl invert the number. const directionX = rtl ? (x * -1) : x; //no y. translate x if (y === undefined) { element.style.transform = `translateX(${directionX}px)`; return; } //no x. translate y if (x === undefined) { element.style.transform = `translateY(${y}px)`; return; } element.style.transform = `translate(${directionX}px, ${y}px)`; }; repositionXY(this.dom.box, this.boxX, this.boxY, rtl); repositionXY(this.dom.dot, this.dotX, this.dotY, rtl); repositionXY(this.dom.line, this.lineX, this.lineY, rtl); } /** * Reposition the item horizontally * @Override */ repositionX() { const start = this.conversion.toScreen(this.data.start); const align = this.data.align === undefined ? this.options.align : this.data.align; const lineWidth = this.props.line.width; const dotWidth = this.props.dot.width; if (align == 'right') { // calculate right position of the box this.boxX = start - this.width; this.lineX = start - lineWidth; this.dotX = start - lineWidth / 2 - dotWidth / 2; } else if (align == 'left') { // calculate left position of the box this.boxX = start; this.lineX = start; this.dotX = start + lineWidth / 2 - dotWidth / 2; } else { // default or 'center' this.boxX = start - this.width / 2; this.lineX = this.options.rtl ? start - lineWidth : start - lineWidth / 2; this.dotX = start - dotWidth / 2; } if (this.options.rtl) this.right = this.boxX; else this.left = this.boxX; this.repositionXY(); } /** * Reposition the item vertically * @Override */ repositionY() { const orientation = this.options.orientation.item; const lineStyle = this.dom.line.style; if (orientation == 'top') { const lineHeight = this.parent.top + this.top + 1; this.boxY = this.top || 0; lineStyle.height = `${lineHeight}px`; lineStyle.bottom = ''; lineStyle.top = '0'; } else { // orientation 'bottom' const itemSetHeight = this.parent.itemSet.props.height; // TODO: this is nasty const lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; this.boxY = this.parent.height - this.top - (this.height || 0); lineStyle.height = `${lineHeight}px`; lineStyle.top = ''; lineStyle.bottom = '0'; } this.dotY = -this.props.dot.height / 2; this.repositionXY(); } /** * Return the width of the item left from its start date * @return {number} */ getWidthLeft() { return this.width / 2; } /** * Return the width of the item right from its start date * @return {number} */ getWidthRight() { return this.width / 2; } } /** * @constructor PointItem * @extends Item */ class PointItem extends Item { /** * @param {Object} data Object containing parameters start * content, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} [options] Configuration options * // TODO: describe available options */ constructor(data, conversion, options) { super(data, conversion, options); this.props = { dot: { top: 0, width: 0, height: 0 }, content: { height: 0, marginLeft: 0, marginRight: 0 } }; // validate data if (data) { if (data.start == undefined) { throw new Error(`Property "start" missing in item ${data}`); } } } /** * Check whether this item is visible inside given range * @param {{start: number, end: number}} range with a timestamp for start and end * @returns {boolean} True if visible */ isVisible(range) { if (this.cluster) { return false; } // determine visibility const widthInMs = this.width * range.getMillisecondsPerPixel(); return (this.data.start.getTime() + widthInMs > range.start ) && (this.data.start < range.end); } /** * create DOM element * @private */ _createDomElement() { if (!this.dom) { // create DOM this.dom = {}; // background box this.dom.point = document.createElement('div'); // className is updated in redraw() // contents box, right from the dot this.dom.content = document.createElement('div'); this.dom.content.className = 'vis-item-content'; this.dom.point.appendChild(this.dom.content); // dot at start this.dom.dot = document.createElement('div'); this.dom.point.appendChild(this.dom.dot); // attach this item as attribute this.dom.point['vis-item'] = this; this.dirty = true; } } /** * append DOM element * @private */ _appendDomElement() { if (!this.parent) { throw new Error('Cannot redraw item: no parent attached'); } if (!this.dom.point.parentNode) { const foreground = this.parent.dom.foreground; if (!foreground) { throw new Error('Cannot redraw item: parent has no foreground container element'); } foreground.appendChild(this.dom.point); } this.displayed = true; } /** * update dirty DOM components * @private */ _updateDirtyDomComponents() { // An item is marked dirty when: // - the item is not yet rendered // - the item's data is changed // - the item is selected/deselected if (this.dirty) { this._updateContents(this.dom.content); this._updateDataAttributes(this.dom.point); this._updateStyle(this.dom.point); const editable = (this.editable.updateTime || this.editable.updateGroup); // update class const className = (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + (editable ? ' vis-editable' : ' vis-readonly'); this.dom.point.className = `vis-item vis-point${className}`; this.dom.dot.className = `vis-item vis-dot${className}`; } } /** * get DOM component sizes * @return {object} * @private */ _getDomComponentsSizes() { return { dot: { width: this.dom.dot.offsetWidth, height: this.dom.dot.offsetHeight }, content: { width: this.dom.content.offsetWidth, height: this.dom.content.offsetHeight }, point: { width: this.dom.point.offsetWidth, height: this.dom.point.offsetHeight } } } /** * update DOM components sizes * @param {array} sizes * @private */ _updateDomComponentsSizes(sizes) { // recalculate size of dot and contents this.props.dot.width = sizes.dot.width; this.props.dot.height = sizes.dot.height; this.props.content.height = sizes.content.height; // resize contents if (this.options.rtl) { this.dom.content.style.marginRight = `${2 * this.props.dot.width}px`; } else { this.dom.content.style.marginLeft = `${2 * this.props.dot.width}px`; } //this.dom.content.style.marginRight = ... + 'px'; // TODO: margin right // recalculate size this.width = sizes.point.width; this.height = sizes.point.height; // reposition the dot this.dom.dot.style.top = `${(this.height - this.props.dot.height) / 2}px`; const dotWidth = this.props.dot.width; const translateX = this.options.rtl ? (dotWidth / 2) * -1 : dotWidth / 2; this.dom.dot.style.transform = `translateX(${translateX}px`; this.dirty = false; } /** * Repain DOM additionals * @private */ _repaintDomAdditionals() { this._repaintOnItemUpdateTimeTooltip(this.dom.point); this._repaintDragCenter(); this._repaintDeleteButton(this.dom.point); } /** * Repaint the item * @param {boolean} [returnQueue=false] return the queue * @return {boolean} the redraw queue if returnQueue=true */ redraw(returnQueue) { let sizes; const queue = [ // create item DOM this._createDomElement.bind(this), // append DOM to parent DOM this._appendDomElement.bind(this), // update dirty DOM this._updateDirtyDomComponents.bind(this), () => { if (this.dirty) { sizes = this._getDomComponentsSizes(); } }, () => { if (this.dirty) { this._updateDomComponentsSizes.bind(this)(sizes); } }, // repaint DOM additionals this._repaintDomAdditionals.bind(this) ]; if (returnQueue) { return queue; } else { let result; queue.forEach(fn => { result = fn(); }); return result; } } /** * Reposition XY */ repositionXY() { const rtl = this.options.rtl; const repositionXY = (element, x, y, rtl = false) => { if (x === undefined && y === undefined) return; // If rtl invert the number. const directionX = rtl ? (x * -1) : x; //no y. translate x if (y === undefined) { element.style.transform = `translateX(${directionX}px)`; return; } //no x. translate y if (x === undefined) { element.style.transform = `translateY(${y}px)`; return; } element.style.transform = `translate(${directionX}px, ${y}px)`; }; repositionXY(this.dom.point, this.pointX, this.pointY, rtl); } /** * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. * @param {boolean} [returnQueue=false] whether to return a queue of functions to execute instead of just executing them * @return {boolean} the redraw queue if returnQueue=true */ show(returnQueue) { if (!this.displayed) { return this.redraw(returnQueue); } } /** * Hide the item from the DOM (when visible) */ hide() { if (this.displayed) { if (this.dom.point.parentNode) { this.dom.point.parentNode.removeChild(this.dom.point); } this.displayed = false; } } /** * Reposition the item horizontally * @Override */ repositionX() { const start = this.conversion.toScreen(this.data.start); this.pointX = start; if (this.options.rtl) { this.right = start - this.props.dot.width; } else { this.left = start - this.props.dot.width; } this.repositionXY(); } /** * Reposition the item vertically * @Override */ repositionY() { const orientation = this.options.orientation.item; if (orientation == 'top') { this.pointY = this.top; } else { this.pointY = this.parent.height - this.top - this.height; } this.repositionXY(); } /** * Return the width of the item left from its start date * @return {number} */ getWidthLeft() { return this.props.dot.width; } /** * Return the width of the item right from its start date * @return {number} */ getWidthRight() { return this.props.dot.width; } } /** * @constructor RangeItem * @extends Item */ class RangeItem extends Item { /** * @param {Object} data Object containing parameters start, end * content, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} [options] Configuration options * // TODO: describe options */ constructor(data, conversion, options) { super(data, conversion, options); this.props = { content: { width: 0 } }; this.overflow = false; // if contents can overflow (css styling), this flag is set to true // validate data if (data) { if (data.start == undefined) { throw new Error(`Property "start" missing in item ${data.id}`); } if (data.end == undefined) { throw new Error(`Property "end" missing in item ${data.id}`); } } } /** * Check whether this item is visible inside given range * * @param {timeline.Range} range with a timestamp for start and end * @returns {boolean} True if visible */ isVisible(range) { if (this.cluster) { return false; } // determine visibility return (this.data.start < range.end) && (this.data.end > range.start); } /** * create DOM elements * @private */ _createDomElement() { if (!this.dom) { // create DOM this.dom = {}; // background box this.dom.box = document.createElement('div'); // className is updated in redraw() // frame box (to prevent the item contents from overflowing) this.dom.frame = document.createElement('div'); this.dom.frame.className = 'vis-item-overflow'; this.dom.box.appendChild(this.dom.frame); // visible frame box (showing the frame that is always visible) this.dom.visibleFrame = document.createElement('div'); this.dom.visibleFrame.className = 'vis-item-visible-frame'; this.dom.box.appendChild(this.dom.visibleFrame); // contents box this.dom.content = document.createElement('div'); this.dom.content.className = 'vis-item-content'; this.dom.frame.appendChild(this.dom.content); // attach this item as attribute this.dom.box['vis-item'] = this; this.dirty = true; } } /** * append element to DOM * @private */ _appendDomElement() { if (!this.parent) { throw new Error('Cannot redraw item: no parent attached'); } if (!this.dom.box.parentNode) { const foreground = this.parent.dom.foreground; if (!foreground) { throw new Error('Cannot redraw item: parent has no foreground container element'); } foreground.appendChild(this.dom.box); } this.displayed = true; } /** * update dirty DOM components * @private */ _updateDirtyDomComponents() { // update dirty DOM. An item is marked dirty when: // - the item is not yet rendered // - the item's data is changed // - the item is selected/deselected if (this.dirty) { this._updateContents(this.dom.content); this._updateDataAttributes(this.dom.box); this._updateStyle(this.dom.box); const editable = (this.editable.updateTime || this.editable.updateGroup); // update class const className = (this.data.className ? (' ' + this.data.className) : '') + (this.selected ? ' vis-selected' : '') + (editable ? ' vis-editable' : ' vis-readonly'); this.dom.box.className = this.baseClassName + className; // turn off max-width to be able to calculate the real width // this causes an extra browser repaint/reflow, but so be it this.dom.content.style.maxWidth = 'none'; } } /** * get DOM component sizes * @return {object} * @private */ _getDomComponentsSizes() { // determine from css whether this box has overflow this.overflow = window.getComputedStyle(this.dom.frame).overflow !== 'hidden'; this.whiteSpace = window.getComputedStyle(this.dom.content).whiteSpace !== 'nowrap'; return { content: { width: this.dom.content.offsetWidth, }, box: { height: this.dom.box.offsetHeight } } } /** * update DOM component sizes * @param {array} sizes * @private */ _updateDomComponentsSizes(sizes) { this.props.content.width = sizes.content.width; this.height = sizes.box.height; this.dom.content.style.maxWidth = ''; this.dirty = false; } /** * repaint DOM additional components * @private */ _repaintDomAdditionals() { this._repaintOnItemUpdateTimeTooltip(this.dom.box); this._repaintDeleteButton(this.dom.box); this._repaintDragCenter(); this._repaintDragLeft(); this._repaintDragRight(); } /** * Repaint the item * @param {boolean} [returnQueue=false] return the queue * @return {boolean} the redraw queue if returnQueue=true */ redraw(returnQueue) { let sizes; const queue = [ // create item DOM this._createDomElement.bind(this), // append DOM to parent DOM this._appendDomElement.bind(this), // update dirty DOM this._updateDirtyDomComponents.bind(this), () => { if (this.dirty) { sizes = this._getDomComponentsSizes.bind(this)(); } }, () => { if (this.dirty) { this._updateDomComponentsSizes.bind(this)(sizes); } }, // repaint DOM additionals this._repaintDomAdditionals.bind(this) ]; if (returnQueue) { return queue; } else { let result; queue.forEach(fn => { result = fn(); }); return result; } } /** * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. * @param {boolean} [returnQueue=false] whether to return a queue of functions to execute instead of just executing them * @return {boolean} the redraw queue if returnQueue=true */ show(returnQueue) { if (!this.displayed) { return this.redraw(returnQueue); } } /** * Hide the item from the DOM (when visible) */ hide() { if (this.displayed) { const box = this.dom.box; if (box.parentNode) { box.parentNode.removeChild(box); } this.displayed = false; } } /** * Reposition the item horizontally * @param {boolean} [limitSize=true] If true (default), the width of the range * item will be limited, as the browser cannot * display very wide divs. This means though * that the applied left and width may * not correspond to the ranges start and end * @Override */ repositionX(limitSize) { const parentWidth = this.parent.width; let start = this.conversion.toScreen(this.data.start); let end = this.conversion.toScreen(this.data.end); const align = this.data.align === undefined ? this.options.align : this.data.align; let contentStartPosition; let contentWidth; // limit the width of the range, as browsers cannot draw very wide divs // unless limitSize: false is explicitly set in item data if (this.data.limitSize !== false && (limitSize === undefined || limitSize === true)) { if (start < -parentWidth) { start = -parentWidth; } if (end > 2 * parentWidth) { end = 2 * parentWidth; } } //round to 3 decimals to compensate floating-point values rounding const boxWidth = Math.max(Math.round((end - start) * 1000) / 1000, 1); if (this.overflow) { if (this.options.rtl) { this.right = start; } else { this.left = start; } this.width = boxWidth + this.props.content.width; contentWidth = this.props.content.width; // Note: The calculation of width is an optimistic calculation, giving // a width which will not change when moving the Timeline // So no re-stacking needed, which is nicer for the eye; } else { if (this.options.rtl) { this.right = start; } else { this.left = start; } this.width = boxWidth; contentWidth = Math.min(end - start, this.props.content.width); } if (this.options.rtl) { this.dom.box.style.transform = `translateX(${this.right * -1}px)`; } else { this.dom.box.style.transform = `translateX(${this.left}px)`; } this.dom.box.style.width = `${boxWidth}px`; if (this.whiteSpace) { this.height = this.dom.box.offsetHeight; } switch (align) { case 'left': this.dom.content.style.transform = 'translateX(0)'; break; case 'right': if (this.options.rtl) { const translateX = Math.max((boxWidth - contentWidth), 0) * -1; this.dom.content.style.transform = `translateX(${translateX}px)`; } else { this.dom.content.style.transform = `translateX(${Math.max((boxWidth - contentWidth), 0)}px)`; } break; case 'center': if (this.options.rtl) { const translateX = Math.max((boxWidth - contentWidth) / 2, 0) * -1; this.dom.content.style.transform = `translateX(${translateX}px)`; } else { this.dom.content.style.transform = `translateX(${Math.max((boxWidth - contentWidth) / 2, 0)}px)`; } break; default: // 'auto' // when range exceeds left of the window, position the contents at the left of the visible area if (this.overflow) { if (end > 0) { contentStartPosition = Math.max(-start, 0); } else { contentStartPosition = -contentWidth; // ensure it's not visible anymore } } else { if (start < 0) { contentStartPosition = -start; } else { contentStartPosition = 0; } } if (this.options.rtl) { const translateX = contentStartPosition * -1; this.dom.content.style.transform = `translateX(${translateX}px)`; } else { this.dom.content.style.transform = `translateX(${contentStartPosition}px)`; // this.dom.content.style.width = `calc(100% - ${contentStartPosition}px)`; } } } /** * Reposition the item vertically * @Override */ repositionY() { const orientation = this.options.orientation.item; const box = this.dom.box; if (orientation == 'top') { box.style.top = `${this.top}px`; } else { box.style.top = `${this.parent.height - this.top - this.height}px`; } } /** * Repaint a drag area on the left side of the range when the range is selected * @protected */ _repaintDragLeft() { if ((this.selected || this.options.itemsAlwaysDraggable.range) && this.editable.updateTime && !this.dom.dragLeft) { // create and show drag area const dragLeft = document.createElement('div'); dragLeft.className = 'vis-drag-left'; dragLeft.dragLeftItem = this; this.dom.box.appendChild(dragLeft); this.dom.dragLeft = dragLeft; } else if (!this.selected && !this.options.itemsAlwaysDraggable.range && this.dom.dragLeft) { // delete drag area if (this.dom.dragLeft.parentNode) { this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft); } this.dom.dragLeft = null; } } /** * Repaint a drag area on the right side of the range when the range is selected * @protected */ _repaintDragRight() { if ((this.selected || this.options.itemsAlwaysDraggable.range) && this.editable.updateTime && !this.dom.dragRight) { // create and show drag area const dragRight = document.createElement('div'); dragRight.className = 'vis-drag-right'; dragRight.dragRightItem = this; this.dom.box.appendChild(dragRight); this.dom.dragRight = dragRight; } else if (!this.selected && !this.options.itemsAlwaysDraggable.range && this.dom.dragRight) { // delete drag area if (this.dom.dragRight.parentNode) { this.dom.dragRight.parentNode.removeChild(this.dom.dragRight); } this.dom.dragRight = null; } } } RangeItem.prototype.baseClassName = 'vis-item vis-range'; /** * @constructor BackgroundItem * @extends Item */ class BackgroundItem extends Item { /** * @constructor BackgroundItem * @param {Object} data Object containing parameters start, end * content, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} [options] Configuration options * // TODO: describe options * // TODO: implement support for the BackgroundItem just having a start, then being displayed as a sort of an annotation */ constructor(data, conversion, options) { super(data, conversion, options); this.props = { content: { width: 0 } }; this.overflow = false; // if contents can overflow (css styling), this flag is set to true // validate data if (data) { if (data.start == undefined) { throw new Error(`Property "start" missing in item ${data.id}`); } if (data.end == undefined) { throw new Error(`Property "end" missing in item ${data.id}`); } } } /** * Check whether this item is visible inside given range * @param {timeline.Range} range with a timestamp for start and end * @returns {boolean} True if visible */ isVisible(range) { // determine visibility return (this.data.start < range.end) && (this.data.end > range.start); } /** * create DOM element * @private */ _createDomElement() { if (!this.dom) { // create DOM this.dom = {}; // background box this.dom.box = document.createElement('div'); // className is updated in redraw() // frame box (to prevent the item contents from overflowing this.dom.frame = document.createElement('div'); this.dom.frame.className = 'vis-item-overflow'; this.dom.box.appendChild(this.dom.frame); // contents box this.dom.content = document.createElement('div'); this.dom.content.className = 'vis-item-content'; this.dom.frame.appendChild(this.dom.content); // Note: we do NOT attach this item as attribute to the DOM, // such that background items cannot be selected //this.dom.box['vis-item'] = this; this.dirty = true; } } /** * append DOM element * @private */ _appendDomElement() { if (!this.parent) { throw new Error('Cannot redraw item: no parent attached'); } if (!this.dom.box.parentNode) { const background = this.parent.dom.background; if (!background) { throw new Error('Cannot redraw item: parent has no background container element'); } background.appendChild(this.dom.box); } this.displayed = true; } /** * update DOM Dirty components * @private */ _updateDirtyDomComponents() { // update dirty DOM. An item is marked dirty when: // - the item is not yet rendered // - the item's data is changed // - the item is selected/deselected if (this.dirty) { this._updateContents(this.dom.content); this._updateDataAttributes(this.dom.content); this._updateStyle(this.dom.box); // update class const className = (this.data.className ? (' ' + this.data.className) : '') + (this.selected ? ' vis-selected' : ''); this.dom.box.className = this.baseClassName + className; } } /** * get DOM components sizes * @return {object} * @private */ _getDomComponentsSizes() { // determine from css whether this box has overflow this.overflow = window.getComputedStyle(this.dom.content).overflow !== 'hidden'; return { content: { width: this.dom.content.offsetWidth } } } /** * update DOM components sizes * @param {object} sizes * @private */ _updateDomComponentsSizes(sizes) { // recalculate size this.props.content.width = sizes.content.width; this.height = 0; // set height zero, so this item will be ignored when stacking items this.dirty = false; } /** * repaint DOM additionals * @private */ _repaintDomAdditionals() { } /** * Repaint the item * @param {boolean} [returnQueue=false] return the queue * @return {boolean} the redraw result or the redraw queue if returnQueue=true */ redraw(returnQueue) { let sizes; const queue = [ // create item DOM this._createDomElement.bind(this), // append DOM to parent DOM this._appendDomElement.bind(this), this._updateDirtyDomComponents.bind(this), () => { if (this.dirty) { sizes = this._getDomComponentsSizes.bind(this)(); } }, () => { if (this.dirty) { this._updateDomComponentsSizes.bind(this)(sizes); } }, // repaint DOM additionals this._repaintDomAdditionals.bind(this) ]; if (returnQueue) { return queue; } else { let result; queue.forEach(fn => { result = fn(); }); return result; } } /** * Reposition the item vertically * @Override */ repositionY(margin) { // eslint-disable-line no-unused-vars let height; const orientation = this.options.orientation.item; // special positioning for subgroups if (this.data.subgroup !== undefined) { // TODO: instead of calculating the top position of the subgroups here for every BackgroundItem, calculate the top of the subgroup once in Itemset const itemSubgroup = this.data.subgroup; this.dom.box.style.height = `${this.parent.subgroups[itemSubgroup].height}px`; if (orientation == 'top') { this.dom.box.style.top = `${this.parent.top + this.parent.subgroups[itemSubgroup].top}px`; } else { this.dom.box.style.top = `${this.parent.top + this.parent.height - this.parent.subgroups[itemSubgroup].top - this.parent.subgroups[itemSubgroup].height}px`; } this.dom.box.style.bottom = ''; } // and in the case of no subgroups: else { // we want backgrounds with groups to only show in groups. if (this.parent instanceof BackgroundGroup) { // if the item is not in a group: height = Math.max(this.parent.height, this.parent.itemSet.body.domProps.center.height, this.parent.itemSet.body.domProps.centerContainer.height); this.dom.box.style.bottom = orientation == 'bottom' ? '0' : ''; this.dom.box.style.top = orientation == 'top' ? '0' : ''; } else { height = this.parent.height; // same alignment for items when orientation is top or bottom this.dom.box.style.top = `${this.parent.top}px`; this.dom.box.style.bottom = ''; } } this.dom.box.style.height = `${height}px`; } } BackgroundItem.prototype.baseClassName = 'vis-item vis-background'; BackgroundItem.prototype.stack = false; /** * Show the item in the DOM (when not already visible). The items DOM will * be created when needed. */ BackgroundItem.prototype.show = RangeItem.prototype.show; /** * Hide the item from the DOM (when visible) * @return {Boolean} changed */ BackgroundItem.prototype.hide = RangeItem.prototype.hide; /** * Reposition the item horizontally * @Override */ BackgroundItem.prototype.repositionX = RangeItem.prototype.repositionX; /** * Popup is a class to create a popup window with some text */ class Popup$2 { /** * @param {Element} container The container object. * @param {string} overflowMethod How the popup should act to overflowing ('flip', 'cap' or 'none') */ constructor(container, overflowMethod) { this.container = container; this.overflowMethod = overflowMethod || 'cap'; this.x = 0; this.y = 0; this.padding = 5; this.hidden = false; // create the frame this.frame = document.createElement('div'); this.frame.className = 'vis-tooltip'; this.container.appendChild(this.frame); } /** * @param {number} x Horizontal position of the popup window * @param {number} y Vertical position of the popup window */ setPosition(x, y) { this.x = parseInt(x); this.y = parseInt(y); } /** * Set the content for the popup window. This can be HTML code or text. * @param {string | Element} content */ setText(content) { if (content instanceof Element) { this.frame.innerHTML = ''; this.frame.appendChild(content); } else { this.frame.innerHTML = util$3.xss(content); // string containing text or HTML } } /** * Show the popup window * @param {boolean} [doShow] Show or hide the window */ show(doShow) { if (doShow === undefined) { doShow = true; } if (doShow === true) { var height = this.frame.clientHeight; var width = this.frame.clientWidth; var maxHeight = this.frame.parentNode.clientHeight; var maxWidth = this.frame.parentNode.clientWidth; var left = 0, top = 0; if (this.overflowMethod == 'flip' || this.overflowMethod == 'none') { let isLeft = false, isTop = true; // Where around the position it's located if (this.overflowMethod == 'flip') { if (this.y - height < this.padding) { isTop = false; } if (this.x + width > maxWidth - this.padding) { isLeft = true; } } if (isLeft) { left = this.x - width; } else { left = this.x; } if (isTop) { top = this.y - height; } else { top = this.y; } } else { // this.overflowMethod == 'cap' top = (this.y - height); if (top + height + this.padding > maxHeight) { top = maxHeight - height - this.padding; } if (top < this.padding) { top = this.padding; } left = this.x; if (left + width + this.padding > maxWidth) { left = maxWidth - width - this.padding; } if (left < this.padding) { left = this.padding; } } this.frame.style.left = left + "px"; this.frame.style.top = top + "px"; this.frame.style.visibility = "visible"; this.hidden = false; } else { this.hide(); } } /** * Hide the popup window */ hide() { this.hidden = true; this.frame.style.left = "0"; this.frame.style.top = "0"; this.frame.style.visibility = "hidden"; } /** * Remove the popup window */ destroy() { this.frame.parentNode.removeChild(this.frame); // Remove element from DOM } } /** * ClusterItem */ class ClusterItem extends Item { /** * @constructor Item * @param {Object} data Object containing (optional) parameters type, * start, end, content, group, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} options Configuration options * // TODO: describe available options */ constructor(data, conversion, options) { const modifiedOptions = Object.assign({}, {fitOnDoubleClick: true}, options, {editable: false}); super(data, conversion, modifiedOptions); this.props = { content: { width: 0, height: 0 }, }; if (!data || data.uiItems == undefined) { throw new Error('Property "uiItems" missing in item ' + data.id); } this.id = dist.v4(); this.group = data.group; this._setupRange(); this.emitter = this.data.eventEmitter; this.range = this.data.range; this.attached = false; this.isCluster = true; this.data.isCluster = true; } /** * check if there are items * @return {boolean} */ hasItems() { return this.data.uiItems && this.data.uiItems.length && this.attached; } /** * set UI items * @param {array} items */ setUiItems(items) { this.detach(); this.data.uiItems = items; this._setupRange(); this.attach(); } /** * check is visible * @param {object} range * @return {boolean} */ isVisible(range) { const rangeWidth = this.data.end ? this.data.end - this.data.start : 0; const widthInMs = this.width * range.getMillisecondsPerPixel(); const end = Math.max(this.data.start.getTime() + rangeWidth, this.data.start.getTime() + widthInMs); return (this.data.start < range.end) && (end > range.start) && this.hasItems(); } /** * get cluster data * @return {object} */ getData() { return { isCluster: true, id: this.id, items: this.data.items || [], data: this.data } } /** * redraw cluster item * @param {boolean} returnQueue * @return {boolean} */ redraw (returnQueue) { var sizes; var queue = [ // create item DOM this._createDomElement.bind(this), // append DOM to parent DOM this._appendDomElement.bind(this), // update dirty DOM this._updateDirtyDomComponents.bind(this), (function () { if (this.dirty) { sizes = this._getDomComponentsSizes(); } }).bind(this), (function () { if (this.dirty) { this._updateDomComponentsSizes.bind(this)(sizes); } }).bind(this), // repaint DOM additionals this._repaintDomAdditionals.bind(this) ]; if (returnQueue) { return queue; } else { var result; queue.forEach(function (fn) { result = fn(); }); return result; } } /** * show cluster item */ show() { if (!this.displayed) { this.redraw(); } } /** * Hide the item from the DOM (when visible) */ hide() { if (this.displayed) { var dom = this.dom; if (dom.box.parentNode) { dom.box.parentNode.removeChild(dom.box); } if (this.options.showStipes) { if (dom.line.parentNode) { dom.line.parentNode.removeChild(dom.line); } if (dom.dot.parentNode) { dom.dot.parentNode.removeChild(dom.dot); } } this.displayed = false; } } /** * reposition item x axis */ repositionX() { let start = this.conversion.toScreen(this.data.start); let end = this.data.end ? this.conversion.toScreen(this.data.end) : 0; if (end) { this.repositionXWithRanges(start, end); } else { let align = this.data.align === undefined ? this.options.align : this.data.align; this.repositionXWithoutRanges(start, align); } if (this.options.showStipes) { this.dom.line.style.display = this._isStipeVisible() ? 'block' : 'none'; this.dom.dot.style.display = this._isStipeVisible() ? 'block' : 'none'; if (this._isStipeVisible()) { this.repositionStype(start, end); } } } /** * reposition item stype * @param {date} start * @param {date} end */ repositionStype(start, end) { this.dom.line.style.display = 'block'; this.dom.dot.style.display = 'block'; const lineOffsetWidth = this.dom.line.offsetWidth; const dotOffsetWidth = this.dom.dot.offsetWidth; if (end) { const lineOffset = lineOffsetWidth + start + (end - start) / 2; const dotOffset = lineOffset - dotOffsetWidth / 2; const lineOffsetDirection = this.options.rtl ? lineOffset * -1 : lineOffset; const dotOffsetDirection = this.options.rtl ? dotOffset * -1 : dotOffset; this.dom.line.style.transform = `translateX(${lineOffsetDirection}px)`; this.dom.dot.style.transform = `translateX(${dotOffsetDirection}px)`; } else { const lineOffsetDirection = this.options.rtl ? (start * -1) : start; const dotOffsetDirection = this.options.rtl ? ((start - dotOffsetWidth / 2) * -1) : (start - dotOffsetWidth / 2); this.dom.line.style.transform = `translateX(${lineOffsetDirection}px)`; this.dom.dot.style.transform = `translateX(${dotOffsetDirection}px)`; } } /** * reposition x without ranges * @param {date} start * @param {string} align */ repositionXWithoutRanges(start, align) { // calculate left position of the box if (align == 'right') { if (this.options.rtl) { this.right = start - this.width; // reposition box, line, and dot this.dom.box.style.right = this.right + 'px'; } else { this.left = start - this.width; // reposition box, line, and dot this.dom.box.style.left = this.left + 'px'; } } else if (align == 'left') { if (this.options.rtl) { this.right = start; // reposition box, line, and dot this.dom.box.style.right = this.right + 'px'; } else { this.left = start; // reposition box, line, and dot this.dom.box.style.left = this.left + 'px'; } } else { // default or 'center' if (this.options.rtl) { this.right = start - this.width / 2; // reposition box, line, and dot this.dom.box.style.right = this.right + 'px'; } else { this.left = start - this.width / 2; // reposition box, line, and dot this.dom.box.style.left = this.left + 'px'; } } } /** * reposition x with ranges * @param {date} start * @param {date} end */ repositionXWithRanges(start, end) { let boxWidth = Math.round(Math.max(end - start + 0.5, 1)); if (this.options.rtl) { this.right = start; } else { this.left = start; } this.width = Math.max(boxWidth, this.minWidth || 0); if (this.options.rtl) { this.dom.box.style.right = this.right + 'px'; } else { this.dom.box.style.left = this.left + 'px'; } this.dom.box.style.width = boxWidth + 'px'; } /** * reposition item y axis */ repositionY() { var orientation = this.options.orientation.item; var box = this.dom.box; if (orientation == 'top') { box.style.top = (this.top || 0) + 'px'; } else { // orientation 'bottom' box.style.top = (this.parent.height - this.top - this.height || 0) + 'px'; } if (this.options.showStipes) { if (orientation == 'top') { this.dom.line.style.top = '0'; this.dom.line.style.height = (this.parent.top + this.top + 1) + 'px'; this.dom.line.style.bottom = ''; } else { // orientation 'bottom' var itemSetHeight = this.parent.itemSet.props.height; var lineHeight = itemSetHeight - this.parent.top - this.parent.height + this.top; this.dom.line.style.top = (itemSetHeight - lineHeight) + 'px'; this.dom.line.style.bottom = '0'; } this.dom.dot.style.top = (-this.dom.dot.offsetHeight / 2) + 'px'; } } /** * get width left * @return {number} */ getWidthLeft() { return this.width / 2; } /** * get width right * @return {number} */ getWidthRight() { return this.width / 2; } /** * move cluster item */ move() { this.repositionX(); this.repositionY(); } /** * attach */ attach() { for (let item of this.data.uiItems) { item.cluster = this; } this.data.items = this.data.uiItems.map(item => item.data); this.attached = true; this.dirty = true; } /** * detach * @param {boolean} detachFromParent * @return {void} */ detach(detachFromParent = false) { if (!this.hasItems()) { return; } for (let item of this.data.uiItems) { delete item.cluster; } this.attached = false; if (detachFromParent && this.group) { this.group.remove(this); this.group = null; } this.data.items = []; this.dirty = true; } /** * handle on double click */ _onDoubleClick() { this._fit(); } /** * set range */ _setupRange() { const stats = this.data.uiItems.map(item => ({ start: item.data.start.valueOf(), end: item.data.end ? item.data.end.valueOf() : item.data.start.valueOf(), })); this.data.min = Math.min(...stats.map(s => Math.min(s.start, s.end || s.start))); this.data.max = Math.max(...stats.map(s => Math.max(s.start, s.end || s.start))); const centers = this.data.uiItems.map(item => item.center); const avg = centers.reduce((sum, value) => sum + value, 0) / this.data.uiItems.length; if (this.data.uiItems.some(item => item.data.end)) { // contains ranges this.data.start = new Date(this.data.min); this.data.end = new Date(this.data.max); } else { this.data.start = new Date(avg); this.data.end = null; } } /** * get UI items * @return {array} */ _getUiItems() { if (this.data.uiItems && this.data.uiItems.length) { return this.data.uiItems.filter(item => item.cluster === this); } return []; } /** * create DOM element */ _createDomElement() { if (!this.dom) { // create DOM this.dom = {}; // create main box this.dom.box = document.createElement('DIV'); // contents box (inside the background box). used for making margins this.dom.content = document.createElement('DIV'); this.dom.content.className = 'vis-item-content'; this.dom.box.appendChild(this.dom.content); if (this.options.showStipes) { // line to axis this.dom.line = document.createElement('DIV'); this.dom.line.className = 'vis-cluster-line'; this.dom.line.style.display = 'none'; // dot on axis this.dom.dot = document.createElement('DIV'); this.dom.dot.className = 'vis-cluster-dot'; this.dom.dot.style.display = 'none'; } if (this.options.fitOnDoubleClick) { this.dom.box.ondblclick = ClusterItem.prototype._onDoubleClick.bind(this); } // attach this item as attribute this.dom.box['vis-item'] = this; this.dirty = true; } } /** * append element to DOM */ _appendDomElement() { if (!this.parent) { throw new Error('Cannot redraw item: no parent attached'); } if (!this.dom.box.parentNode) { const foreground = this.parent.dom.foreground; if (!foreground) { throw new Error('Cannot redraw item: parent has no foreground container element'); } foreground.appendChild(this.dom.box); } const background = this.parent.dom.background; if (this.options.showStipes) { if (!this.dom.line.parentNode) { if (!background) throw new Error('Cannot redraw item: parent has no background container element'); background.appendChild(this.dom.line); } if (!this.dom.dot.parentNode) { var axis = this.parent.dom.axis; if (!background) throw new Error('Cannot redraw item: parent has no axis container element'); axis.appendChild(this.dom.dot); } } this.displayed = true; } /** * update dirty DOM components */ _updateDirtyDomComponents() { // An item is marked dirty when: // - the item is not yet rendered // - the item's data is changed // - the item is selected/deselected if (this.dirty) { this._updateContents(this.dom.content); this._updateDataAttributes(this.dom.box); this._updateStyle(this.dom.box); // update class const className = this.baseClassName + ' ' + (this.data.className ? ' ' + this.data.className : '') + (this.selected ? ' vis-selected' : '') + ' vis-readonly'; this.dom.box.className = 'vis-item ' + className; if (this.options.showStipes) { this.dom.line.className = 'vis-item vis-cluster-line ' + (this.selected ? ' vis-selected' : ''); this.dom.dot.className = 'vis-item vis-cluster-dot ' + (this.selected ? ' vis-selected' : ''); } if (this.data.end) { // turn off max-width to be able to calculate the real width // this causes an extra browser repaint/reflow, but so be it this.dom.content.style.maxWidth = 'none'; } } } /** * get DOM components sizes * @return {object} */ _getDomComponentsSizes() { const sizes = { previous: { right: this.dom.box.style.right, left: this.dom.box.style.left }, box: { width: this.dom.box.offsetWidth, height: this.dom.box.offsetHeight }, }; if (this.options.showStipes) { sizes.dot = { height: this.dom.dot.offsetHeight, width: this.dom.dot.offsetWidth }; sizes.line = { width: this.dom.line.offsetWidth }; } return sizes; } /** * update DOM components sizes * @param {object} sizes */ _updateDomComponentsSizes(sizes) { if (this.options.rtl) { this.dom.box.style.right = "0px"; } else { this.dom.box.style.left = "0px"; } // recalculate size if (!this.data.end) { this.width = sizes.box.width; } else { this.minWidth = sizes.box.width; } this.height = sizes.box.height; // restore previous position if (this.options.rtl) { this.dom.box.style.right = sizes.previous.right; } else { this.dom.box.style.left = sizes.previous.left; } this.dirty = false; } /** * repaint DOM additional components */ _repaintDomAdditionals() { this._repaintOnItemUpdateTimeTooltip(this.dom.box); } /** * check is stripe visible * @return {number} * @private */ _isStipeVisible() { return this.minWidth >= this.width || !this.data.end; } /** * get fit range * @return {object} * @private */ _getFitRange() { const offset = 0.05*(this.data.max - this.data.min) / 2; return { fitStart: this.data.min - offset, fitEnd: this.data.max + offset }; } /** * fit * @private */ _fit() { if (this.emitter) { const {fitStart, fitEnd} = this._getFitRange(); const fitArgs = { start: new Date(fitStart), end: new Date(fitEnd), animation: true }; this.emitter.emit('fit', fitArgs); } } /** * get item data * @return {object} * @private */ _getItemData() { return this.data; } } ClusterItem.prototype.baseClassName = 'vis-item vis-range vis-cluster'; const UNGROUPED$1 = '__ungrouped__'; // reserved group id for ungrouped items const BACKGROUND$1 = '__background__'; // reserved group id for background items without group const ReservedGroupIds$1 = { UNGROUPED: UNGROUPED$1, BACKGROUND: BACKGROUND$1 }; /** * An Cluster generator generates cluster items */ class ClusterGenerator { /** * @param {ItemSet} itemSet itemsSet instance * @constructor ClusterGenerator */ constructor(itemSet) { this.itemSet = itemSet; this.groups = {}; this.cache = {}; this.cache[-1] = []; } /** * @param {Object} itemData Object containing parameters start content, className. * @param {{toScreen: function, toTime: function}} conversion * Conversion functions from time to screen and vice versa * @param {Object} [options] Configuration options * @return {Object} newItem */ createClusterItem(itemData, conversion, options) { const newItem = new ClusterItem(itemData, conversion, options); return newItem; } /** * Set the items to be clustered. * This will clear cached clusters. * @param {Item[]} items * @param {Object} [options] Available options: * {boolean} applyOnChangedLevel * If true (default), the changed data is applied * as soon the cluster level changes. If false, * The changed data is applied immediately */ setItems(items, options) { this.items = items || []; this.dataChanged = true; this.applyOnChangedLevel = false; if (options && options.applyOnChangedLevel) { this.applyOnChangedLevel = options.applyOnChangedLevel; } } /** * Update the current data set: clear cache, and recalculate the clustering for * the current level */ updateData() { this.dataChanged = true; this.applyOnChangedLevel = false; } /** * Cluster the items which are too close together * @param {array} oldClusters * @param {number} scale The scale of the current window : (windowWidth / (endDate - startDate)) * @param {{maxItems: number, clusterCriteria: function, titleTemplate: string}} options * @return {array} clusters */ getClusters(oldClusters, scale, options) { let { maxItems, clusterCriteria } = typeof options === "boolean" ? {} : options; if (!clusterCriteria) { clusterCriteria = () => true; } maxItems = maxItems || 1; let level = -1; let granularity = 2; let timeWindow = 0; if (scale > 0) { if (scale >= 1) { return []; } level = Math.abs(Math.round(Math.log(100 / scale) / Math.log(granularity))); timeWindow = Math.abs(Math.pow(granularity, level)); } // clear the cache when and re-generate groups the data when needed. if (this.dataChanged) { const levelChanged = (level != this.cacheLevel); const applyDataNow = this.applyOnChangedLevel ? levelChanged : true; if (applyDataNow) { this._dropLevelsCache(); this._filterData(); } } this.cacheLevel = level; let clusters = this.cache[level]; if (!clusters) { clusters = []; for (let groupName in this.groups) { if (this.groups.hasOwnProperty(groupName)) { const items = this.groups[groupName]; const iMax = items.length; let i = 0; while (i < iMax) { // find all items around current item, within the timeWindow let item = items[i]; let neighbors = 1; // start at 1, to include itself) // loop through items left from the current item let j = i - 1; while (j >= 0 && (item.center - items[j].center) < timeWindow / 2) { if (!items[j].cluster && clusterCriteria(item.data, items[j].data)) { neighbors++; } j--; } // loop through items right from the current item let k = i + 1; while (k < items.length && (items[k].center - item.center) < timeWindow / 2) { if (clusterCriteria(item.data, items[k].data)) { neighbors++; } k++; } // loop through the created clusters let l = clusters.length - 1; while (l >= 0 && (item.center - clusters[l].center) < timeWindow) { if (item.group == clusters[l].group && clusterCriteria(item.data, clusters[l].data)) { neighbors++; } l--; } // aggregate until the number of items is within maxItems if (neighbors > maxItems) { // too busy in this window. const num = neighbors - maxItems + 1; const clusterItems = []; // append the items to the cluster, // and calculate the average start for the cluster let m = i; while (clusterItems.length < num && m < items.length) { if (clusterCriteria(items[i].data, items[m].data)) { clusterItems.push(items[m]); } m++; } const groupId = this.itemSet.getGroupId(item.data); const group = this.itemSet.groups[groupId] || this.itemSet.groups[ReservedGroupIds$1.UNGROUPED]; let cluster = this._getClusterForItems(clusterItems, group, oldClusters, options); clusters.push(cluster); i += num; } else { delete item.cluster; i += 1; } } } } this.cache[level] = clusters; } return clusters; } /** * Filter the items per group. * @private */ _filterData() { // filter per group const groups = {}; this.groups = groups; // split the items per group for (const item of Object.values(this.items)) { // put the item in the correct group const groupName = item.parent ? item.parent.groupId : ''; let group = groups[groupName]; if (!group) { group = []; groups[groupName] = group; } group.push(item); // calculate the center of the item if (item.data.start) { if (item.data.end) { // range item.center = (item.data.start.valueOf() + item.data.end.valueOf()) / 2; } else { // box, dot item.center = item.data.start.valueOf(); } } } // sort the items per group for (let currentGroupName in groups) { if (groups.hasOwnProperty(currentGroupName)) { groups[currentGroupName].sort((a, b) => a.center - b.center); } } this.dataChanged = false; } /** * Create new cluster or return existing * @private * @param {array} clusterItems * @param {object} group * @param {array} oldClusters * @param {object} options * @returns {object} cluster */ _getClusterForItems(clusterItems, group, oldClusters, options) { const oldClustersLookup = (oldClusters || []).map(cluster => ({ cluster, itemsIds: new Set(cluster.data.uiItems.map(item => item.id)) })); let cluster; if (oldClustersLookup.length) { for (let oldClusterData of oldClustersLookup) { if (oldClusterData.itemsIds.size === clusterItems.length && clusterItems.every(clusterItem => oldClusterData.itemsIds.has(clusterItem.id))) { cluster = oldClusterData.cluster; break; } } } if (cluster) { cluster.setUiItems(clusterItems); if (cluster.group !== group) { if (cluster.group) { cluster.group.remove(cluster); } if (group) { group.add(cluster); cluster.group = group; } } return cluster; } let titleTemplate = options.titleTemplate || ''; const conversion = { toScreen: this.itemSet.body.util.toScreen, toTime: this.itemSet.body.util.toTime }; const title = titleTemplate.replace(/{count}/, clusterItems.length); const clusterContent = '<div title="' + title + '">' + clusterItems.length + '</div>'; const clusterOptions = Object.assign({}, options, this.itemSet.options); const data = { 'content': clusterContent, 'title': title, 'group': group, 'uiItems': clusterItems, 'eventEmitter': this.itemSet.body.emitter, 'range': this.itemSet.body.range }; cluster = this.createClusterItem(data, conversion, clusterOptions); if (group) { group.add(cluster); cluster.group = group; } cluster.attach(); return cluster; } /** * Drop cache * @private */ _dropLevelsCache() { this.cache = {}; this.cacheLevel = -1; this.cache[this.cacheLevel] = []; } } const UNGROUPED$2 = '__ungrouped__'; // reserved group id for ungrouped items const BACKGROUND$2 = '__background__'; // reserved group id for background items without group /** * An ItemSet holds a set of items and ranges which can be displayed in a * range. The width is determined by the parent of the ItemSet, and the height * is determined by the size of the items. */ class ItemSet extends Component { /** * @param {{dom: Object, domProps: Object, emitter: Emitter, range: Range}} body * @param {Object} [options] See ItemSet.setOptions for the available options. * @constructor ItemSet * @extends Component */ constructor(body, options) { super(); this.body = body; this.defaultOptions = { type: null, // 'box', 'point', 'range', 'background' orientation: { item: 'bottom' // item orientation: 'top' or 'bottom' }, align: 'auto', // alignment of box items stack: true, stackSubgroups: true, groupOrderSwap(fromGroup, toGroup, groups) { // eslint-disable-line no-unused-vars const targetOrder = toGroup.order; toGroup.order = fromGroup.order; fromGroup.order = targetOrder; }, groupOrder: 'order', selectable: true, multiselect: false, longSelectPressTime: 251, itemsAlwaysDraggable: { item: false, range: false, }, editable: { updateTime: false, updateGroup: false, add: false, remove: false, overrideItems: false }, groupEditable: { order: false, add: false, remove: false }, snap: TimeStep.snap, // Only called when `objectData.target === 'item'. onDropObjectOnItem(objectData, item, callback) { callback(item); }, onAdd(item, callback) { callback(item); }, onUpdate(item, callback) { callback(item); }, onMove(item, callback) { callback(item); }, onRemove(item, callback) { callback(item); }, onMoving(item, callback) { callback(item); }, onAddGroup(item, callback) { callback(item); }, onMoveGroup(item, callback) { callback(item); }, onRemoveGroup(item, callback) { callback(item); }, margin: { item: { horizontal: 10, vertical: 10 }, axis: 20 }, showTooltips: true, tooltip: { followMouse: false, overflowMethod: 'flip', delay: 500 }, tooltipOnItemUpdateTime: false }; // options is shared by this ItemSet and all its items this.options = util$3.extend({}, this.defaultOptions); this.options.rtl = options.rtl; this.options.onTimeout = options.onTimeout; this.conversion = { toScreen: body.util.toScreen, toTime: body.util.toTime }; this.dom = {}; this.props = {}; this.hammer = null; const me = this; this.itemsData = null; // DataSet this.groupsData = null; // DataSet this.itemsSettingTime = null; this.initialItemSetDrawn = false; this.userContinueNotBail = null; this.sequentialSelection = false; // listeners for the DataSet of the items this.itemListeners = { 'add'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onAdd(params.items); if (me.options.cluster) { me.clusterGenerator.setItems(me.items, { applyOnChangedLevel: false }); } me.redraw(); }, 'update'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onUpdate(params.items); if (me.options.cluster) { me.clusterGenerator.setItems(me.items, { applyOnChangedLevel: false }); } me.redraw(); }, 'remove'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onRemove(params.items); if (me.options.cluster) { me.clusterGenerator.setItems(me.items, { applyOnChangedLevel: false }); } me.redraw(); } }; // listeners for the DataSet of the groups this.groupListeners = { 'add'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onAddGroups(params.items); if (me.groupsData && me.groupsData.length > 0) { const groupsData = me.groupsData.getDataSet(); groupsData.get().forEach(groupData => { if (groupData.nestedGroups) { if (groupData.showNested != false) { groupData.showNested = true; } let updatedGroups = []; groupData.nestedGroups.forEach(nestedGroupId => { const updatedNestedGroup = groupsData.get(nestedGroupId); if (!updatedNestedGroup) { return; } updatedNestedGroup.nestedInGroup = groupData.id; if (groupData.showNested == false) { updatedNestedGroup.visible = false; } updatedGroups = updatedGroups.concat(updatedNestedGroup); }); groupsData.update(updatedGroups, senderId); } }); } }, 'update'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onUpdateGroups(params.items); }, 'remove'(event, params, senderId) { // eslint-disable-line no-unused-vars me._onRemoveGroups(params.items); } }; this.items = {}; // object with an Item for every data item this.groups = {}; // Group object for every group this.groupIds = []; this.selection = []; // list with the ids of all selected nodes this.popup = null; this.popupTimer = null; this.touchParams = {}; // stores properties while dragging this.groupTouchParams = { group: null, isDragging: false }; // create the HTML DOM this._create(); this.setOptions(options); this.clusters = []; } /** * Create the HTML DOM for the ItemSet */ _create() { const frame = document.createElement('div'); frame.className = 'vis-itemset'; frame['vis-itemset'] = this; this.dom.frame = frame; // create background panel const background = document.createElement('div'); background.className = 'vis-background'; frame.appendChild(background); this.dom.background = background; // create foreground panel const foreground = document.createElement('div'); foreground.className = 'vis-foreground'; frame.appendChild(foreground); this.dom.foreground = foreground; // create axis panel const axis = document.createElement('div'); axis.className = 'vis-axis'; this.dom.axis = axis; // create labelset const labelSet = document.createElement('div'); labelSet.className = 'vis-labelset'; this.dom.labelSet = labelSet; // create ungrouped Group this._updateUngrouped(); // create background Group const backgroundGroup = new BackgroundGroup(BACKGROUND$2, null, this); backgroundGroup.show(); this.groups[BACKGROUND$2] = backgroundGroup; // attach event listeners // Note: we bind to the centerContainer for the case where the height // of the center container is larger than of the ItemSet, so we // can click in the empty area to create a new item or deselect an item. this.hammer = new Hammer$2(this.body.dom.centerContainer); // drag items when selected this.hammer.on('hammer.input', event => { if (event.isFirst) { this._onTouch(event); } }); this.hammer.on('panstart', this._onDragStart.bind(this)); this.hammer.on('panmove', this._onDrag.bind(this)); this.hammer.on('panend', this._onDragEnd.bind(this)); this.hammer.get('pan').set({threshold:5, direction: Hammer$2.ALL}); // single select (or unselect) when tapping an item this.hammer.on('tap', this._onSelectItem.bind(this)); // multi select when holding mouse/touch, or on ctrl+click this.hammer.on('press', this._onMultiSelectItem.bind(this)); // add item on doubletap this.hammer.on('doubletap', this._onAddItem.bind(this)); if (this.options.rtl) { this.groupHammer = new Hammer$2(this.body.dom.rightContainer); } else { this.groupHammer = new Hammer$2(this.body.dom.leftContainer); } this.groupHammer.on('tap', this._onGroupClick.bind(this)); this.groupHammer.on('panstart', this._onGroupDragStart.bind(this)); this.groupHammer.on('panmove', this._onGroupDrag.bind(this)); this.groupHammer.on('panend', this._onGroupDragEnd.bind(this)); this.groupHammer.get('pan').set({threshold:5, direction: Hammer$2.DIRECTION_VERTICAL}); this.body.dom.centerContainer.addEventListener('mouseover', this._onMouseOver.bind(this)); this.body.dom.centerContainer.addEventListener('mouseout', this._onMouseOut.bind(this)); this.body.dom.centerContainer.addEventListener('mousemove', this._onMouseMove.bind(this)); // right-click on timeline this.body.dom.centerContainer.addEventListener('contextmenu', this._onDragEnd.bind(this)); this.body.dom.centerContainer.addEventListener('mousewheel', this._onMouseWheel.bind(this)); // attach to the DOM this.show(); } /** * Set options for the ItemSet. Existing options will be extended/overwritten. * @param {Object} [options] The following options are available: * {string} type * Default type for the items. Choose from 'box' * (default), 'point', 'range', or 'background'. * The default style can be overwritten by * individual items. * {string} align * Alignment for the items, only applicable for * BoxItem. Choose 'center' (default), 'left', or * 'right'. * {string} orientation.item * Orientation of the item set. Choose 'top' or * 'bottom' (default). * {Function} groupOrder * A sorting function for ordering groups * {boolean} stack * If true (default), items will be stacked on * top of each other. * {number} margin.axis * Margin between the axis and the items in pixels. * Default is 20. * {number} margin.item.horizontal * Horizontal margin between items in pixels. * Default is 10. * {number} margin.item.vertical * Vertical Margin between items in pixels. * Default is 10. * {number} margin.item * Margin between items in pixels in both horizontal * and vertical direction. Default is 10. * {number} margin * Set margin for both axis and items in pixels. * {boolean} selectable * If true (default), items can be selected. * {boolean} multiselect * If true, multiple items can be selected. * False by default. * {boolean} editable * Set all editable options to true or false * {boolean} editable.updateTime * Allow dragging an item to an other moment in time * {boolean} editable.updateGroup * Allow dragging an item to an other group * {boolean} editable.add * Allow creating new items on double tap * {boolean} editable.remove * Allow removing items by clicking the delete button * top right of a selected item. * {Function(item: Item, callback: Function)} onAdd * Callback function triggered when an item is about to be added: * when the user double taps an empty space in the Timeline. * {Function(item: Item, callback: Function)} onUpdate * Callback function fired when an item is about to be updated. * This function typically has to show a dialog where the user * change the item. If not implemented, nothing happens. * {Function(item: Item, callback: Function)} onMove * Fired when an item has been moved. If not implemented, * the move action will be accepted. * {Function(item: Item, callback: Function)} onRemove * Fired when an item is about to be deleted. * If not implemented, the item will be always removed. */ setOptions(options) { if (options) { // copy all options that we know const fields = [ 'type', 'rtl', 'align', 'order', 'stack', 'stackSubgroups', 'selectable', 'multiselect', 'sequentialSelection', 'multiselectPerGroup', 'longSelectPressTime', 'groupOrder', 'dataAttributes', 'template', 'groupTemplate', 'visibleFrameTemplate', 'hide', 'snap', 'groupOrderSwap', 'showTooltips', 'tooltip', 'tooltipOnItemUpdateTime', 'groupHeightMode', 'onTimeout' ]; util$3.selectiveExtend(fields, this.options, options); if ('itemsAlwaysDraggable' in options) { if (typeof options.itemsAlwaysDraggable === 'boolean') { this.options.itemsAlwaysDraggable.item = options.itemsAlwaysDraggable; this.options.itemsAlwaysDraggable.range = false; } else if (typeof options.itemsAlwaysDraggable === 'object') { util$3.selectiveExtend(['item', 'range'], this.options.itemsAlwaysDraggable, options.itemsAlwaysDraggable); // only allow range always draggable when item is always draggable as well if (! this.options.itemsAlwaysDraggable.item) { this.options.itemsAlwaysDraggable.range = false; } } } if ('sequentialSelection' in options) { if (typeof options.sequentialSelection === 'boolean') { this.options.sequentialSelection = options.sequentialSelection; } } if ('orientation' in options) { if (typeof options.orientation === 'string') { this.options.orientation.item = options.orientation === 'top' ? 'top' : 'bottom'; } else if (typeof options.orientation === 'object' && 'item' in options.orientation) { this.options.orientation.item = options.orientation.item; } } if ('margin' in options) { if (typeof options.margin === 'number') { this.options.margin.axis = options.margin; this.options.margin.item.horizontal = options.margin; this.options.margin.item.vertical = options.margin; } else if (typeof options.margin === 'object') { util$3.selectiveExtend(['axis'], this.options.margin, options.margin); if ('item' in options.margin) { if (typeof options.margin.item === 'number') { this.options.margin.item.horizontal = options.margin.item; this.options.margin.item.vertical = options.margin.item; } else if (typeof options.margin.item === 'object') { util$3.selectiveExtend(['horizontal', 'vertical'], this.options.margin.item, options.margin.item); } } } } ['locale', 'locales'].forEach(key => { if (key in options) { this.options[key] = options[key]; } }); if ('editable' in options) { if (typeof options.editable === 'boolean') { this.options.editable.updateTime = options.editable; this.options.editable.updateGroup = options.editable; this.options.editable.add = options.editable; this.options.editable.remove = options.editable; this.options.editable.overrideItems = false; } else if (typeof options.editable === 'object') { util$3.selectiveExtend(['updateTime', 'updateGroup', 'add', 'remove', 'overrideItems'], this.options.editable, options.editable); } } if ('groupEditable' in options) { if (typeof options.groupEditable === 'boolean') { this.options.groupEditable.order = options.groupEditable; this.options.groupEditable.add = options.groupEditable; this.options.groupEditable.remove = options.groupEditable; } else if (typeof options.groupEditable === 'object') { util$3.selectiveExtend(['order', 'add', 'remove'], this.options.groupEditable, options.groupEditable); } } // callback functions const addCallback = name => { const fn = options[name]; if (fn) { if (!(typeof fn === 'function')) { throw new Error(`option ${name} must be a function ${name}(item, callback)`); } this.options[name] = fn; } }; ['onDropObjectOnItem', 'onAdd', 'onUpdate', 'onRemove', 'onMove', 'onMoving', 'onAddGroup', 'onMoveGroup', 'onRemoveGroup'].forEach(addCallback); if (options.cluster) { Object.assign(this.options, { cluster: options.cluster }); if (!this.clusterGenerator) { this.clusterGenerator = new ClusterGenerator(this); } this.clusterGenerator.setItems(this.items, { applyOnChangedLevel: false }); this.markDirty({ refreshItems: true, restackGroups: true }); this.redraw(); } else if (this.clusterGenerator) { this._detachAllClusters(); this.clusters = []; this.clusterGenerator = null; this.options.cluster = undefined; this.markDirty({ refreshItems: true, restackGroups: true }); this.redraw(); } else { // force the itemSet to refresh: options like orientation and margins may be changed this.markDirty(); } } } /** * Mark the ItemSet dirty so it will refresh everything with next redraw. * Optionally, all items can be marked as dirty and be refreshed. * @param {{refreshItems: boolean}} [options] */ markDirty(options) { this.groupIds = []; if (options) { if (options.refreshItems) { util$3.forEach(this.items, item => { item.dirty = true; if (item.displayed) item.redraw(); }); } if (options.restackGroups) { util$3.forEach(this.groups, (group, key) => { if (key === BACKGROUND$2) return; group.stackDirty = true; }); } } } /** * Destroy the ItemSet */ destroy() { this.clearPopupTimer(); this.hide(); this.setItems(null); this.setGroups(null); this.hammer && this.hammer.destroy(); this.groupHammer && this.groupHammer.destroy(); this.hammer = null; this.body = null; this.conversion = null; } /** * Hide the component from the DOM */ hide() { // remove the frame containing the items if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); } // remove the axis with dots if (this.dom.axis.parentNode) { this.dom.axis.parentNode.removeChild(this.dom.axis); } // remove the labelset containing all group labels if (this.dom.labelSet.parentNode) { this.dom.labelSet.parentNode.removeChild(this.dom.labelSet); } } /** * Show the component in the DOM (when not already visible). */ show() { // show frame containing the items if (!this.dom.frame.parentNode) { this.body.dom.center.appendChild(this.dom.frame); } // show axis with dots if (!this.dom.axis.parentNode) { this.body.dom.backgroundVertical.appendChild(this.dom.axis); } // show labelset containing labels if (!this.dom.labelSet.parentNode) { if (this.options.rtl) { this.body.dom.right.appendChild(this.dom.labelSet); } else { this.body.dom.left.appendChild(this.dom.labelSet); } } } /** * Activates the popup timer to show the given popup after a fixed time. * @param {Popup} popup */ setPopupTimer(popup) { this.clearPopupTimer(); if (popup) { const delay = this.options.tooltip.delay || typeof this.options.tooltip.delay === 'number' ? this.options.tooltip.delay : 500; this.popupTimer = setTimeout( function () { popup.show(); }, delay); } } /** * Clears the popup timer for the tooltip. */ clearPopupTimer() { if (this.popupTimer != null) { clearTimeout(this.popupTimer); this.popupTimer = null; } } /** * Set selected items by their id. Replaces the current selection * Unknown id's are silently ignored. * @param {string[] | string} [ids] An array with zero or more id's of the items to be * selected, or a single item id. If ids is undefined * or an empty array, all items will be unselected. */ setSelection(ids) { if (ids == undefined) { ids = []; } if (!Array.isArray(ids)) { ids = [ids]; } const idsToDeselect = this.selection.filter(id => ids.indexOf(id) === -1); // unselect currently selected items for (let selectedId of idsToDeselect) { const item = this.getItemById(selectedId); if (item) { item.unselect(); } } // select items this.selection = [ ...ids ]; for (let id of ids) { const item = this.getItemById(id); if (item) { item.select(); } } } /** * Get the selected items by their id * @return {Array} ids The ids of the selected items */ getSelection() { return this.selection.concat([]); } /** * Get the id's of the currently visible items. * @returns {Array} The ids of the visible items */ getVisibleItems() { const range = this.body.range.getRange(); let right; let left; if (this.options.rtl) { right = this.body.util.toScreen(range.start); left = this.body.util.toScreen(range.end); } else { left = this.body.util.toScreen(range.start); right = this.body.util.toScreen(range.end); } const ids = []; for (const groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { const group = this.groups[groupId]; const rawVisibleItems = group.isVisible ? group.visibleItems : []; // filter the "raw" set with visibleItems into a set which is really // visible by pixels for (const item of rawVisibleItems) { // TODO: also check whether visible vertically if (this.options.rtl) { if ((item.right < left) && (item.right + item.width > right)) { ids.push(item.id); } } else { if ((item.left < right) && (item.left + item.width > left)) { ids.push(item.id); } } } } } return ids; } /** * Get the id's of the currently visible groups. * @returns {Array} The ids of the visible groups */ getVisibleGroups() { const ids = []; for (const groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { const group = this.groups[groupId]; if (group.isVisible) { ids.push(groupId); } } } return ids; } /** * get item by id * @param {string} id * @return {object} item */ getItemById(id) { return this.items[id] || this.clusters.find(cluster => cluster.id === id); } /** * Deselect a selected item * @param {string | number} id * @private */ _deselect(id) { const selection = this.selection; for (let i = 0, ii = selection.length; i < ii; i++) { if (selection[i] == id) { // non-strict comparison! selection.splice(i, 1); break; } } } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { const margin = this.options.margin; const range = this.body.range; const asSize = util$3.option.asSize; const options = this.options; const orientation = options.orientation.item; let resized = false; const frame = this.dom.frame; // recalculate absolute position (before redrawing groups) this.props.top = this.body.domProps.top.height + this.body.domProps.border.top; if (this.options.rtl) { this.props.right = this.body.domProps.right.width + this.body.domProps.border.right; } else { this.props.left = this.body.domProps.left.width + this.body.domProps.border.left; } // update class name frame.className = 'vis-itemset'; if (this.options.cluster) { this._clusterItems(); } // reorder the groups (if needed) resized = this._orderGroups() || resized; // check whether zoomed (in that case we need to re-stack everything) // TODO: would be nicer to get this as a trigger from Range const visibleInterval = range.end - range.start; const zoomed = (visibleInterval != this.lastVisibleInterval) || (this.props.width != this.props.lastWidth); const scrolled = range.start != this.lastRangeStart; const changedStackOption = options.stack != this.lastStack; const changedStackSubgroupsOption = options.stackSubgroups != this.lastStackSubgroups; const forceRestack = (zoomed || scrolled || changedStackOption || changedStackSubgroupsOption); this.lastVisibleInterval = visibleInterval; this.lastRangeStart = range.start; this.lastStack = options.stack; this.lastStackSubgroups = options.stackSubgroups; this.props.lastWidth = this.props.width; const firstGroup = this._firstGroup(); const firstMargin = { item: margin.item, axis: margin.axis }; const nonFirstMargin = { item: margin.item, axis: margin.item.vertical / 2 }; let height = 0; const minHeight = margin.axis + margin.item.vertical; // redraw the background group this.groups[BACKGROUND$2].redraw(range, nonFirstMargin, forceRestack); const redrawQueue = {}; let redrawQueueLength = 0; // collect redraw functions util$3.forEach(this.groups, (group, key) => { if (key === BACKGROUND$2) return; const groupMargin = group == firstGroup ? firstMargin : nonFirstMargin; const returnQueue = true; redrawQueue[key] = group.redraw(range, groupMargin, forceRestack, returnQueue); redrawQueueLength = redrawQueue[key].length; }); const needRedraw = redrawQueueLength > 0; if (needRedraw) { const redrawResults = {}; for (let i = 0; i < redrawQueueLength; i++) { util$3.forEach(redrawQueue, (fns, key) => { redrawResults[key] = fns[i](); }); } // redraw all regular groups util$3.forEach(this.groups, (group, key) => { if (key === BACKGROUND$2) return; const groupResized = redrawResults[key]; resized = groupResized || resized; height += group.height; }); height = Math.max(height, minHeight); } height = Math.max(height, minHeight); // update frame height frame.style.height = asSize(height); // calculate actual size this.props.width = frame.offsetWidth; this.props.height = height; // reposition axis this.dom.axis.style.top = asSize((orientation == 'top') ? (this.body.domProps.top.height + this.body.domProps.border.top) : (this.body.domProps.top.height + this.body.domProps.centerContainer.height)); if (this.options.rtl) { this.dom.axis.style.right = '0'; } else { this.dom.axis.style.left = '0'; } this.hammer.get('press').set({time: this.options.longSelectPressTime}); this.initialItemSetDrawn = true; // check if this component is resized resized = this._isResized() || resized; return resized; } /** * Get the first group, aligned with the axis * @return {Group | null} firstGroup * @private */ _firstGroup() { const firstGroupIndex = (this.options.orientation.item == 'top') ? 0 : (this.groupIds.length - 1); const firstGroupId = this.groupIds[firstGroupIndex]; const firstGroup = this.groups[firstGroupId] || this.groups[UNGROUPED$2]; return firstGroup || null; } /** * Create or delete the group holding all ungrouped items. This group is used when * there are no groups specified. * @protected */ _updateUngrouped() { let ungrouped = this.groups[UNGROUPED$2]; let item; let itemId; if (this.groupsData) { // remove the group holding all ungrouped items if (ungrouped) { ungrouped.dispose(); delete this.groups[UNGROUPED$2]; for (itemId in this.items) { if (this.items.hasOwnProperty(itemId)) { item = this.items[itemId]; item.parent && item.parent.remove(item); const groupId = this.getGroupId(item.data); const group = this.groups[groupId]; group && group.add(item) || item.hide(); } } } } else { // create a group holding all (unfiltered) items if (!ungrouped) { const id = null; const data = null; ungrouped = new Group(id, data, this); this.groups[UNGROUPED$2] = ungrouped; for (itemId in this.items) { if (this.items.hasOwnProperty(itemId)) { item = this.items[itemId]; ungrouped.add(item); } } ungrouped.show(); } } } /** * Get the element for the labelset * @return {HTMLElement} labelSet */ getLabelSet() { return this.dom.labelSet; } /** * Set items * @param {vis.DataSet | null} items */ setItems(items) { this.itemsSettingTime = new Date(); const me = this; let ids; const oldItemsData = this.itemsData; // replace the dataset if (!items) { this.itemsData = null; } else if (isDataViewLike("id", items)) { this.itemsData = typeCoerceDataSet(items); } else { throw new TypeError('Data must implement the interface of DataSet or DataView'); } if (oldItemsData) { // unsubscribe from old dataset util$3.forEach(this.itemListeners, (callback, event) => { oldItemsData.off(event, callback); }); // stop maintaining a coerced version of the old data set oldItemsData.dispose(); // remove all drawn items ids = oldItemsData.getIds(); this._onRemove(ids); } if (this.itemsData) { // subscribe to new dataset const id = this.id; util$3.forEach(this.itemListeners, (callback, event) => { me.itemsData.on(event, callback, id); }); // add all new items ids = this.itemsData.getIds(); this._onAdd(ids); // update the group holding all ungrouped items this._updateUngrouped(); } this.body.emitter.emit('_change', {queue: true}); } /** * Get the current items * @returns {vis.DataSet | null} */ getItems() { return this.itemsData != null ? this.itemsData.rawDS : null; } /** * Set groups * @param {vis.DataSet} groups */ setGroups(groups) { const me = this; let ids; // unsubscribe from current dataset if (this.groupsData) { util$3.forEach(this.groupListeners, (callback, event) => { me.groupsData.off(event, callback); }); // remove all drawn groups ids = this.groupsData.getIds(); this.groupsData = null; this._onRemoveGroups(ids); // note: this will cause a redraw } // replace the dataset if (!groups) { this.groupsData = null; } else if (isDataViewLike("id", groups)) { this.groupsData = groups; } else { throw new TypeError('Data must implement the interface of DataSet or DataView'); } if (this.groupsData) { // go over all groups nesting const groupsData = this.groupsData.getDataSet(); groupsData.get().forEach(group => { if (group.nestedGroups) { group.nestedGroups.forEach(nestedGroupId => { const updatedNestedGroup = groupsData.get(nestedGroupId); updatedNestedGroup.nestedInGroup = group.id; if (group.showNested == false) { updatedNestedGroup.visible = false; } groupsData.update(updatedNestedGroup); }); } }); // subscribe to new dataset const id = this.id; util$3.forEach(this.groupListeners, (callback, event) => { me.groupsData.on(event, callback, id); }); // draw all ms ids = this.groupsData.getIds(); this._onAddGroups(ids); } // update the group holding all ungrouped items this._updateUngrouped(); // update the order of all items in each group this._order(); if (this.options.cluster) { this.clusterGenerator.updateData(); this._clusterItems(); this.markDirty({ refreshItems: true, restackGroups: true }); } this.body.emitter.emit('_change', {queue: true}); } /** * Get the current groups * @returns {vis.DataSet | null} groups */ getGroups() { return this.groupsData; } /** * Remove an item by its id * @param {string | number} id */ removeItem(id) { const item = this.itemsData.get(id); if (item) { // confirm deletion this.options.onRemove(item, item => { if (item) { // remove by id here, it is possible that an item has no id defined // itself, so better not delete by the item itself this.itemsData.remove(id); } }); } } /** * Get the time of an item based on it's data and options.type * @param {Object} itemData * @returns {string} Returns the type * @private */ _getType(itemData) { return itemData.type || this.options.type || (itemData.end ? 'range' : 'box'); } /** * Get the group id for an item * @param {Object} itemData * @returns {string} Returns the groupId * @private */ getGroupId(itemData) { const type = this._getType(itemData); if (type == 'background' && itemData.group == undefined) { return BACKGROUND$2; } else { return this.groupsData ? itemData.group : UNGROUPED$2; } } /** * Handle updated items * @param {number[]} ids * @protected */ _onUpdate(ids) { const me = this; ids.forEach(id => { const itemData = me.itemsData.get(id); let item = me.items[id]; const type = itemData ? me._getType(itemData) : null; const constructor = ItemSet.types[type]; let selected; if (item) { // update item if (!constructor || !(item instanceof constructor)) { // item type has changed, delete the item and recreate it selected = item.selected; // preserve selection of this item me._removeItem(item); item = null; } else { me._updateItem(item, itemData); } } if (!item && itemData) { // create item if (constructor) { item = new constructor(itemData, me.conversion, me.options); item.id = id; // TODO: not so nice setting id afterwards me._addItem(item); if (selected) { this.selection.push(id); item.select(); } } else { throw new TypeError(`Unknown item type "${type}"`); } } }); this._order(); if (this.options.cluster) { this.clusterGenerator.setItems(this.items, { applyOnChangedLevel: false }); this._clusterItems(); } this.body.emitter.emit('_change', {queue: true}); } /** * Handle removed items * @param {number[]} ids * @protected */ _onRemove(ids) { let count = 0; const me = this; ids.forEach(id => { const item = me.items[id]; if (item) { count++; me._removeItem(item); } }); if (count) { // update order this._order(); this.body.emitter.emit('_change', {queue: true}); } } /** * Update the order of item in all groups * @private */ _order() { // reorder the items in all groups // TODO: optimization: only reorder groups affected by the changed items util$3.forEach(this.groups, group => { group.order(); }); } /** * Handle updated groups * @param {number[]} ids * @private */ _onUpdateGroups(ids) { this._onAddGroups(ids); } /** * Handle changed groups (added or updated) * @param {number[]} ids * @private */ _onAddGroups(ids) { const me = this; ids.forEach(id => { const groupData = me.groupsData.get(id); let group = me.groups[id]; if (!group) { // check for reserved ids if (id == UNGROUPED$2 || id == BACKGROUND$2) { throw new Error(`Illegal group id. ${id} is a reserved id.`); } const groupOptions = Object.create(me.options); util$3.extend(groupOptions, { height: null }); group = new Group(id, groupData, me); me.groups[id] = group; // add items with this groupId to the new group for (const itemId in me.items) { if (me.items.hasOwnProperty(itemId)) { const item = me.items[itemId]; if (item.data.group == id) { group.add(item); } } } group.order(); group.show(); } else { // update group group.setData(groupData); } }); this.body.emitter.emit('_change', {queue: true}); } /** * Handle removed groups * @param {number[]} ids * @private */ _onRemoveGroups(ids) { ids.forEach(id => { const group = this.groups[id]; if (group) { group.dispose(); delete this.groups[id]; } }); if (this.options.cluster) { this.clusterGenerator.updateData(); this._clusterItems(); } this.markDirty({ restackGroups: !!this.options.cluster }); this.body.emitter.emit('_change', {queue: true}); } /** * Reorder the groups if needed * @return {boolean} changed * @private */ _orderGroups() { if (this.groupsData) { // reorder the groups let groupIds = this.groupsData.getIds({ order: this.options.groupOrder }); groupIds = this._orderNestedGroups(groupIds); const changed = !util$3.equalArray(groupIds, this.groupIds); if (changed) { // hide all groups, removes them from the DOM const groups = this.groups; groupIds.forEach(groupId => { groups[groupId].hide(); }); // show the groups again, attach them to the DOM in correct order groupIds.forEach(groupId => { groups[groupId].show(); }); this.groupIds = groupIds; } return changed; } else { return false; } } /** * Reorder the nested groups * * @param {Array.<number>} groupIds * @returns {Array.<number>} * @private */ _orderNestedGroups(groupIds) { /** * Recursively order nested groups * * @param {ItemSet} t * @param {Array.<number>} groupIds * @returns {Array.<number>} * @private */ function getOrderedNestedGroups(t, groupIds) { let result = []; groupIds.forEach(groupId => { result.push(groupId); const groupData = t.groupsData.get(groupId); if (groupData.nestedGroups) { const nestedGroupIds = t.groupsData.get({ filter(nestedGroup) { return nestedGroup.nestedInGroup == groupId; }, order: t.options.groupOrder }).map(nestedGroup => nestedGroup.id); result = result.concat(getOrderedNestedGroups(t, nestedGroupIds)); } }); return result; } const topGroupIds = groupIds.filter(groupId => !this.groupsData.get(groupId).nestedInGroup); return getOrderedNestedGroups(this, topGroupIds); } /** * Add a new item * @param {Item} item * @private */ _addItem(item) { this.items[item.id] = item; // add to group const groupId = this.getGroupId(item.data); const group = this.groups[groupId]; if (!group) { item.groupShowing = false; } else if (group && group.data && group.data.showNested) { item.groupShowing = true; } if (group) group.add(item); } /** * Update an existing item * @param {Item} item * @param {Object} itemData * @private */ _updateItem(item, itemData) { // update the items data (will redraw the item when displayed) item.setData(itemData); const groupId = this.getGroupId(item.data); const group = this.groups[groupId]; if (!group) { item.groupShowing = false; } else if (group && group.data && group.data.showNested) { item.groupShowing = true; } } /** * Delete an item from the ItemSet: remove it from the DOM, from the map * with items, and from the map with visible items, and from the selection * @param {Item} item * @private */ _removeItem(item) { // remove from DOM item.hide(); // remove from items delete this.items[item.id]; // remove from selection const index = this.selection.indexOf(item.id); if (index != -1) this.selection.splice(index, 1); // remove from group item.parent && item.parent.remove(item); // remove Tooltip from DOM if (this.popup != null) { this.popup.hide(); } } /** * Create an array containing all items being a range (having an end date) * @param {Array.<Object>} array * @returns {Array} * @private */ _constructByEndArray(array) { const endArray = []; for (let i = 0; i < array.length; i++) { if (array[i] instanceof RangeItem) { endArray.push(array[i]); } } return endArray; } /** * Register the clicked item on touch, before dragStart is initiated. * * dragStart is initiated from a mousemove event, AFTER the mouse/touch is * already moving. Therefore, the mouse/touch can sometimes be above an other * DOM element than the item itself. * * @param {Event} event * @private */ _onTouch(event) { // store the touched item, used in _onDragStart this.touchParams.item = this.itemFromTarget(event); this.touchParams.dragLeftItem = event.target.dragLeftItem || false; this.touchParams.dragRightItem = event.target.dragRightItem || false; this.touchParams.itemProps = null; } /** * Given an group id, returns the index it has. * * @param {number} groupId * @returns {number} index / groupId * @private */ _getGroupIndex(groupId) { for (let i = 0; i < this.groupIds.length; i++) { if (groupId == this.groupIds[i]) return i; } } /** * Start dragging the selected events * @param {Event} event * @private */ _onDragStart(event) { if (this.touchParams.itemIsDragging) { return; } const item = this.touchParams.item || null; const me = this; let props; if (item && (item.selected || this.options.itemsAlwaysDraggable.item)) { if (this.options.editable.overrideItems && !this.options.editable.updateTime && !this.options.editable.updateGroup) { return; } // override options.editable if ((item.editable != null && !item.editable.updateTime && !item.editable.updateGroup) && !this.options.editable.overrideItems) { return; } const dragLeftItem = this.touchParams.dragLeftItem; const dragRightItem = this.touchParams.dragRightItem; this.touchParams.itemIsDragging = true; this.touchParams.selectedItem = item; if (dragLeftItem) { props = { item: dragLeftItem, initialX: event.center.x, dragLeft: true, data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; } else if (dragRightItem) { props = { item: dragRightItem, initialX: event.center.x, dragRight: true, data: this._cloneItemData(item.data) }; this.touchParams.itemProps = [props]; } else if (this.options.editable.add && (event.srcEvent.ctrlKey || event.srcEvent.metaKey)) { // create a new range item when dragging with ctrl key down this._onDragStartAddItem(event); } else { if(this.groupIds.length < 1) { // Mitigates a race condition if _onDragStart() is // called after markDirty() without redraw() being called between. this.redraw(); } const baseGroupIndex = this._getGroupIndex(item.data.group); const itemsToDrag = (this.options.itemsAlwaysDraggable.item && !item.selected) ? [item.id] : this.getSelection(); this.touchParams.itemProps = itemsToDrag.map(id => { const item = me.items[id]; const groupIndex = me._getGroupIndex(item.data.group); return { item, initialX: event.center.x, groupOffset: baseGroupIndex-groupIndex, data: this._cloneItemData(item.data) }; }); } event.stopPropagation(); } else if (this.options.editable.add && (event.srcEvent.ctrlKey || event.srcEvent.metaKey)) { // create a new range item when dragging with ctrl key down this._onDragStartAddItem(event); } } /** * Start creating a new range item by dragging. * @param {Event} event * @private */ _onDragStartAddItem(event) { const snap = this.options.snap || null; const frameRect = this.dom.frame.getBoundingClientRect(); // plus (if rtl) 10 to compensate for the drag starting as soon as you've moved 10px const x = this.options.rtl ? frameRect.right - event.center.x + 10 : event.center.x - frameRect.left - 10; const time = this.body.util.toTime(x); const scale = this.body.util.getScale(); const step = this.body.util.getStep(); const start = snap ? snap(time, scale, step) : time; const end = start; const itemData = { type: 'range', start, end, content: 'new item' }; const id = dist.v4(); itemData[this.itemsData.idProp] = id; const group = this.groupFromTarget(event); if (group) { itemData.group = group.groupId; } const newItem = new RangeItem(itemData, this.conversion, this.options); newItem.id = id; // TODO: not so nice setting id afterwards newItem.data = this._cloneItemData(itemData); this._addItem(newItem); this.touchParams.selectedItem = newItem; const props = { item: newItem, initialX: event.center.x, data: newItem.data }; if (this.options.rtl) { props.dragLeft = true; } else { props.dragRight = true; } this.touchParams.itemProps = [props]; event.stopPropagation(); } /** * Drag selected items * @param {Event} event * @private */ _onDrag(event) { if (this.popup != null && this.options.showTooltips && !this.popup.hidden) { // this.popup.hide(); const container = this.body.dom.centerContainer; const containerRect = container.getBoundingClientRect(); this.popup.setPosition( event.center.x - containerRect.left + container.offsetLeft, event.center.y - containerRect.top + container.offsetTop ); this.popup.show(); // redraw } if (this.touchParams.itemProps) { event.stopPropagation(); const me = this; const snap = this.options.snap || null; const domRootOffsetLeft = this.body.dom.root.offsetLeft; const xOffset = this.options.rtl ? domRootOffsetLeft + this.body.domProps.right.width : domRootOffsetLeft + this.body.domProps.left.width; const scale = this.body.util.getScale(); const step = this.body.util.getStep(); //only calculate the new group for the item that's actually dragged const selectedItem = this.touchParams.selectedItem; const updateGroupAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateGroup) || (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateGroup); let newGroupBase = null; if (updateGroupAllowed && selectedItem) { if (selectedItem.data.group != undefined) { // drag from one group to another const group = me.groupFromTarget(event); if (group) { //we know the offset for all items, so the new group for all items //will be relative to this one. newGroupBase = this._getGroupIndex(group.groupId); } } } // move this.touchParams.itemProps.forEach(props => { const current = me.body.util.toTime(event.center.x - xOffset); const initial = me.body.util.toTime(props.initialX - xOffset); let offset; let initialStart; let initialEnd; let start; let end; if (this.options.rtl) { offset = -(current - initial); // ms } else { offset = (current - initial); // ms } let itemData = this._cloneItemData(props.item.data); // clone the data if (props.item.editable != null && !props.item.editable.updateTime && !props.item.editable.updateGroup && !me.options.editable.overrideItems) { return; } const updateTimeAllowed = ((this.options.editable.overrideItems || selectedItem.editable == null) && this.options.editable.updateTime) || (!this.options.editable.overrideItems && selectedItem.editable != null && selectedItem.editable.updateTime); if (updateTimeAllowed) { if (props.dragLeft) { // drag left side of a range item if (this.options.rtl) { if (itemData.end != undefined) { initialEnd = util$3.convert(props.data.end, 'Date'); end = new Date(initialEnd.valueOf() + offset); // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.end = snap ? snap(end, scale, step) : end; } } else { if (itemData.start != undefined) { initialStart = util$3.convert(props.data.start, 'Date'); start = new Date(initialStart.valueOf() + offset); // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } } else if (props.dragRight) { // drag right side of a range item if (this.options.rtl) { if (itemData.start != undefined) { initialStart = util$3.convert(props.data.start, 'Date'); start = new Date(initialStart.valueOf() + offset); // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } else { if (itemData.end != undefined) { initialEnd = util$3.convert(props.data.end, 'Date'); end = new Date(initialEnd.valueOf() + offset); // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.end = snap ? snap(end, scale, step) : end; } } } else { // drag both start and end if (itemData.start != undefined) { initialStart = util$3.convert(props.data.start, 'Date').valueOf(); start = new Date(initialStart + offset); if (itemData.end != undefined) { initialEnd = util$3.convert(props.data.end, 'Date'); const duration = initialEnd.valueOf() - initialStart.valueOf(); // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; itemData.end = new Date(itemData.start.valueOf() + duration); } else { // TODO: pass a Moment instead of a Date to snap(). (Breaking change) itemData.start = snap ? snap(start, scale, step) : start; } } } } if (updateGroupAllowed && (!props.dragLeft && !props.dragRight) && newGroupBase!=null) { if (itemData.group != undefined) { let newOffset = newGroupBase - props.groupOffset; //make sure we stay in bounds newOffset = Math.max(0, newOffset); newOffset = Math.min(me.groupIds.length-1, newOffset); itemData.group = me.groupIds[newOffset]; } } // confirm moving the item itemData = this._cloneItemData(itemData); // convert start and end to the correct type me.options.onMoving(itemData, itemData => { if (itemData) { props.item.setData(this._cloneItemData(itemData, 'Date')); } }); }); this.body.emitter.emit('_change'); } } /** * Move an item to another group * @param {Item} item * @param {string | number} groupId * @private */ _moveToGroup(item, groupId) { const group = this.groups[groupId]; if (group && group.groupId != item.data.group) { const oldGroup = item.parent; oldGroup.remove(item); oldGroup.order(); item.data.group = group.groupId; group.add(item); group.order(); } } /** * End of dragging selected items * @param {Event} event * @private */ _onDragEnd(event) { this.touchParams.itemIsDragging = false; if (this.touchParams.itemProps) { event.stopPropagation(); const me = this; const itemProps = this.touchParams.itemProps; this.touchParams.itemProps = null; itemProps.forEach(props => { const id = props.item.id; const exists = me.itemsData.get(id) != null; if (!exists) { // add a new item me.options.onAdd(props.item.data, itemData => { me._removeItem(props.item); // remove temporary item if (itemData) { me.itemsData.add(itemData); } // force re-stacking of all items next redraw me.body.emitter.emit('_change'); }); } else { // update existing item const itemData = this._cloneItemData(props.item.data); // convert start and end to the correct type me.options.onMove(itemData, itemData => { if (itemData) { // apply changes itemData[this.itemsData.idProp] = id; // ensure the item contains its id (can be undefined) this.itemsData.update(itemData); } else { // restore original values props.item.setData(props.data); me.body.emitter.emit('_change'); } }); } }); } } /** * On group click * @param {Event} event * @private */ _onGroupClick(event) { const group = this.groupFromTarget(event); setTimeout(() => { this.toggleGroupShowNested(group); }, 1); } /** * Toggle show nested * @param {object} group * @param {boolean} force */ toggleGroupShowNested(group, force = undefined) { if (!group || !group.nestedGroups) return; const groupsData = this.groupsData.getDataSet(); if (force != undefined) { group.showNested = !!force; } else { group.showNested = !group.showNested; } let nestingGroup = groupsData.get(group.groupId); nestingGroup.showNested = group.showNested; let fullNestedGroups = group.nestedGroups; let nextLevel = fullNestedGroups; while (nextLevel.length > 0) { let current = nextLevel; nextLevel = []; for (let i = 0; i < current.length; i++) { let node = groupsData.get(current[i]); if (node.nestedGroups) { nextLevel = nextLevel.concat(node.nestedGroups); } } if (nextLevel.length > 0) { fullNestedGroups = fullNestedGroups.concat(nextLevel); } } let nestedGroups = groupsData.get(fullNestedGroups).map(function (nestedGroup) { if (nestedGroup.visible == undefined) { nestedGroup.visible = true; } nestedGroup.visible = !!nestingGroup.showNested; return nestedGroup; }); groupsData.update(nestedGroups.concat(nestingGroup)); if (nestingGroup.showNested) { util$3.removeClassName(group.dom.label, 'collapsed'); util$3.addClassName(group.dom.label, 'expanded'); } else { util$3.removeClassName(group.dom.label, 'expanded'); util$3.addClassName(group.dom.label, 'collapsed'); } } /** * Toggle group drag classname * @param {object} group */ toggleGroupDragClassName(group) { group.dom.label.classList.toggle('vis-group-is-dragging'); group.dom.foreground.classList.toggle('vis-group-is-dragging'); } /** * on drag start * @param {Event} event * @return {void} * @private */ _onGroupDragStart(event) { if (this.groupTouchParams.isDragging) return; if (this.options.groupEditable.order) { this.groupTouchParams.group = this.groupFromTarget(event); if (this.groupTouchParams.group) { event.stopPropagation(); this.groupTouchParams.isDragging = true; this.toggleGroupDragClassName(this.groupTouchParams.group); this.groupTouchParams.originalOrder = this.groupsData.getIds({ order: this.options.groupOrder }); } } } /** * on drag * @param {Event} event * @return {void} * @private */ _onGroupDrag(event) { if (this.options.groupEditable.order && this.groupTouchParams.group) { event.stopPropagation(); const groupsData = this.groupsData.getDataSet(); // drag from one group to another const group = this.groupFromTarget(event); // try to avoid toggling when groups differ in height if (group && group.height != this.groupTouchParams.group.height) { const movingUp = (group.top < this.groupTouchParams.group.top); const clientY = event.center ? event.center.y : event.clientY; const targetGroup = group.dom.foreground.getBoundingClientRect(); const draggedGroupHeight = this.groupTouchParams.group.height; if (movingUp) { // skip swapping the groups when the dragged group is not below clientY afterwards if (targetGroup.top + draggedGroupHeight < clientY) { return; } } else { const targetGroupHeight = group.height; // skip swapping the groups when the dragged group is not below clientY afterwards if (targetGroup.top + targetGroupHeight - draggedGroupHeight > clientY) { return; } } } if (group && group != this.groupTouchParams.group) { const targetGroup = groupsData.get(group.groupId); const draggedGroup = groupsData.get(this.groupTouchParams.group.groupId); // switch groups if (draggedGroup && targetGroup) { this.options.groupOrderSwap(draggedGroup, targetGroup, groupsData); groupsData.update(draggedGroup); groupsData.update(targetGroup); } // fetch current order of groups const newOrder = groupsData.getIds({ order: this.options.groupOrder }); // in case of changes since _onGroupDragStart if (!util$3.equalArray(newOrder, this.groupTouchParams.originalOrder)) { const origOrder = this.groupTouchParams.originalOrder; const draggedId = this.groupTouchParams.group.groupId; const numGroups = Math.min(origOrder.length, newOrder.length); let curPos = 0; let newOffset = 0; let orgOffset = 0; while (curPos < numGroups) { // as long as the groups are where they should be step down along the groups order while ((curPos+newOffset) < numGroups && (curPos+orgOffset) < numGroups && newOrder[curPos+newOffset] == origOrder[curPos+orgOffset]) { curPos++; } // all ok if (curPos+newOffset >= numGroups) { break; } // not all ok // if dragged group was move upwards everything below should have an offset if (newOrder[curPos+newOffset] == draggedId) { newOffset = 1; } // if dragged group was move downwards everything above should have an offset else if (origOrder[curPos+orgOffset] == draggedId) { orgOffset = 1; } // found a group (apart from dragged group) that has the wrong position -> switch with the // group at the position where other one should be, fix index arrays and continue else { const slippedPosition = newOrder.indexOf(origOrder[curPos+orgOffset]); const switchGroup = groupsData.get(newOrder[curPos+newOffset]); const shouldBeGroup = groupsData.get(origOrder[curPos+orgOffset]); this.options.groupOrderSwap(switchGroup, shouldBeGroup, groupsData); groupsData.update(switchGroup); groupsData.update(shouldBeGroup); const switchGroupId = newOrder[curPos+newOffset]; newOrder[curPos+newOffset] = origOrder[curPos+orgOffset]; newOrder[slippedPosition] = switchGroupId; curPos++; } } } } } } /** * on drag end * @param {Event} event * @return {void} * @private */ _onGroupDragEnd(event) { this.groupTouchParams.isDragging = false; if (this.options.groupEditable.order && this.groupTouchParams.group) { event.stopPropagation(); // update existing group const me = this; const id = me.groupTouchParams.group.groupId; const dataset = me.groupsData.getDataSet(); const groupData = util$3.extend({}, dataset.get(id)); // clone the data me.options.onMoveGroup(groupData, groupData => { if (groupData) { // apply changes groupData[dataset._idProp] = id; // ensure the group contains its id (can be undefined) dataset.update(groupData); } else { // fetch current order of groups const newOrder = dataset.getIds({ order: me.options.groupOrder }); // restore original order if (!util$3.equalArray(newOrder, me.groupTouchParams.originalOrder)) { const origOrder = me.groupTouchParams.originalOrder; const numGroups = Math.min(origOrder.length, newOrder.length); let curPos = 0; while (curPos < numGroups) { // as long as the groups are where they should be step down along the groups order while (curPos < numGroups && newOrder[curPos] == origOrder[curPos]) { curPos++; } // all ok if (curPos >= numGroups) { break; } // found a group that has the wrong position -> switch with the // group at the position where other one should be, fix index arrays and continue const slippedPosition = newOrder.indexOf(origOrder[curPos]); const switchGroup = dataset.get(newOrder[curPos]); const shouldBeGroup = dataset.get(origOrder[curPos]); me.options.groupOrderSwap(switchGroup, shouldBeGroup, dataset); dataset.update(switchGroup); dataset.update(shouldBeGroup); const switchGroupId = newOrder[curPos]; newOrder[curPos] = origOrder[curPos]; newOrder[slippedPosition] = switchGroupId; curPos++; } } } }); me.body.emitter.emit('groupDragged', { groupId: id }); this.toggleGroupDragClassName(this.groupTouchParams.group); this.groupTouchParams.group = null; } } /** * Handle selecting/deselecting an item when tapping it * @param {Event} event * @private */ _onSelectItem(event) { if (!this.options.selectable) return; const ctrlKey = event.srcEvent && (event.srcEvent.ctrlKey || event.srcEvent.metaKey); const shiftKey = event.srcEvent && event.srcEvent.shiftKey; if (ctrlKey || shiftKey) { this._onMultiSelectItem(event); return; } const oldSelection = this.getSelection(); const item = this.itemFromTarget(event); const selection = item && item.selectable ? [item.id] : []; this.setSelection(selection); const newSelection = this.getSelection(); // emit a select event, // except when old selection is empty and new selection is still empty if (newSelection.length > 0 || oldSelection.length > 0) { this.body.emitter.emit('select', { items: newSelection, event }); } } /** * Handle hovering an item * @param {Event} event * @private */ _onMouseOver(event) { const item = this.itemFromTarget(event); if (!item) return; // Item we just left const related = this.itemFromRelatedTarget(event); if (item === related) { // We haven't changed item, just element in the item return; } const title = item.getTitle(); if (this.options.showTooltips && title) { if (this.popup == null) { this.popup = new Popup$2(this.body.dom.root, this.options.tooltip.overflowMethod || 'flip'); } this.popup.setText(title); const container = this.body.dom.centerContainer; const containerRect = container.getBoundingClientRect(); this.popup.setPosition( event.clientX - containerRect.left + container.offsetLeft, event.clientY - containerRect.top + container.offsetTop ); this.setPopupTimer(this.popup); } else { // Hovering over item without a title, hide popup // Needed instead of _just_ in _onMouseOut due to #2572 this.clearPopupTimer(); if (this.popup != null) { this.popup.hide(); } } this.body.emitter.emit('itemover', { item: item.id, event }); } /** * on mouse start * @param {Event} event * @return {void} * @private */ _onMouseOut(event) { const item = this.itemFromTarget(event); if (!item) return; // Item we are going to const related = this.itemFromRelatedTarget(event); if (item === related) { // We aren't changing item, just element in the item return; } this.clearPopupTimer(); if (this.popup != null) { this.popup.hide(); } this.body.emitter.emit('itemout', { item: item.id, event }); } /** * on mouse move * @param {Event} event * @return {void} * @private */ _onMouseMove(event) { const item = this.itemFromTarget(event); if (!item) return; if (this.popupTimer != null) { // restart timer this.setPopupTimer(this.popup); } if (this.options.showTooltips && this.options.tooltip.followMouse && this.popup && !this.popup.hidden) { const container = this.body.dom.centerContainer; const containerRect = container.getBoundingClientRect(); this.popup.setPosition( event.clientX - containerRect.left + container.offsetLeft, event.clientY - containerRect.top + container.offsetTop ); this.popup.show(); // Redraw } } /** * Handle mousewheel * @param {Event} event The event * @private */ _onMouseWheel(event) { if (this.touchParams.itemIsDragging) { this._onDragEnd(event); } } /** * Handle updates of an item on double tap * @param {timeline.Item} item The item * @private */ _onUpdateItem(item) { if (!this.options.selectable) return; if (!this.options.editable.updateTime && !this.options.editable.updateGroup) return; const me = this; if (item) { // execute async handler to update the item (or cancel it) const itemData = me.itemsData.get(item.id); // get a clone of the data from the dataset this.options.onUpdate(itemData, itemData => { if (itemData) { me.itemsData.update(itemData); } }); } } /** * Handle drop event of data on item * Only called when `objectData.target === 'item'. * @param {Event} event The event * @private */ _onDropObjectOnItem(event) { const item = this.itemFromTarget(event); const objectData = JSON.parse(event.dataTransfer.getData("text")); this.options.onDropObjectOnItem(objectData, item); } /** * Handle creation of an item on double tap or drop of a drag event * @param {Event} event The event * @private */ _onAddItem(event) { if (!this.options.selectable) return; if (!this.options.editable.add) return; const me = this; const snap = this.options.snap || null; // add item const frameRect = this.dom.frame.getBoundingClientRect(); const x = this.options.rtl ? frameRect.right - event.center.x : event.center.x - frameRect.left; const start = this.body.util.toTime(x); const scale = this.body.util.getScale(); const step = this.body.util.getStep(); let end; let newItemData; if (event.type == 'drop') { newItemData = JSON.parse(event.dataTransfer.getData("text")); newItemData.content = newItemData.content ? newItemData.content : 'new item'; newItemData.start = newItemData.start ? newItemData.start : (snap ? snap(start, scale, step) : start); newItemData.type = newItemData.type || 'box'; newItemData[this.itemsData.idProp] = newItemData.id || dist.v4(); if (newItemData.type == 'range' && !newItemData.end) { end = this.body.util.toTime(x + this.props.width / 5); newItemData.end = snap ? snap(end, scale, step) : end; } } else { newItemData = { start: snap ? snap(start, scale, step) : start, content: 'new item' }; newItemData[this.itemsData.idProp] = dist.v4(); // when default type is a range, add a default end date to the new item if (this.options.type === 'range') { end = this.body.util.toTime(x + this.props.width / 5); newItemData.end = snap ? snap(end, scale, step) : end; } } const group = this.groupFromTarget(event); if (group) { newItemData.group = group.groupId; } // execute async handler to customize (or cancel) adding an item newItemData = this._cloneItemData(newItemData); // convert start and end to the correct type this.options.onAdd(newItemData, item => { if (item) { me.itemsData.add(item); if (event.type == 'drop') { me.setSelection([item.id]); } // TODO: need to trigger a redraw? } }); } /** * Handle selecting/deselecting multiple items when holding an item * @param {Event} event * @private */ _onMultiSelectItem(event) { if (!this.options.selectable) return; const item = this.itemFromTarget(event); if (item) { // multi select items (if allowed) let selection = this.options.multiselect ? this.getSelection() // take current selection : []; // deselect current selection const shiftKey = event.srcEvent && event.srcEvent.shiftKey || false; if ((shiftKey || this.options.sequentialSelection) && this.options.multiselect) { // select all items between the old selection and the tapped item const itemGroup = this.itemsData.get(item.id).group; // when filtering get the group of the last selected item let lastSelectedGroup = undefined; if (this.options.multiselectPerGroup) { if (selection.length > 0) { lastSelectedGroup = this.itemsData.get(selection[0]).group; } } // determine the selection range if (!this.options.multiselectPerGroup || lastSelectedGroup == undefined || lastSelectedGroup == itemGroup) { selection.push(item.id); } const range = ItemSet._getItemRange(this.itemsData.get(selection)); if (!this.options.multiselectPerGroup || lastSelectedGroup == itemGroup) { // select all items within the selection range selection = []; for (const id in this.items) { if (this.items.hasOwnProperty(id)) { const _item = this.items[id]; const start = _item.data.start; const end = (_item.data.end !== undefined) ? _item.data.end : start; if (start >= range.min && end <= range.max && (!this.options.multiselectPerGroup || lastSelectedGroup == this.itemsData.get(_item.id).group) && !(_item instanceof BackgroundItem)) { selection.push(_item.id); // do not use id but item.id, id itself is stringified } } } } } else { // add/remove this item from the current selection const index = selection.indexOf(item.id); if (index == -1) { // item is not yet selected -> select it selection.push(item.id); } else { // item is already selected -> deselect it selection.splice(index, 1); } } const filteredSelection = selection.filter(item => this.getItemById(item).selectable); this.setSelection(filteredSelection); this.body.emitter.emit('select', { items: this.getSelection(), event }); } } /** * Calculate the time range of a list of items * @param {Array.<Object>} itemsData * @return {{min: Date, max: Date}} Returns the range of the provided items * @private */ static _getItemRange(itemsData) { let max = null; let min = null; itemsData.forEach(data => { if (min == null || data.start < min) { min = data.start; } if (data.end != undefined) { if (max == null || data.end > max) { max = data.end; } } else { if (max == null || data.start > max) { max = data.start; } } }); return { min, max } } /** * Find an item from an element: * searches for the attribute 'vis-item' in the element's tree * @param {HTMLElement} element * @return {Item | null} item */ itemFromElement(element) { let cur = element; while (cur) { if (cur.hasOwnProperty('vis-item')) { return cur['vis-item']; } cur = cur.parentNode; } return null; } /** * Find an item from an event target: * searches for the attribute 'vis-item' in the event target's element tree * @param {Event} event * @return {Item | null} item */ itemFromTarget(event) { return this.itemFromElement(event.target); } /** * Find an item from an event's related target: * searches for the attribute 'vis-item' in the related target's element tree * @param {Event} event * @return {Item | null} item */ itemFromRelatedTarget(event) { return this.itemFromElement(event.relatedTarget); } /** * Find the Group from an event target: * searches for the attribute 'vis-group' in the event target's element tree * @param {Event} event * @return {Group | null} group */ groupFromTarget(event) { const clientY = event.center ? event.center.y : event.clientY; let groupIds = this.groupIds; if (groupIds.length <= 0 && this.groupsData) { groupIds = this.groupsData.getIds({ order: this.options.groupOrder }); } for (let i = 0; i < groupIds.length; i++) { const groupId = groupIds[i]; const group = this.groups[groupId]; const foreground = group.dom.foreground; const foregroundRect = foreground.getBoundingClientRect(); if (clientY >= foregroundRect.top && clientY < foregroundRect.top + foreground.offsetHeight) { return group; } if (this.options.orientation.item === 'top') { if (i === this.groupIds.length - 1 && clientY > foregroundRect.top) { return group; } } else { if (i === 0 && clientY < foregroundRect.top + foreground.offset) { return group; } } } return null; } /** * Find the ItemSet from an event target: * searches for the attribute 'vis-itemset' in the event target's element tree * @param {Event} event * @return {ItemSet | null} item */ static itemSetFromTarget(event) { let target = event.target; while (target) { if (target.hasOwnProperty('vis-itemset')) { return target['vis-itemset']; } target = target.parentNode; } return null; } /** * Clone the data of an item, and "normalize" it: convert the start and end date * to the type (Date, Moment, ...) configured in the DataSet. If not configured, * start and end are converted to Date. * @param {Object} itemData, typically `item.data` * @param {string} [type] Optional Date type. If not provided, the type from the DataSet is taken * @return {Object} The cloned object * @private */ _cloneItemData(itemData, type) { const clone = util$3.extend({}, itemData); if (!type) { // convert start and end date to the type (Date, Moment, ...) configured in the DataSet type = this.itemsData.type; } if (clone.start != undefined) { clone.start = util$3.convert(clone.start, type && type.start || 'Date'); } if (clone.end != undefined) { clone.end = util$3.convert(clone.end , type && type.end || 'Date'); } return clone; } /** * cluster items * @return {void} * @private */ _clusterItems() { if (!this.options.cluster) { return; } const { scale } = this.body.range.conversion(this.body.domProps.center.width); const clusters = this.clusterGenerator.getClusters(this.clusters, scale, this.options.cluster); if (this.clusters != clusters) { this._detachAllClusters(); if (clusters) { for (let cluster of clusters) { cluster.attach(); } this.clusters = clusters; } this._updateClusters(clusters); } } /** * detach all cluster items * @private */ _detachAllClusters() { if (this.options.cluster) { if (this.clusters && this.clusters.length) { for (let cluster of this.clusters) { cluster.detach(); } } } } /** * update clusters * @param {array} clusters * @private */ _updateClusters(clusters) { if (this.clusters && this.clusters.length) { const newClustersIds = new Set(clusters.map(cluster => cluster.id)); const clustersToUnselect = this.clusters.filter(cluster => !newClustersIds.has(cluster.id)); let selectionChanged = false; for (let cluster of clustersToUnselect) { const selectedIdx = this.selection.indexOf(cluster.id); if (selectedIdx !== -1) { cluster.unselect(); this.selection.splice(selectedIdx, 1); selectionChanged = true; } } if (selectionChanged) { const newSelection = this.getSelection(); this.body.emitter.emit('select', { items: newSelection, event: event }); } } this.clusters = clusters || []; } } // available item types will be registered here ItemSet.types = { background: BackgroundItem, box: BoxItem, range: RangeItem, point: PointItem }; /** * Handle added items * @param {number[]} ids * @protected */ ItemSet.prototype._onAdd = ItemSet.prototype._onUpdate; let errorFound$1 = false; let allOptions$1; let printStyle = 'background: #FFeeee; color: #dd0000'; /** * Used to validate options. */ class Validator$2 { /** * @ignore */ constructor() { } /** * Main function to be called * @param {Object} options * @param {Object} referenceOptions * @param {Object} subObject * @returns {boolean} * @static */ static validate(options, referenceOptions, subObject) { errorFound$1 = false; allOptions$1 = referenceOptions; let usedOptions = referenceOptions; if (subObject !== undefined) { usedOptions = referenceOptions[subObject]; } Validator$2.parse(options, usedOptions, []); return errorFound$1; } /** * Will traverse an object recursively and check every value * @param {Object} options * @param {Object} referenceOptions * @param {array} path | where to look for the actual option * @static */ static parse(options, referenceOptions, path) { for (let option in options) { if (options.hasOwnProperty(option)) { Validator$2.check(option, options, referenceOptions, path); } } } /** * Check every value. If the value is an object, call the parse function on that object. * @param {string} option * @param {Object} options * @param {Object} referenceOptions * @param {array} path | where to look for the actual option * @static */ static check(option, options, referenceOptions, path) { if (referenceOptions[option] === undefined && referenceOptions.__any__ === undefined) { Validator$2.getSuggestion(option, referenceOptions, path); return; } let referenceOption = option; let is_object = true; if (referenceOptions[option] === undefined && referenceOptions.__any__ !== undefined) { // NOTE: This only triggers if the __any__ is in the top level of the options object. // THAT'S A REALLY BAD PLACE TO ALLOW IT!!!! // TODO: Examine if needed, remove if possible // __any__ is a wildcard. Any value is accepted and will be further analysed by reference. referenceOption = '__any__'; // if the any-subgroup is not a predefined object in the configurator, // we do not look deeper into the object. is_object = (Validator$2.getType(options[option]) === 'object'); } let refOptionObj = referenceOptions[referenceOption]; if (is_object && refOptionObj.__type__ !== undefined) { refOptionObj = refOptionObj.__type__; } Validator$2.checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path); } /** * * @param {string} option | the option property * @param {Object} options | The supplied options object * @param {Object} referenceOptions | The reference options containing all options and their allowed formats * @param {string} referenceOption | Usually this is the same as option, except when handling an __any__ tag. * @param {string} refOptionObj | This is the type object from the reference options * @param {Array} path | where in the object is the option * @static */ static checkFields(option, options, referenceOptions, referenceOption, refOptionObj, path) { let log = function(message) { console.log('%c' + message + Validator$2.printLocation(path, option), printStyle); }; let optionType = Validator$2.getType(options[option]); let refOptionType = refOptionObj[optionType]; if (refOptionType !== undefined) { // if the type is correct, we check if it is supposed to be one of a few select values if (Validator$2.getType(refOptionType) === 'array' && refOptionType.indexOf(options[option]) === -1) { log('Invalid option detected in "' + option + '".' + ' Allowed values are:' + Validator$2.print(refOptionType) + ' not "' + options[option] + '". '); errorFound$1 = true; } else if (optionType === 'object' && referenceOption !== "__any__") { path = util$3.copyAndExtendArray(path, option); Validator$2.parse(options[option], referenceOptions[referenceOption], path); } } else if (refOptionObj['any'] === undefined) { // type of the field is incorrect and the field cannot be any log('Invalid type received for "' + option + '". Expected: ' + Validator$2.print(Object.keys(refOptionObj)) + '. Received [' + optionType + '] "' + options[option] + '"'); errorFound$1 = true; } } /** * * @param {Object|boolean|number|string|Array.<number>|Date|Node|Moment|undefined|null} object * @returns {string} * @static */ static getType(object) { var type = typeof object; if (type === 'object') { if (object === null) { return 'null'; } if (object instanceof Boolean) { return 'boolean'; } if (object instanceof Number) { return 'number'; } if (object instanceof String) { return 'string'; } if (Array.isArray(object)) { return 'array'; } if (object instanceof Date) { return 'date'; } if (object.nodeType !== undefined) { return 'dom'; } if (object._isAMomentObject === true) { return 'moment'; } return 'object'; } else if (type === 'number') { return 'number'; } else if (type === 'boolean') { return 'boolean'; } else if (type === 'string') { return 'string'; } else if (type === undefined) { return 'undefined'; } return type; } /** * @param {string} option * @param {Object} options * @param {Array.<string>} path * @static */ static getSuggestion(option, options, path) { let localSearch = Validator$2.findInOptions(option,options,path,false); let globalSearch = Validator$2.findInOptions(option,allOptions$1,[],true); let localSearchThreshold = 8; let globalSearchThreshold = 4; let msg; if (localSearch.indexMatch !== undefined) { msg = ' in ' + Validator$2.printLocation(localSearch.path, option,'') + 'Perhaps it was incomplete? Did you mean: "' + localSearch.indexMatch + '"?\n\n'; } else if (globalSearch.distance <= globalSearchThreshold && localSearch.distance > globalSearch.distance) { msg = ' in ' + Validator$2.printLocation(localSearch.path, option,'') + 'Perhaps it was misplaced? Matching option found at: ' + Validator$2.printLocation(globalSearch.path, globalSearch.closestMatch,''); } else if (localSearch.distance <= localSearchThreshold) { msg = '. Did you mean "' + localSearch.closestMatch + '"?' + Validator$2.printLocation(localSearch.path, option); } else { msg = '. Did you mean one of these: ' + Validator$2.print(Object.keys(options)) + Validator$2.printLocation(path, option); } console.log('%cUnknown option detected: "' + option + '"' + msg, printStyle); errorFound$1 = true; } /** * traverse the options in search for a match. * @param {string} option * @param {Object} options * @param {Array} path | where to look for the actual option * @param {boolean} [recursive=false] * @returns {{closestMatch: string, path: Array, distance: number}} * @static */ static findInOptions(option, options, path, recursive = false) { let min = 1e9; let closestMatch = ''; let closestMatchPath = []; let lowerCaseOption = option.toLowerCase(); let indexMatch = undefined; for (let op in options) { // eslint-disable-line guard-for-in let distance; if (options[op].__type__ !== undefined && recursive === true) { let result = Validator$2.findInOptions(option, options[op], util$3.copyAndExtendArray(path,op)); if (min > result.distance) { closestMatch = result.closestMatch; closestMatchPath = result.path; min = result.distance; indexMatch = result.indexMatch; } } else { if (op.toLowerCase().indexOf(lowerCaseOption) !== -1) { indexMatch = op; } distance = Validator$2.levenshteinDistance(option, op); if (min > distance) { closestMatch = op; closestMatchPath = util$3.copyArray(path); min = distance; } } } return {closestMatch:closestMatch, path:closestMatchPath, distance:min, indexMatch: indexMatch}; } /** * @param {Array.<string>} path * @param {Object} option * @param {string} prefix * @returns {String} * @static */ static printLocation(path, option, prefix = 'Problem value found at: \n') { let str = '\n\n' + prefix + 'options = {\n'; for (let i = 0; i < path.length; i++) { for (let j = 0; j < i + 1; j++) { str += ' '; } str += path[i] + ': {\n'; } for (let j = 0; j < path.length + 1; j++) { str += ' '; } str += option + '\n'; for (let i = 0; i < path.length + 1; i++) { for (let j = 0; j < path.length - i; j++) { str += ' '; } str += '}\n'; } return str + '\n\n'; } /** * @param {Object} options * @returns {String} * @static */ static print(options) { return JSON.stringify(options).replace(/(\")|(\[)|(\])|(,"__type__")/g, "").replace(/(\,)/g, ', ') } /** * Compute the edit distance between the two given strings * http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript * * Copyright (c) 2011 Andrei Mackenzie * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @param {string} a * @param {string} b * @returns {Array.<Array.<number>>}} * @static */ static levenshteinDistance(a, b) { if (a.length === 0) return b.length; if (b.length === 0) return a.length; var matrix = []; // increment along the first column of each row var i; for (i = 0; i <= b.length; i++) { matrix[i] = [i]; } // increment each column in the first row var j; for (j = 0; j <= a.length; j++) { matrix[0][j] = j; } // Fill in the rest of the matrix for (i = 1; i <= b.length; i++) { for (j = 1; j <= a.length; j++) { if (b.charAt(i - 1) == a.charAt(j - 1)) { matrix[i][j] = matrix[i - 1][j - 1]; } else { matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, // substitution Math.min(matrix[i][j - 1] + 1, // insertion matrix[i - 1][j] + 1)); // deletion } } } return matrix[b.length][a.length]; } } /** * This object contains all possible options. It will check if the types are correct, if required if the option is one * of the allowed values. * * __any__ means that the name of the property does not matter. * __type__ is a required field for all objects and contains the allowed types of all objects */ let string = 'string'; let bool = 'boolean'; let number = 'number'; let array = 'array'; let date = 'date'; let object = 'object'; // should only be in a __type__ property let dom = 'dom'; let moment$1$1 = 'moment'; let any = 'any'; let allOptions$1$1 = { configure: { enabled: { 'boolean': bool}, filter: { 'boolean': bool,'function': 'function'}, container: {dom}, __type__: {object, 'boolean': bool,'function': 'function'} }, //globals : align: {string}, alignCurrentTime: {string, 'undefined': 'undefined'}, rtl: { 'boolean': bool, 'undefined': 'undefined'}, rollingMode: { follow: { 'boolean': bool }, offset: {number,'undefined': 'undefined'}, __type__: {object} }, onTimeout: { timeoutMs: {number}, callback: {'function': 'function'}, __type__: {object} }, verticalScroll: { 'boolean': bool, 'undefined': 'undefined'}, horizontalScroll: { 'boolean': bool, 'undefined': 'undefined'}, autoResize: { 'boolean': bool}, throttleRedraw: {number}, // TODO: DEPRICATED see https://github.com/almende/vis/issues/2511 clickToUse: { 'boolean': bool}, dataAttributes: {string, array}, editable: { add: { 'boolean': bool, 'undefined': 'undefined'}, remove: { 'boolean': bool, 'undefined': 'undefined'}, updateGroup: { 'boolean': bool, 'undefined': 'undefined'}, updateTime: { 'boolean': bool, 'undefined': 'undefined'}, overrideItems: { 'boolean': bool, 'undefined': 'undefined'}, __type__: { 'boolean': bool, object} }, end: {number, date, string, moment: moment$1$1}, format: { minorLabels: { millisecond: {string,'undefined': 'undefined'}, second: {string,'undefined': 'undefined'}, minute: {string,'undefined': 'undefined'}, hour: {string,'undefined': 'undefined'}, weekday: {string,'undefined': 'undefined'}, day: {string,'undefined': 'undefined'}, week: {string,'undefined': 'undefined'}, month: {string,'undefined': 'undefined'}, year: {string,'undefined': 'undefined'}, __type__: {object, 'function': 'function'} }, majorLabels: { millisecond: {string,'undefined': 'undefined'}, second: {string,'undefined': 'undefined'}, minute: {string,'undefined': 'undefined'}, hour: {string,'undefined': 'undefined'}, weekday: {string,'undefined': 'undefined'}, day: {string,'undefined': 'undefined'}, week: {string,'undefined': 'undefined'}, month: {string,'undefined': 'undefined'}, year: {string,'undefined': 'undefined'}, __type__: {object, 'function': 'function'} }, __type__: {object} }, moment: {'function': 'function'}, groupHeightMode: {string}, groupOrder: {string, 'function': 'function'}, groupEditable: { add: { 'boolean': bool, 'undefined': 'undefined'}, remove: { 'boolean': bool, 'undefined': 'undefined'}, order: { 'boolean': bool, 'undefined': 'undefined'}, __type__: { 'boolean': bool, object} }, groupOrderSwap: {'function': 'function'}, height: {string, number}, hiddenDates: { start: {date, number, string, moment: moment$1$1}, end: {date, number, string, moment: moment$1$1}, repeat: {string}, __type__: {object, array} }, itemsAlwaysDraggable: { item: { 'boolean': bool, 'undefined': 'undefined'}, range: { 'boolean': bool, 'undefined': 'undefined'}, __type__: { 'boolean': bool, object} }, limitSize: {'boolean': bool}, locale:{string}, locales:{ __any__: {any}, __type__: {object} }, longSelectPressTime: {number}, margin: { axis: {number}, item: { horizontal: {number,'undefined': 'undefined'}, vertical: {number,'undefined': 'undefined'}, __type__: {object,number} }, __type__: {object,number} }, max: {date, number, string, moment: moment$1$1}, maxHeight: {number, string}, maxMinorChars: {number}, min: {date, number, string, moment: moment$1$1}, minHeight: {number, string}, moveable: { 'boolean': bool}, multiselect: { 'boolean': bool}, multiselectPerGroup: { 'boolean': bool}, onAdd: {'function': 'function'}, onDropObjectOnItem: {'function': 'function'}, onUpdate: {'function': 'function'}, onMove: {'function': 'function'}, onMoving: {'function': 'function'}, onRemove: {'function': 'function'}, onAddGroup: {'function': 'function'}, onMoveGroup: {'function': 'function'}, onRemoveGroup: {'function': 'function'}, onInitialDrawComplete: {'function': 'function'}, order: {'function': 'function'}, orientation: { axis: {string,'undefined': 'undefined'}, item: {string,'undefined': 'undefined'}, __type__: {string, object} }, selectable: { 'boolean': bool}, sequentialSelection: { 'boolean': bool }, showCurrentTime: { 'boolean': bool}, showMajorLabels: { 'boolean': bool}, showMinorLabels: { 'boolean': bool}, showWeekScale: { 'boolean': bool}, stack: { 'boolean': bool}, stackSubgroups: { 'boolean': bool}, cluster: { maxItems: {'number': number, 'undefined': 'undefined'}, titleTemplate: {'string': string, 'undefined': 'undefined'}, clusterCriteria: { 'function': 'function', 'undefined': 'undefined'}, showStipes: {'boolean': bool, 'undefined': 'undefined'}, fitOnDoubleClick: {'boolean': bool, 'undefined': 'undefined'}, __type__: {'boolean': bool, object} }, snap: {'function': 'function', 'null': 'null'}, start: {date, number, string, moment: moment$1$1}, template: {'function': 'function'}, loadingScreenTemplate: {'function': 'function'}, groupTemplate: {'function': 'function'}, visibleFrameTemplate: {string, 'function': 'function'}, showTooltips: { 'boolean': bool}, tooltip: { followMouse: { 'boolean': bool }, overflowMethod: { 'string': ['cap', 'flip', 'none'] }, delay: {number}, template: {'function': 'function'}, __type__: {object} }, tooltipOnItemUpdateTime: { template: {'function': 'function'}, __type__: { 'boolean': bool, object} }, timeAxis: { scale: {string,'undefined': 'undefined'}, step: {number,'undefined': 'undefined'}, __type__: {object} }, type: {string}, width: {string, number}, preferZoom: { 'boolean': bool}, zoomable: { 'boolean': bool}, zoomKey: {string: ['ctrlKey', 'altKey', 'shiftKey', 'metaKey', '']}, zoomFriction: {number}, zoomMax: {number}, zoomMin: {number}, __type__: {object} }; let configureOptions = { global: { align: ['center', 'left', 'right'], alignCurrentTime: ['none', 'year', 'month', 'quarter', 'week', 'isoWeek', 'day', 'date', 'hour', 'minute', 'second'], direction: false, autoResize: true, clickToUse: false, // dataAttributes: ['all'], // FIXME: can be 'all' or string[] editable: { add: false, remove: false, updateGroup: false, updateTime: false }, end: '', format: { minorLabels: { millisecond:'SSS', second: 's', minute: 'HH:mm', hour: 'HH:mm', weekday: 'ddd D', day: 'D', week: 'w', month: 'MMM', year: 'YYYY' }, majorLabels: { millisecond:'HH:mm:ss', second: 'D MMMM HH:mm', minute: 'ddd D MMMM', hour: 'ddd D MMMM', weekday: 'MMMM YYYY', day: 'MMMM YYYY', week: 'MMMM YYYY', month: 'YYYY', year: '' } }, groupHeightMode: ['auto', 'fixed', 'fitItems'], //groupOrder: {string, 'function': 'function'}, groupsDraggable: false, height: '', //hiddenDates: {object, array}, locale: '', longSelectPressTime: 251, margin: { axis: [20, 0, 100, 1], item: { horizontal: [10, 0, 100, 1], vertical: [10, 0, 100, 1] } }, max: '', maxHeight: '', maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable: false, multiselect: false, multiselectPerGroup: false, //onAdd: {'function': 'function'}, //onUpdate: {'function': 'function'}, //onMove: {'function': 'function'}, //onMoving: {'function': 'function'}, //onRename: {'function': 'function'}, //order: {'function': 'function'}, orientation: { axis: ['both', 'bottom', 'top'], item: ['bottom', 'top'] }, preferZoom: false, selectable: true, showCurrentTime: false, showMajorLabels: true, showMinorLabels: true, stack: true, stackSubgroups: true, cluster: false, //snap: {'function': 'function', nada}, start: '', //template: {'function': 'function'}, //timeAxis: { // scale: ['millisecond', 'second', 'minute', 'hour', 'weekday', 'day', 'week', 'month', 'year'], // step: [1, 1, 10, 1] //}, showTooltips: true, tooltip: { followMouse: false, overflowMethod: 'flip', delay: [500, 0, 99999, 100], }, tooltipOnItemUpdateTime: false, type: ['box', 'point', 'range', 'background'], width: '100%', zoomable: true, zoomKey: ['ctrlKey', 'altKey', 'shiftKey', 'metaKey', ''], zoomMax: [315360000000000, 10, 315360000000000, 1], zoomMin: [10, 10, 315360000000000, 1] } }; var htmlColors$1 = {black: '#000000', navy: '#000080', darkblue: '#00008B', mediumblue: '#0000CD', blue: '#0000FF', darkgreen: '#006400', green: '#008000', teal: '#008080', darkcyan: '#008B8B', deepskyblue: '#00BFFF', darkturquoise: '#00CED1', mediumspringgreen: '#00FA9A', lime: '#00FF00', springgreen: '#00FF7F', aqua: '#00FFFF', cyan: '#00FFFF', midnightblue: '#191970', dodgerblue: '#1E90FF', lightseagreen: '#20B2AA', forestgreen: '#228B22', seagreen: '#2E8B57', darkslategray: '#2F4F4F', limegreen: '#32CD32', mediumseagreen: '#3CB371', turquoise: '#40E0D0', royalblue: '#4169E1', steelblue: '#4682B4', darkslateblue: '#483D8B', mediumturquoise: '#48D1CC', indigo: '#4B0082', darkolivegreen: '#556B2F', cadetblue: '#5F9EA0', cornflowerblue: '#6495ED', mediumaquamarine: '#66CDAA', dimgray: '#696969', slateblue: '#6A5ACD', olivedrab: '#6B8E23', slategray: '#708090', lightslategray: '#778899', mediumslateblue: '#7B68EE', lawngreen: '#7CFC00', chartreuse: '#7FFF00', aquamarine: '#7FFFD4', maroon: '#800000', purple: '#800080', olive: '#808000', gray: '#808080', skyblue: '#87CEEB', lightskyblue: '#87CEFA', blueviolet: '#8A2BE2', darkred: '#8B0000', darkmagenta: '#8B008B', saddlebrown: '#8B4513', darkseagreen: '#8FBC8F', lightgreen: '#90EE90', mediumpurple: '#9370D8', darkviolet: '#9400D3', palegreen: '#98FB98', darkorchid: '#9932CC', yellowgreen: '#9ACD32', sienna: '#A0522D', brown: '#A52A2A', darkgray: '#A9A9A9', lightblue: '#ADD8E6', greenyellow: '#ADFF2F', paleturquoise: '#AFEEEE', lightsteelblue: '#B0C4DE', powderblue: '#B0E0E6', firebrick: '#B22222', darkgoldenrod: '#B8860B', mediumorchid: '#BA55D3', rosybrown: '#BC8F8F', darkkhaki: '#BDB76B', silver: '#C0C0C0', mediumvioletred: '#C71585', indianred: '#CD5C5C', peru: '#CD853F', chocolate: '#D2691E', tan: '#D2B48C', lightgrey: '#D3D3D3', palevioletred: '#D87093', thistle: '#D8BFD8', orchid: '#DA70D6', goldenrod: '#DAA520', crimson: '#DC143C', gainsboro: '#DCDCDC', plum: '#DDA0DD', burlywood: '#DEB887', lightcyan: '#E0FFFF', lavender: '#E6E6FA', darksalmon: '#E9967A', violet: '#EE82EE', palegoldenrod: '#EEE8AA', lightcoral: '#F08080', khaki: '#F0E68C', aliceblue: '#F0F8FF', honeydew: '#F0FFF0', azure: '#F0FFFF', sandybrown: '#F4A460', wheat: '#F5DEB3', beige: '#F5F5DC', whitesmoke: '#F5F5F5', mintcream: '#F5FFFA', ghostwhite: '#F8F8FF', salmon: '#FA8072', antiquewhite: '#FAEBD7', linen: '#FAF0E6', lightgoldenrodyellow: '#FAFAD2', oldlace: '#FDF5E6', red: '#FF0000', fuchsia: '#FF00FF', magenta: '#FF00FF', deeppink: '#FF1493', orangered: '#FF4500', tomato: '#FF6347', hotpink: '#FF69B4', coral: '#FF7F50', darkorange: '#FF8C00', lightsalmon: '#FFA07A', orange: '#FFA500', lightpink: '#FFB6C1', pink: '#FFC0CB', gold: '#FFD700', peachpuff: '#FFDAB9', navajowhite: '#FFDEAD', moccasin: '#FFE4B5', bisque: '#FFE4C4', mistyrose: '#FFE4E1', blanchedalmond: '#FFEBCD', papayawhip: '#FFEFD5', lavenderblush: '#FFF0F5', seashell: '#FFF5EE', cornsilk: '#FFF8DC', lemonchiffon: '#FFFACD', floralwhite: '#FFFAF0', snow: '#FFFAFA', yellow: '#FFFF00', lightyellow: '#FFFFE0', ivory: '#FFFFF0', white: '#FFFFFF'}; /** * @param {number} [pixelRatio=1] */ class ColorPicker$2 { /** * @param {number} [pixelRatio=1] */ constructor(pixelRatio = 1) { this.pixelRatio = pixelRatio; this.generated = false; this.centerCoordinates = {x:289/2, y:289/2}; this.r = 289 * 0.49; this.color = {r:255,g:255,b:255,a:1.0}; this.hueCircle = undefined; this.initialColor = {r:255,g:255,b:255,a:1.0}; this.previousColor= undefined; this.applied = false; // bound by this.updateCallback = () => {}; this.closeCallback = () => {}; // create all DOM elements this._create(); } /** * this inserts the colorPicker into a div from the DOM * @param {Element} container */ insertTo(container) { if (this.hammer !== undefined) { this.hammer.destroy(); this.hammer = undefined; } this.container = container; this.container.appendChild(this.frame); this._bindHammer(); this._setSize(); } /** * the callback is executed on apply and save. Bind it to the application * @param {function} callback */ setUpdateCallback(callback) { if (typeof callback === 'function') { this.updateCallback = callback; } else { throw new Error("Function attempted to set as colorPicker update callback is not a function."); } } /** * the callback is executed on apply and save. Bind it to the application * @param {function} callback */ setCloseCallback(callback) { if (typeof callback === 'function') { this.closeCallback = callback; } else { throw new Error("Function attempted to set as colorPicker closing callback is not a function."); } } /** * * @param {string} color * @returns {String} * @private */ _isColorString(color) { if (typeof color === 'string') { return htmlColors$1[color]; } } /** * Set the color of the colorPicker * Supported formats: * 'red' --> HTML color string * '#ffffff' --> hex string * 'rgb(255,255,255)' --> rgb string * 'rgba(255,255,255,1.0)' --> rgba string * {r:255,g:255,b:255} --> rgb object * {r:255,g:255,b:255,a:1.0} --> rgba object * @param {string|Object} color * @param {boolean} [setInitial=true] */ setColor(color, setInitial = true) { if (color === 'none') { return; } let rgba; // if a html color shorthand is used, convert to hex var htmlColor = this._isColorString(color); if (htmlColor !== undefined) { color = htmlColor; } // check format if (util$3.isString(color) === true) { if (util$3.isValidRGB(color) === true) { let rgbaArray = color.substr(4).substr(0, color.length - 5).split(','); rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:1.0}; } else if (util$3.isValidRGBA(color) === true) { let rgbaArray = color.substr(5).substr(0, color.length - 6).split(','); rgba = {r:rgbaArray[0], g:rgbaArray[1], b:rgbaArray[2], a:rgbaArray[3]}; } else if (util$3.isValidHex(color) === true) { let rgbObj = util$3.hexToRGB(color); rgba = {r:rgbObj.r, g:rgbObj.g, b:rgbObj.b, a:1.0}; } } else { if (color instanceof Object) { if (color.r !== undefined && color.g !== undefined && color.b !== undefined) { let alpha = color.a !== undefined ? color.a : '1.0'; rgba = {r:color.r, g:color.g, b:color.b, a:alpha}; } } } // set color if (rgba === undefined) { throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: " + JSON.stringify(color)); } else { this._setColor(rgba, setInitial); } } /** * this shows the color picker. * The hue circle is constructed once and stored. */ show() { if (this.closeCallback !== undefined) { this.closeCallback(); this.closeCallback = undefined; } this.applied = false; this.frame.style.display = 'block'; this._generateHueCircle(); } // ------------------------------------------ PRIVATE ----------------------------- // /** * Hide the picker. Is called by the cancel button. * Optional boolean to store the previous color for easy access later on. * @param {boolean} [storePrevious=true] * @private */ _hide(storePrevious = true) { // store the previous color for next time; if (storePrevious === true) { this.previousColor = util$3.extend({}, this.color); } if (this.applied === true) { this.updateCallback(this.initialColor); } this.frame.style.display = 'none'; // call the closing callback, restoring the onclick method. // this is in a setTimeout because it will trigger the show again before the click is done. setTimeout(() => { if (this.closeCallback !== undefined) { this.closeCallback(); this.closeCallback = undefined; } },0); } /** * bound to the save button. Saves and hides. * @private */ _save() { this.updateCallback(this.color); this.applied = false; this._hide(); } /** * Bound to apply button. Saves but does not close. Is undone by the cancel button. * @private */ _apply() { this.applied = true; this.updateCallback(this.color); this._updatePicker(this.color); } /** * load the color from the previous session. * @private */ _loadLast() { if (this.previousColor !== undefined) { this.setColor(this.previousColor, false); } else { alert("There is no last color to load..."); } } /** * set the color, place the picker * @param {Object} rgba * @param {boolean} [setInitial=true] * @private */ _setColor(rgba, setInitial = true) { // store the initial color if (setInitial === true) { this.initialColor = util$3.extend({}, rgba); } this.color = rgba; let hsv = util$3.RGBToHSV(rgba.r, rgba.g, rgba.b); let angleConvert = 2 * Math.PI; let radius = this.r * hsv.s; let x = this.centerCoordinates.x + radius * Math.sin(angleConvert * hsv.h); let y = this.centerCoordinates.y + radius * Math.cos(angleConvert * hsv.h); this.colorPickerSelector.style.left = x - 0.5 * this.colorPickerSelector.clientWidth + 'px'; this.colorPickerSelector.style.top = y - 0.5 * this.colorPickerSelector.clientHeight + 'px'; this._updatePicker(rgba); } /** * bound to opacity control * @param {number} value * @private */ _setOpacity(value) { this.color.a = value / 100; this._updatePicker(this.color); } /** * bound to brightness control * @param {number} value * @private */ _setBrightness(value) { let hsv = util$3.RGBToHSV(this.color.r, this.color.g, this.color.b); hsv.v = value / 100; let rgba = util$3.HSVToRGB(hsv.h, hsv.s, hsv.v); rgba['a'] = this.color.a; this.color = rgba; this._updatePicker(); } /** * update the color picker. A black circle overlays the hue circle to mimic the brightness decreasing. * @param {Object} rgba * @private */ _updatePicker(rgba = this.color) { let hsv = util$3.RGBToHSV(rgba.r, rgba.g, rgba.b); let ctx = this.colorPickerCanvas.getContext('2d'); if (this.pixelRation === undefined) { this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); } ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); // clear the canvas let w = this.colorPickerCanvas.clientWidth; let h = this.colorPickerCanvas.clientHeight; ctx.clearRect(0, 0, w, h); ctx.putImageData(this.hueCircle, 0,0); ctx.fillStyle = 'rgba(0,0,0,' + (1- hsv.v) + ')'; ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r); ctx.fill(); this.brightnessRange.value = 100 * hsv.v; this.opacityRange.value = 100 * rgba.a; this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')'; this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')'; } /** * used by create to set the size of the canvas. * @private */ _setSize() { this.colorPickerCanvas.style.width = '100%'; this.colorPickerCanvas.style.height = '100%'; this.colorPickerCanvas.width = 289 * this.pixelRatio; this.colorPickerCanvas.height = 289 * this.pixelRatio; } /** * create all dom elements * TODO: cleanup, lots of similar dom elements * @private */ _create() { this.frame = document.createElement('div'); this.frame.className = 'vis-color-picker'; this.colorPickerDiv = document.createElement('div'); this.colorPickerSelector = document.createElement('div'); this.colorPickerSelector.className = 'vis-selector'; this.colorPickerDiv.appendChild(this.colorPickerSelector); this.colorPickerCanvas = document.createElement('canvas'); this.colorPickerDiv.appendChild(this.colorPickerCanvas); if (!this.colorPickerCanvas.getContext) { let noCanvas = document.createElement( 'DIV' ); noCanvas.style.color = 'red'; noCanvas.style.fontWeight = 'bold' ; noCanvas.style.padding = '10px'; noCanvas.innerHTML = 'Error: your browser does not support HTML canvas'; this.colorPickerCanvas.appendChild(noCanvas); } else { let ctx = this.colorPickerCanvas.getContext("2d"); this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); } this.colorPickerDiv.className = 'vis-color'; this.opacityDiv = document.createElement('div'); this.opacityDiv.className = 'vis-opacity'; this.brightnessDiv = document.createElement('div'); this.brightnessDiv.className = 'vis-brightness'; this.arrowDiv = document.createElement('div'); this.arrowDiv.className = 'vis-arrow'; this.opacityRange = document.createElement('input'); try { this.opacityRange.type = 'range'; // Not supported on IE9 this.opacityRange.min = '0'; this.opacityRange.max = '100'; } // TODO: Add some error handling and remove this lint exception catch (err) {} // eslint-disable-line no-empty this.opacityRange.value = '100'; this.opacityRange.className = 'vis-range'; this.brightnessRange = document.createElement('input'); try { this.brightnessRange.type = 'range'; // Not supported on IE9 this.brightnessRange.min = '0'; this.brightnessRange.max = '100'; } // TODO: Add some error handling and remove this lint exception catch (err) {} // eslint-disable-line no-empty this.brightnessRange.value = '100'; this.brightnessRange.className = 'vis-range'; this.opacityDiv.appendChild(this.opacityRange); this.brightnessDiv.appendChild(this.brightnessRange); var me = this; this.opacityRange.onchange = function () {me._setOpacity(this.value);}; this.opacityRange.oninput = function () {me._setOpacity(this.value);}; this.brightnessRange.onchange = function () {me._setBrightness(this.value);}; this.brightnessRange.oninput = function () {me._setBrightness(this.value);}; this.brightnessLabel = document.createElement("div"); this.brightnessLabel.className = "vis-label vis-brightness"; this.brightnessLabel.innerHTML = 'brightness:'; this.opacityLabel = document.createElement("div"); this.opacityLabel.className = "vis-label vis-opacity"; this.opacityLabel.innerHTML = 'opacity:'; this.newColorDiv = document.createElement("div"); this.newColorDiv.className = "vis-new-color"; this.newColorDiv.innerHTML = 'new'; this.initialColorDiv = document.createElement("div"); this.initialColorDiv.className = "vis-initial-color"; this.initialColorDiv.innerHTML = 'initial'; this.cancelButton = document.createElement("div"); this.cancelButton.className = "vis-button vis-cancel"; this.cancelButton.innerHTML = 'cancel'; this.cancelButton.onclick = this._hide.bind(this, false); this.applyButton = document.createElement("div"); this.applyButton.className = "vis-button vis-apply"; this.applyButton.innerHTML = 'apply'; this.applyButton.onclick = this._apply.bind(this); this.saveButton = document.createElement("div"); this.saveButton.className = "vis-button vis-save"; this.saveButton.innerHTML = 'save'; this.saveButton.onclick = this._save.bind(this); this.loadButton = document.createElement("div"); this.loadButton.className = "vis-button vis-load"; this.loadButton.innerHTML = 'load last'; this.loadButton.onclick = this._loadLast.bind(this); this.frame.appendChild(this.colorPickerDiv); this.frame.appendChild(this.arrowDiv); this.frame.appendChild(this.brightnessLabel); this.frame.appendChild(this.brightnessDiv); this.frame.appendChild(this.opacityLabel); this.frame.appendChild(this.opacityDiv); this.frame.appendChild(this.newColorDiv); this.frame.appendChild(this.initialColorDiv); this.frame.appendChild(this.cancelButton); this.frame.appendChild(this.applyButton); this.frame.appendChild(this.saveButton); this.frame.appendChild(this.loadButton); } /** * bind hammer to the color picker * @private */ _bindHammer() { this.drag = {}; this.pinch = {}; this.hammer = new Hammer$2(this.colorPickerCanvas); this.hammer.get('pinch').set({enable: true}); onTouch(this.hammer, (event) => {this._moveSelector(event);}); this.hammer.on('tap', (event) => {this._moveSelector(event);}); this.hammer.on('panstart', (event) => {this._moveSelector(event);}); this.hammer.on('panmove', (event) => {this._moveSelector(event);}); this.hammer.on('panend', (event) => {this._moveSelector(event);}); } /** * generate the hue circle. This is relatively heavy (200ms) and is done only once on the first time it is shown. * @private */ _generateHueCircle() { if (this.generated === false) { let ctx = this.colorPickerCanvas.getContext('2d'); if (this.pixelRation === undefined) { this.pixelRatio = (window.devicePixelRatio || 1) / (ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1); } ctx.setTransform(this.pixelRatio, 0, 0, this.pixelRatio, 0, 0); // clear the canvas let w = this.colorPickerCanvas.clientWidth; let h = this.colorPickerCanvas.clientHeight; ctx.clearRect(0, 0, w, h); // draw hue circle let x, y, hue, sat; this.centerCoordinates = {x: w * 0.5, y: h * 0.5}; this.r = 0.49 * w; let angleConvert = (2 * Math.PI) / 360; let hfac = 1 / 360; let sfac = 1 / this.r; let rgb; for (hue = 0; hue < 360; hue++) { for (sat = 0; sat < this.r; sat++) { x = this.centerCoordinates.x + sat * Math.sin(angleConvert * hue); y = this.centerCoordinates.y + sat * Math.cos(angleConvert * hue); rgb = util$3.HSVToRGB(hue * hfac, sat * sfac, 1); ctx.fillStyle = 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')'; ctx.fillRect(x - 0.5, y - 0.5, 2, 2); } } ctx.strokeStyle = 'rgba(0,0,0,1)'; ctx.circle(this.centerCoordinates.x, this.centerCoordinates.y, this.r); ctx.stroke(); this.hueCircle = ctx.getImageData(0,0,w,h); } this.generated = true; } /** * move the selector. This is called by hammer functions. * * @param {Event} event The event * @private */ _moveSelector(event) { let rect = this.colorPickerDiv.getBoundingClientRect(); let left = event.center.x - rect.left; let top = event.center.y - rect.top; let centerY = 0.5 * this.colorPickerDiv.clientHeight; let centerX = 0.5 * this.colorPickerDiv.clientWidth; let x = left - centerX; let y = top - centerY; let angle = Math.atan2(x,y); let radius = 0.98 * Math.min(Math.sqrt(x * x + y * y), centerX); let newTop = Math.cos(angle) * radius + centerY; let newLeft = Math.sin(angle) * radius + centerX; this.colorPickerSelector.style.top = newTop - 0.5 * this.colorPickerSelector.clientHeight + 'px'; this.colorPickerSelector.style.left = newLeft - 0.5 * this.colorPickerSelector.clientWidth + 'px'; // set color let h = angle / (2 * Math.PI); h = h < 0 ? h + 1 : h; let s = radius / this.r; let hsv = util$3.RGBToHSV(this.color.r, this.color.g, this.color.b); hsv.h = h; hsv.s = s; let rgba = util$3.HSVToRGB(hsv.h, hsv.s, hsv.v); rgba['a'] = this.color.a; this.color = rgba; // update previews this.initialColorDiv.style.backgroundColor = 'rgba(' + this.initialColor.r + ',' + this.initialColor.g + ',' + this.initialColor.b + ',' + this.initialColor.a + ')'; this.newColorDiv.style.backgroundColor = 'rgba(' + this.color.r + ',' + this.color.g + ',' + this.color.b + ',' + this.color.a + ')'; } } /** * The way this works is for all properties of this.possible options, you can supply the property name in any form to list the options. * Boolean options are recognised as Boolean * Number options should be written as array: [default value, min value, max value, stepsize] * Colors should be written as array: ['color', '#ffffff'] * Strings with should be written as array: [option1, option2, option3, ..] * * The options are matched with their counterparts in each of the modules and the values used in the configuration are */ class Configurator$2 { /** * @param {Object} parentModule | the location where parentModule.setOptions() can be called * @param {Object} defaultContainer | the default container of the module * @param {Object} configureOptions | the fully configured and predefined options set found in allOptions.js * @param {number} pixelRatio | canvas pixel ratio */ constructor(parentModule, defaultContainer, configureOptions, pixelRatio = 1) { this.parent = parentModule; this.changedOptions = []; this.container = defaultContainer; this.allowCreation = false; this.options = {}; this.initialized = false; this.popupCounter = 0; this.defaultOptions = { enabled: false, filter: true, container: undefined, showButton: true }; util$3.extend(this.options, this.defaultOptions); this.configureOptions = configureOptions; this.moduleOptions = {}; this.domElements = []; this.popupDiv = {}; this.popupLimit = 5; this.popupHistory = {}; this.colorPicker = new ColorPicker$2(pixelRatio); this.wrapper = undefined; } /** * refresh all options. * Because all modules parse their options by themselves, we just use their options. We copy them here. * * @param {Object} options */ setOptions(options) { if (options !== undefined) { // reset the popup history because the indices may have been changed. this.popupHistory = {}; this._removePopup(); let enabled = true; if (typeof options === 'string') { this.options.filter = options; } else if (Array.isArray(options)) { this.options.filter = options.join(); } else if (typeof options === 'object') { if (options == null) { throw new TypeError('options cannot be null'); } if (options.container !== undefined) { this.options.container = options.container; } if (options.filter !== undefined) { this.options.filter = options.filter; } if (options.showButton !== undefined) { this.options.showButton = options.showButton; } if (options.enabled !== undefined) { enabled = options.enabled; } } else if (typeof options === 'boolean') { this.options.filter = true; enabled = options; } else if (typeof options === 'function') { this.options.filter = options; enabled = true; } if (this.options.filter === false) { enabled = false; } this.options.enabled = enabled; } this._clean(); } /** * * @param {Object} moduleOptions */ setModuleOptions(moduleOptions) { this.moduleOptions = moduleOptions; if (this.options.enabled === true) { this._clean(); if (this.options.container !== undefined) { this.container = this.options.container; } this._create(); } } /** * Create all DOM elements * @private */ _create() { this._clean(); this.changedOptions = []; let filter = this.options.filter; let counter = 0; let show = false; for (let option in this.configureOptions) { if (this.configureOptions.hasOwnProperty(option)) { this.allowCreation = false; show = false; if (typeof filter === 'function') { show = filter(option,[]); show = show || this._handleObject(this.configureOptions[option], [option], true); } else if (filter === true || filter.indexOf(option) !== -1) { show = true; } if (show !== false) { this.allowCreation = true; // linebreak between categories if (counter > 0) { this._makeItem([]); } // a header for the category this._makeHeader(option); // get the sub options this._handleObject(this.configureOptions[option], [option]); } counter++; } } this._makeButton(); this._push(); //~ this.colorPicker.insertTo(this.container); } /** * draw all DOM elements on the screen * @private */ _push() { this.wrapper = document.createElement('div'); this.wrapper.className = 'vis-configuration-wrapper'; this.container.appendChild(this.wrapper); for (var i = 0; i < this.domElements.length; i++) { this.wrapper.appendChild(this.domElements[i]); } this._showPopupIfNeeded(); } /** * delete all DOM elements * @private */ _clean() { for (var i = 0; i < this.domElements.length; i++) { this.wrapper.removeChild(this.domElements[i]); } if (this.wrapper !== undefined) { this.container.removeChild(this.wrapper); this.wrapper = undefined; } this.domElements = []; this._removePopup(); } /** * get the value from the actualOptions if it exists * @param {array} path | where to look for the actual option * @returns {*} * @private */ _getValue(path) { let base = this.moduleOptions; for (let i = 0; i < path.length; i++) { if (base[path[i]] !== undefined) { base = base[path[i]]; } else { base = undefined; break; } } return base; } /** * all option elements are wrapped in an item * @param {Array} path | where to look for the actual option * @param {Array.<Element>} domElements * @returns {number} * @private */ _makeItem(path, ...domElements) { if (this.allowCreation === true) { let item = document.createElement('div'); item.className = 'vis-configuration vis-config-item vis-config-s' + path.length; domElements.forEach((element) => { item.appendChild(element); }); this.domElements.push(item); return this.domElements.length; } return 0; } /** * header for major subjects * @param {string} name * @private */ _makeHeader(name) { let div = document.createElement('div'); div.className = 'vis-configuration vis-config-header'; div.innerHTML = util$3.xss(name); this._makeItem([],div); } /** * make a label, if it is an object label, it gets different styling. * @param {string} name * @param {array} path | where to look for the actual option * @param {string} objectLabel * @returns {HTMLElement} * @private */ _makeLabel(name, path, objectLabel = false) { let div = document.createElement('div'); div.className = 'vis-configuration vis-config-label vis-config-s' + path.length; if (objectLabel === true) { div.innerHTML = util$3.xss('<i><b>' + name + ':</b></i>'); } else { div.innerHTML = util$3.xss(name + ':'); } return div; } /** * make a dropdown list for multiple possible string optoins * @param {Array.<number>} arr * @param {number} value * @param {array} path | where to look for the actual option * @private */ _makeDropdown(arr, value, path) { let select = document.createElement('select'); select.className = 'vis-configuration vis-config-select'; let selectedValue = 0; if (value !== undefined) { if (arr.indexOf(value) !== -1) { selectedValue = arr.indexOf(value); } } for (let i = 0; i < arr.length; i++) { let option = document.createElement('option'); option.value = arr[i]; if (i === selectedValue) { option.selected = 'selected'; } option.innerHTML = arr[i]; select.appendChild(option); } let me = this; select.onchange = function () {me._update(this.value, path);}; let label = this._makeLabel(path[path.length-1], path); this._makeItem(path, label, select); } /** * make a range object for numeric options * @param {Array.<number>} arr * @param {number} value * @param {array} path | where to look for the actual option * @private */ _makeRange(arr, value, path) { let defaultValue = arr[0]; let min = arr[1]; let max = arr[2]; let step = arr[3]; let range = document.createElement('input'); range.className = 'vis-configuration vis-config-range'; try { range.type = 'range'; // not supported on IE9 range.min = min; range.max = max; } // TODO: Add some error handling and remove this lint exception catch (err) {} // eslint-disable-line no-empty range.step = step; // set up the popup settings in case they are needed. let popupString = ''; let popupValue = 0; if (value !== undefined) { let factor = 1.20; if (value < 0 && value * factor < min) { range.min = Math.ceil(value * factor); popupValue = range.min; popupString = 'range increased'; } else if (value / factor < min) { range.min = Math.ceil(value / factor); popupValue = range.min; popupString = 'range increased'; } if (value * factor > max && max !== 1) { range.max = Math.ceil(value * factor); popupValue = range.max; popupString = 'range increased'; } range.value = value; } else { range.value = defaultValue; } let input = document.createElement('input'); input.className = 'vis-configuration vis-config-rangeinput'; input.value = Number(range.value); var me = this; range.onchange = function () {input.value = this.value; me._update(Number(this.value), path);}; range.oninput = function () {input.value = this.value; }; let label = this._makeLabel(path[path.length-1], path); let itemIndex = this._makeItem(path, label, range, input); // if a popup is needed AND it has not been shown for this value, show it. if (popupString !== '' && this.popupHistory[itemIndex] !== popupValue) { this.popupHistory[itemIndex] = popupValue; this._setupPopup(popupString, itemIndex); } } /** * make a button object * @private */ _makeButton() { if (this.options.showButton === true) { let generateButton = document.createElement('div'); generateButton.className = 'vis-configuration vis-config-button'; generateButton.innerHTML = 'generate options'; generateButton.onclick = () => {this._printOptions();}; generateButton.onmouseover = () => {generateButton.className = 'vis-configuration vis-config-button hover';}; generateButton.onmouseout = () => {generateButton.className = 'vis-configuration vis-config-button';}; this.optionsContainer = document.createElement('div'); this.optionsContainer.className = 'vis-configuration vis-config-option-container'; this.domElements.push(this.optionsContainer); this.domElements.push(generateButton); } } /** * prepare the popup * @param {string} string * @param {number} index * @private */ _setupPopup(string, index) { if (this.initialized === true && this.allowCreation === true && this.popupCounter < this.popupLimit) { let div = document.createElement("div"); div.id = "vis-configuration-popup"; div.className = "vis-configuration-popup"; div.innerHTML = util$3.xss(string); div.onclick = () => {this._removePopup();}; this.popupCounter += 1; this.popupDiv = {html:div, index:index}; } } /** * remove the popup from the dom * @private */ _removePopup() { if (this.popupDiv.html !== undefined) { this.popupDiv.html.parentNode.removeChild(this.popupDiv.html); clearTimeout(this.popupDiv.hideTimeout); clearTimeout(this.popupDiv.deleteTimeout); this.popupDiv = {}; } } /** * Show the popup if it is needed. * @private */ _showPopupIfNeeded() { if (this.popupDiv.html !== undefined) { let correspondingElement = this.domElements[this.popupDiv.index]; let rect = correspondingElement.getBoundingClientRect(); this.popupDiv.html.style.left = rect.left + "px"; this.popupDiv.html.style.top = rect.top - 30 + "px"; // 30 is the height; document.body.appendChild(this.popupDiv.html); this.popupDiv.hideTimeout = setTimeout(() => { this.popupDiv.html.style.opacity = 0; },1500); this.popupDiv.deleteTimeout = setTimeout(() => { this._removePopup(); },1800); } } /** * make a checkbox for boolean options. * @param {number} defaultValue * @param {number} value * @param {array} path | where to look for the actual option * @private */ _makeCheckbox(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.className = 'vis-configuration vis-config-checkbox'; checkbox.checked = defaultValue; if (value !== undefined) { checkbox.checked = value; if (value !== defaultValue) { if (typeof defaultValue === 'object') { if (value !== defaultValue.enabled) { this.changedOptions.push({path:path, value:value}); } } else { this.changedOptions.push({path:path, value:value}); } } } let me = this; checkbox.onchange = function() {me._update(this.checked, path);}; let label = this._makeLabel(path[path.length-1], path); this._makeItem(path, label, checkbox); } /** * make a text input field for string options. * @param {number} defaultValue * @param {number} value * @param {array} path | where to look for the actual option * @private */ _makeTextInput(defaultValue, value, path) { var checkbox = document.createElement('input'); checkbox.type = 'text'; checkbox.className = 'vis-configuration vis-config-text'; checkbox.value = value; if (value !== defaultValue) { this.changedOptions.push({path:path, value:value}); } let me = this; checkbox.onchange = function() {me._update(this.value, path);}; let label = this._makeLabel(path[path.length-1], path); this._makeItem(path, label, checkbox); } /** * make a color field with a color picker for color fields * @param {Array.<number>} arr * @param {number} value * @param {array} path | where to look for the actual option * @private */ _makeColorField(arr, value, path) { let defaultColor = arr[1]; let div = document.createElement('div'); value = value === undefined ? defaultColor : value; if (value !== 'none') { div.className = 'vis-configuration vis-config-colorBlock'; div.style.backgroundColor = value; } else { div.className = 'vis-configuration vis-config-colorBlock none'; } value = value === undefined ? defaultColor : value; div.onclick = () => { this._showColorPicker(value,div,path); }; let label = this._makeLabel(path[path.length-1], path); this._makeItem(path,label, div); } /** * used by the color buttons to call the color picker. * @param {number} value * @param {HTMLElement} div * @param {array} path | where to look for the actual option * @private */ _showColorPicker(value, div, path) { // clear the callback from this div div.onclick = function() {}; this.colorPicker.insertTo(div); this.colorPicker.show(); this.colorPicker.setColor(value); this.colorPicker.setUpdateCallback((color) => { let colorString = 'rgba(' + color.r + ',' + color.g + ',' + color.b + ',' + color.a + ')'; div.style.backgroundColor = colorString; this._update(colorString,path); }); // on close of the colorpicker, restore the callback. this.colorPicker.setCloseCallback(() => { div.onclick = () => { this._showColorPicker(value,div,path); }; }); } /** * parse an object and draw the correct items * @param {Object} obj * @param {array} [path=[]] | where to look for the actual option * @param {boolean} [checkOnly=false] * @returns {boolean} * @private */ _handleObject(obj, path = [], checkOnly = false) { let show = false; let filter = this.options.filter; let visibleInSet = false; for (let subObj in obj) { if (obj.hasOwnProperty(subObj)) { show = true; let item = obj[subObj]; let newPath = util$3.copyAndExtendArray(path, subObj); if (typeof filter === 'function') { show = filter(subObj,path); // if needed we must go deeper into the object. if (show === false) { if (!Array.isArray(item) && typeof item !== 'string' && typeof item !== 'boolean' && item instanceof Object) { this.allowCreation = false; show = this._handleObject(item, newPath, true); this.allowCreation = checkOnly === false; } } } if (show !== false) { visibleInSet = true; let value = this._getValue(newPath); if (Array.isArray(item)) { this._handleArray(item, value, newPath); } else if (typeof item === 'string') { this._makeTextInput(item, value, newPath); } else if (typeof item === 'boolean') { this._makeCheckbox(item, value, newPath); } else if (item instanceof Object) { // collapse the physics options that are not enabled let draw = true; if (path.indexOf('physics') !== -1) { if (this.moduleOptions.physics.solver !== subObj) { draw = false; } } if (draw === true) { // initially collapse options with an disabled enabled option. if (item.enabled !== undefined) { let enabledPath = util$3.copyAndExtendArray(newPath, 'enabled'); let enabledValue = this._getValue(enabledPath); if (enabledValue === true) { let label = this._makeLabel(subObj, newPath, true); this._makeItem(newPath, label); visibleInSet = this._handleObject(item, newPath) || visibleInSet; } else { this._makeCheckbox(item, enabledValue, newPath); } } else { let label = this._makeLabel(subObj, newPath, true); this._makeItem(newPath, label); visibleInSet = this._handleObject(item, newPath) || visibleInSet; } } } else { console.error('dont know how to handle', item, subObj, newPath); } } } } return visibleInSet; } /** * handle the array type of option * @param {Array.<number>} arr * @param {number} value * @param {array} path | where to look for the actual option * @private */ _handleArray(arr, value, path) { if (typeof arr[0] === 'string' && arr[0] === 'color') { this._makeColorField(arr, value, path); if (arr[1] !== value) {this.changedOptions.push({path:path, value:value});} } else if (typeof arr[0] === 'string') { this._makeDropdown(arr, value, path); if (arr[0] !== value) {this.changedOptions.push({path:path, value:value});} } else if (typeof arr[0] === 'number') { this._makeRange(arr, value, path); if (arr[0] !== value) {this.changedOptions.push({path:path, value:Number(value)});} } } /** * called to update the network with the new settings. * @param {number} value * @param {array} path | where to look for the actual option * @private */ _update(value, path) { let options = this._constructOptions(value,path); if (this.parent.body && this.parent.body.emitter && this.parent.body.emitter.emit) { this.parent.body.emitter.emit("configChange", options); } this.initialized = true; this.parent.setOptions(options); } /** * * @param {string|Boolean} value * @param {Array.<string>} path * @param {{}} optionsObj * @returns {{}} * @private */ _constructOptions(value, path, optionsObj = {}) { let pointer = optionsObj; // when dropdown boxes can be string or boolean, we typecast it into correct types value = value === 'true' ? true : value; value = value === 'false' ? false : value; for (let i = 0; i < path.length; i++) { if (path[i] !== 'global') { if (pointer[path[i]] === undefined) { pointer[path[i]] = {}; } if (i !== path.length - 1) { pointer = pointer[path[i]]; } else { pointer[path[i]] = value; } } } return optionsObj; } /** * @private */ _printOptions() { let options = this.getOptions(); this.optionsContainer.innerHTML = '<pre>var options = ' + JSON.stringify(options, null, 2) + '</pre>'; } /** * * @returns {{}} options */ getOptions() { let options = {}; for (var i = 0; i < this.changedOptions.length; i++) { this._constructOptions(this.changedOptions[i].value, this.changedOptions[i].path, options); } return options; } } /** * Create a timeline visualization * @extends Core */ class Timeline extends Core { /** * @param {HTMLElement} container * @param {vis.DataSet | vis.DataView | Array} [items] * @param {vis.DataSet | vis.DataView | Array} [groups] * @param {Object} [options] See Timeline.setOptions for the available options. * @constructor Timeline */ constructor(container, items, groups, options) { super(); this.initTime = new Date(); this.itemsDone = false; if (!(this instanceof Timeline)) { throw new SyntaxError('Constructor must be called with the new operator'); } // if the third element is options, the forth is groups (optionally); if (!(Array.isArray(groups) || isDataViewLike("id", groups)) && groups instanceof Object) { const forthArgument = options; options = groups; groups = forthArgument; } // TODO: REMOVE THIS in the next MAJOR release // see https://github.com/almende/vis/issues/2511 if (options && options.throttleRedraw) { console.warn("Timeline option \"throttleRedraw\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release."); } const me = this; this.defaultOptions = { autoResize: true, longSelectPressTime: 251, orientation: { axis: 'bottom', // axis orientation: 'bottom', 'top', or 'both' item: 'bottom' // not relevant }, moment: moment$1, }; this.options = util$3.deepExtend({}, this.defaultOptions); // Create the DOM, props, and emitter this._create(container); if (!options || (options && typeof options.rtl == "undefined")) { this.dom.root.style.visibility = 'hidden'; let directionFromDom; let domNode = this.dom.root; while (!directionFromDom && domNode) { directionFromDom = window.getComputedStyle(domNode, null).direction; domNode = domNode.parentElement; } this.options.rtl = (directionFromDom && (directionFromDom.toLowerCase() == "rtl")); } else { this.options.rtl = options.rtl; } if (options) { if (options.rollingMode) { this.options.rollingMode = options.rollingMode; } if (options.onInitialDrawComplete) { this.options.onInitialDrawComplete = options.onInitialDrawComplete; } if (options.onTimeout) { this.options.onTimeout = options.onTimeout; } if (options.loadingScreenTemplate) { this.options.loadingScreenTemplate = options.loadingScreenTemplate; } } // Prepare loading screen const loadingScreenFragment = document.createElement('div'); if (this.options.loadingScreenTemplate) { const templateFunction = this.options.loadingScreenTemplate.bind(this); const loadingScreen = templateFunction(this.dom.loadingScreen); if ((loadingScreen instanceof Object) && !(loadingScreen instanceof Element)) { templateFunction(loadingScreenFragment); } else { if (loadingScreen instanceof Element) { loadingScreenFragment.innerHTML = ''; loadingScreenFragment.appendChild(loadingScreen); } else if (loadingScreen != undefined) { loadingScreenFragment.innerHTML = util$3.xss(loadingScreen); } } } this.dom.loadingScreen.appendChild(loadingScreenFragment); // all components listed here will be repainted automatically this.components = []; this.body = { dom: this.dom, domProps: this.props, emitter: { on: this.on.bind(this), off: this.off.bind(this), emit: this.emit.bind(this) }, hiddenDates: [], util: { getScale() { return me.timeAxis.step.scale; }, getStep() { return me.timeAxis.step.step; }, toScreen: me._toScreen.bind(me), toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width toTime: me._toTime.bind(me), toGlobalTime : me._toGlobalTime.bind(me) } }; // range this.range = new Range(this.body, this.options); this.components.push(this.range); this.body.range = this.range; // time axis this.timeAxis = new TimeAxis(this.body, this.options); this.timeAxis2 = null; // used in case of orientation option 'both' this.components.push(this.timeAxis); // current time bar this.currentTime = new CurrentTime(this.body, this.options); this.components.push(this.currentTime); // item set this.itemSet = new ItemSet(this.body, this.options); this.components.push(this.itemSet); this.itemsData = null; // DataSet this.groupsData = null; // DataSet function emit(eventName, event) { if (!me.hasListeners(eventName)) { return; } me.emit(eventName, me.getEventProperties(event)); } this.dom.root.onclick = event => { emit('click', event); }; this.dom.root.ondblclick = event => { emit('doubleClick', event); }; this.dom.root.oncontextmenu = event => { emit('contextmenu', event); }; this.dom.root.onmouseover = event => { emit('mouseOver', event); }; if(window.PointerEvent) { this.dom.root.onpointerdown = event => { emit('mouseDown', event); }; this.dom.root.onpointermove = event => { emit('mouseMove', event); }; this.dom.root.onpointerup = event => { emit('mouseUp', event); }; } else { this.dom.root.onmousemove = event => { emit('mouseMove', event); }; this.dom.root.onmousedown = event => { emit('mouseDown', event); }; this.dom.root.onmouseup = event => { emit('mouseUp', event); }; } //Single time autoscale/fit this.initialFitDone = false; this.on('changed', () => { if (me.itemsData == null) return; if (!me.initialFitDone && !me.options.rollingMode) { me.initialFitDone = true; if (me.options.start != undefined || me.options.end != undefined) { if (me.options.start == undefined || me.options.end == undefined) { var range = me.getItemRange(); } const start = me.options.start != undefined ? me.options.start : range.min; const end = me.options.end != undefined ? me.options.end : range.max; me.setWindow(start, end, {animation: false}); } else { me.fit({animation: false}); } } if (!me.initialDrawDone && (me.initialRangeChangeDone || (!me.options.start && !me.options.end) || me.options.rollingMode)) { me.initialDrawDone = true; me.itemSet.initialDrawDone = true; me.dom.root.style.visibility = 'visible'; me.dom.loadingScreen.parentNode.removeChild(me.dom.loadingScreen); if (me.options.onInitialDrawComplete) { setTimeout(() => { return me.options.onInitialDrawComplete(); }, 0); } } }); this.on('destroyTimeline', () => { me.destroy(); }); // apply options if (options) { this.setOptions(options); } this.body.emitter.on('fit', (args) => { this._onFit(args); this.redraw(); }); // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! if (groups) { this.setGroups(groups); } // create itemset if (items) { this.setItems(items); } // draw for the first time this._redraw(); } /** * Load a configurator * @return {Object} * @private */ _createConfigurator() { return new Configurator$2(this, this.dom.container, configureOptions); } /** * Force a redraw. The size of all items will be recalculated. * Can be useful to manually redraw when option autoResize=false and the window * has been resized, or when the items CSS has been changed. * * Note: this function will be overridden on construction with a trottled version */ redraw() { this.itemSet && this.itemSet.markDirty({refreshItems: true}); this._redraw(); } /** * Remove an item from the group * @param {object} options */ setOptions(options) { // validate options let errorFound = Validator$2.validate(options, allOptions$1$1); if (errorFound === true) { console.log('%cErrors have been found in the supplied options object.', printStyle); } Core.prototype.setOptions.call(this, options); if ('type' in options) { if (options.type !== this.options.type) { this.options.type = options.type; // force recreation of all items const itemsData = this.itemsData; if (itemsData) { const selection = this.getSelection(); this.setItems(null); // remove all this.setItems(itemsData.rawDS); // add all this.setSelection(selection); // restore selection } } } } /** * Set items * @param {vis.DataSet | Array | null} items */ setItems(items) { this.itemsDone = false; // convert to type DataSet when needed let newDataSet; if (!items) { newDataSet = null; } else if (isDataViewLike("id", items)) { newDataSet = typeCoerceDataSet(items); } else { // turn an array into a dataset newDataSet = typeCoerceDataSet(new DataSet(items)); } // set items if (this.itemsData) { // stop maintaining a coerced version of the old data set this.itemsData.dispose(); } this.itemsData = newDataSet; this.itemSet && this.itemSet.setItems(newDataSet != null ? newDataSet.rawDS : null); } /** * Set groups * @param {vis.DataSet | Array} groups */ setGroups(groups) { // convert to type DataSet when needed let newDataSet; const filter = group => group.visible !== false; if (!groups) { newDataSet = null; } else { // If groups is array, turn to DataSet & build dataview from that if (Array.isArray(groups)) groups = new DataSet(groups); newDataSet = new DataView(groups,{filter}); } // This looks weird but it's necessary to prevent memory leaks. // // The problem is that the DataView will exist as long as the DataSet it's // connected to. This will force it to swap the groups DataSet for it's own // DataSet. In this arrangement it will become unreferenced from the outside // and garbage collected. // // IMPORTANT NOTE: If `this.groupsData` is a DataView was created in this // method. Even if the original is a DataView already a new one has been // created and assigned to `this.groupsData`. In case this changes in the // future it will be necessary to rework this!!!! if (this.groupsData != null && typeof this.groupsData.setData === "function") { this.groupsData.setData(null); } this.groupsData = newDataSet; this.itemSet.setGroups(newDataSet); } /** * Set both items and groups in one go * @param {{items: (Array | vis.DataSet), groups: (Array | vis.DataSet)}} data */ setData(data) { if (data && data.groups) { this.setGroups(data.groups); } if (data && data.items) { this.setItems(data.items); } } /** * Set selected items by their id. Replaces the current selection * Unknown id's are silently ignored. * @param {string[] | string} [ids] An array with zero or more id's of the items to be * selected. If ids is an empty array, all items will be * unselected. * @param {Object} [options] Available options: * `focus: boolean` * If true, focus will be set to the selected item(s) * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * Only applicable when option focus is true. */ setSelection(ids, options) { this.itemSet && this.itemSet.setSelection(ids); if (options && options.focus) { this.focus(ids, options); } } /** * Get the selected items by their id * @return {Array} ids The ids of the selected items */ getSelection() { return this.itemSet && this.itemSet.getSelection() || []; } /** * Adjust the visible window such that the selected item (or multiple items) * are centered on screen. * @param {string | String[]} id An item id or array with item ids * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * `zoom: boolean` * If true (default), the timeline will * zoom on the element after focus it. */ focus(id, options) { if (!this.itemsData || id == undefined) return; const ids = Array.isArray(id) ? id : [id]; // get the specified item(s) const itemsData = this.itemsData.get(ids); // calculate minimum start and maximum end of specified items let start = null; let end = null; itemsData.forEach(itemData => { const s = itemData.start.valueOf(); const e = 'end' in itemData ? itemData.end.valueOf() : itemData.start.valueOf(); if (start === null || s < start) { start = s; } if (end === null || e > end) { end = e; } }); if (start !== null && end !== null) { const me = this; // Use the first item for the vertical focus const item = this.itemSet.items[ids[0]]; let startPos = this._getScrollTop() * -1; let initialVerticalScroll = null; // Setup a handler for each frame of the vertical scroll const verticalAnimationFrame = (ease, willDraw, done) => { const verticalScroll = getItemVerticalScroll(me, item); if (verticalScroll === false) { return; // We don't need to scroll, so do nothing } if(!initialVerticalScroll) { initialVerticalScroll = verticalScroll; } if(initialVerticalScroll.itemTop == verticalScroll.itemTop && !initialVerticalScroll.shouldScroll) { return; // We don't need to scroll, so do nothing } else if(initialVerticalScroll.itemTop != verticalScroll.itemTop && verticalScroll.shouldScroll) { // The redraw shifted elements, so reset the animation to correct initialVerticalScroll = verticalScroll; startPos = me._getScrollTop() * -1; } const from = startPos; const to = initialVerticalScroll.scrollOffset; const scrollTop = done ? to : (from + (to - from) * ease); me._setScrollTop(-scrollTop); if(!willDraw) { me._redraw(); } }; // Enforces the final vertical scroll position const setFinalVerticalPosition = () => { const finalVerticalScroll = getItemVerticalScroll(me, item); if (finalVerticalScroll.shouldScroll && finalVerticalScroll.itemTop != initialVerticalScroll.itemTop) { me._setScrollTop(-finalVerticalScroll.scrollOffset); me._redraw(); } }; // Perform one last check at the end to make sure the final vertical // position is correct const finalVerticalCallback = () => { // Double check we ended at the proper scroll position setFinalVerticalPosition(); // Let the redraw settle and finalize the position. setTimeout(setFinalVerticalPosition, 100); }; // calculate the new middle and interval for the window const zoom = options && options.zoom !== undefined ? options.zoom : true; const middle = (start + end) / 2; const interval = zoom ? (end - start) * 1.1 : Math.max(this.range.end - this.range.start, (end - start) * 1.1); const animation = options && options.animation !== undefined ? options.animation : true; if (!animation) { // We aren't animating so set a default so that the final callback forces the vertical location initialVerticalScroll = { shouldScroll: false, scrollOffset: -1, itemTop: -1 }; } this.range.setRange(middle - interval / 2, middle + interval / 2, { animation }, finalVerticalCallback, verticalAnimationFrame); } } /** * Set Timeline window such that it fits all items * @param {Object} [options] Available options: * `animation: boolean | {duration: number, easingFunction: string}` * If true (default), the range is animated * smoothly to the new window. An object can be * provided to specify duration and easing function. * Default duration is 500 ms, and default easing * function is 'easeInOutQuad'. * @param {function} [callback] */ fit(options, callback) { const animation = (options && options.animation !== undefined) ? options.animation : true; let range; if (this.itemsData.length === 1 && this.itemsData.get()[0].end === undefined) { // a single item -> don't fit, just show a range around the item from -4 to +3 days range = this.getDataRange(); this.moveTo(range.min.valueOf(), {animation}, callback); } else { // exactly fit the items (plus a small margin) range = this.getItemRange(); this.range.setRange(range.min, range.max, { animation }, callback); } } /** * Determine the range of the items, taking into account their actual width * and a margin of 10 pixels on both sides. * * @returns {{min: Date, max: Date}} */ getItemRange() { // get a rough approximation for the range based on the items start and end dates const range = this.getDataRange(); let min = range.min !== null ? range.min.valueOf() : null; let max = range.max !== null ? range.max.valueOf() : null; let minItem = null; let maxItem = null; if (min != null && max != null) { let interval = (max - min); // ms if (interval <= 0) { interval = 10; } const factor = interval / this.props.center.width; const redrawQueue = {}; let redrawQueueLength = 0; // collect redraw functions util$3.forEach(this.itemSet.items, (item, key) => { if (item.groupShowing) { const returnQueue = true; redrawQueue[key] = item.redraw(returnQueue); redrawQueueLength = redrawQueue[key].length; } }); const needRedraw = redrawQueueLength > 0; if (needRedraw) { // redraw all regular items for (let i = 0; i < redrawQueueLength; i++) { util$3.forEach(redrawQueue, fns => { fns[i](); }); } } // calculate the date of the left side and right side of the items given util$3.forEach(this.itemSet.items, item => { const start = getStart(item); const end = getEnd(item); let startSide; let endSide; if (this.options.rtl) { startSide = start - (item.getWidthRight() + 10) * factor; endSide = end + (item.getWidthLeft() + 10) * factor; } else { startSide = start - (item.getWidthLeft() + 10) * factor; endSide = end + (item.getWidthRight() + 10) * factor; } if (startSide < min) { min = startSide; minItem = item; } if (endSide > max) { max = endSide; maxItem = item; } }); if (minItem && maxItem) { const lhs = minItem.getWidthLeft() + 10; const rhs = maxItem.getWidthRight() + 10; const delta = this.props.center.width - lhs - rhs; // px if (delta > 0) { if (this.options.rtl) { min = getStart(minItem) - rhs * interval / delta; // ms max = getEnd(maxItem) + lhs * interval / delta; // ms } else { min = getStart(minItem) - lhs * interval / delta; // ms max = getEnd(maxItem) + rhs * interval / delta; // ms } } } } return { min: min != null ? new Date(min) : null, max: max != null ? new Date(max) : null } } /** * Calculate the data range of the items start and end dates * @returns {{min: Date, max: Date}} */ getDataRange() { let min = null; let max = null; if (this.itemsData) { this.itemsData.forEach(item => { const start = util$3.convert(item.start, 'Date').valueOf(); const end = util$3.convert(item.end != undefined ? item.end : item.start, 'Date').valueOf(); if (min === null || start < min) { min = start; } if (max === null || end > max) { max = end; } }); } return { min: min != null ? new Date(min) : null, max: max != null ? new Date(max) : null } } /** * Generate Timeline related information from an event * @param {Event} event * @return {Object} An object with related information, like on which area * The event happened, whether clicked on an item, etc. */ getEventProperties(event) { const clientX = event.center ? event.center.x : event.clientX; const clientY = event.center ? event.center.y : event.clientY; const centerContainerRect = this.dom.centerContainer.getBoundingClientRect(); const x = this.options.rtl ? centerContainerRect.right - clientX : clientX - centerContainerRect.left; const y = clientY - centerContainerRect.top; const item = this.itemSet.itemFromTarget(event); const group = this.itemSet.groupFromTarget(event); const customTime = CustomTime.customTimeFromTarget(event); const snap = this.itemSet.options.snap || null; const scale = this.body.util.getScale(); const step = this.body.util.getStep(); const time = this._toTime(x); const snappedTime = snap ? snap(time, scale, step) : time; const element = util$3.getTarget(event); let what = null; if (item != null) {what = 'item';} else if (customTime != null) {what = 'custom-time';} else if (util$3.hasParent(element, this.timeAxis.dom.foreground)) {what = 'axis';} else if (this.timeAxis2 && util$3.hasParent(element, this.timeAxis2.dom.foreground)) {what = 'axis';} else if (util$3.hasParent(element, this.itemSet.dom.labelSet)) {what = 'group-label';} else if (util$3.hasParent(element, this.currentTime.bar)) {what = 'current-time';} else if (util$3.hasParent(element, this.dom.center)) {what = 'background';} return { event, item: item ? item.id : null, isCluster: item ? !!item.isCluster: false, items: item ? item.items || []: null, group: group ? group.groupId : null, customTime: customTime ? customTime.options.id : null, what, pageX: event.srcEvent ? event.srcEvent.pageX : event.pageX, pageY: event.srcEvent ? event.srcEvent.pageY : event.pageY, x, y, time, snappedTime } } /** * Toggle Timeline rolling mode */ toggleRollingMode() { if (this.range.rolling) { this.range.stopRolling(); } else { if (this.options.rollingMode == undefined) { this.setOptions(this.options); } this.range.startRolling(); } } /** * redraw * @private */ _redraw() { Core.prototype._redraw.call(this); } /** * on fit callback * @param {object} args * @private */ _onFit(args) { const { start, end, animation } = args; if (!end) { this.moveTo(start.valueOf(), { animation }); } else { this.range.setRange(start, end, { animation: animation }); } } } /** * * @param {timeline.Item} item * @returns {number} */ function getStart(item) { return util$3.convert(item.data.start, 'Date').valueOf() } /** * * @param {timeline.Item} item * @returns {number} */ function getEnd(item) { const end = item.data.end != undefined ? item.data.end : item.data.start; return util$3.convert(end, 'Date').valueOf(); } /** * @param {vis.Timeline} timeline * @param {timeline.Item} item * @return {{shouldScroll: bool, scrollOffset: number, itemTop: number}} */ function getItemVerticalScroll(timeline, item) { if (!item.parent) { // The item no longer exists, so ignore this focus. return false; } const itemsetHeight = timeline.options.rtl ? timeline.props.rightContainer.height : timeline.props.leftContainer.height; const contentHeight = timeline.props.center.height; const group = item.parent; let offset = group.top; let shouldScroll = true; const orientation = timeline.timeAxis.options.orientation.axis; const itemTop = () => { if (orientation == "bottom") { return group.height - item.top - item.height; } else { return item.top; } }; const currentScrollHeight = timeline._getScrollTop() * -1; const targetOffset = offset + itemTop(); const height = item.height; if (targetOffset < currentScrollHeight) { if (offset + itemsetHeight <= offset + itemTop() + height) { offset += itemTop() - timeline.itemSet.options.margin.item.vertical; } } else if (targetOffset + height > currentScrollHeight + itemsetHeight) { offset += itemTop() + height - itemsetHeight + timeline.itemSet.options.margin.item.vertical; } else { shouldScroll = false; } offset = Math.min(offset, contentHeight - itemsetHeight); return { shouldScroll, scrollOffset: offset, itemTop: targetOffset }; } // DOM utility methods /** * this prepares the JSON container for allocating SVG elements * @param {Object} JSONcontainer * @private */ function prepareElements(JSONcontainer) { // cleanup the redundant svgElements; for (var elementType in JSONcontainer) { if (JSONcontainer.hasOwnProperty(elementType)) { JSONcontainer[elementType].redundant = JSONcontainer[elementType].used; JSONcontainer[elementType].used = []; } } } /** * this cleans up all the unused SVG elements. By asking for the parentNode, we only need to supply the JSON container from * which to remove the redundant elements. * * @param {Object} JSONcontainer * @private */ function cleanupElements(JSONcontainer) { // cleanup the redundant svgElements; for (var elementType in JSONcontainer) { if (JSONcontainer.hasOwnProperty(elementType)) { if (JSONcontainer[elementType].redundant) { for (var i = 0; i < JSONcontainer[elementType].redundant.length; i++) { JSONcontainer[elementType].redundant[i].parentNode.removeChild(JSONcontainer[elementType].redundant[i]); } JSONcontainer[elementType].redundant = []; } } } } /** * Ensures that all elements are removed first up so they can be recreated cleanly * @param {Object} JSONcontainer */ function resetElements(JSONcontainer) { prepareElements(JSONcontainer); cleanupElements(JSONcontainer); prepareElements(JSONcontainer); } /** * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. * * @param {string} elementType * @param {Object} JSONcontainer * @param {Object} svgContainer * @returns {Element} * @private */ function getSVGElement(elementType, JSONcontainer, svgContainer) { var element; // allocate SVG element, if it doesnt yet exist, create one. if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before // check if there is an redundant element if (JSONcontainer[elementType].redundant.length > 0) { element = JSONcontainer[elementType].redundant[0]; JSONcontainer[elementType].redundant.shift(); } else { // create a new element and add it to the SVG element = document.createElementNS('http://www.w3.org/2000/svg', elementType); svgContainer.appendChild(element); } } else { // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. element = document.createElementNS('http://www.w3.org/2000/svg', elementType); JSONcontainer[elementType] = {used: [], redundant: []}; svgContainer.appendChild(element); } JSONcontainer[elementType].used.push(element); return element; } /** * Allocate or generate an SVG element if needed. Store a reference to it in the JSON container and draw it in the svgContainer * the JSON container and the SVG container have to be supplied so other svg containers (like the legend) can use this. * * @param {string} elementType * @param {Object} JSONcontainer * @param {Element} DOMContainer * @param {Element} insertBefore * @returns {*} */ function getDOMElement(elementType, JSONcontainer, DOMContainer, insertBefore) { var element; // allocate DOM element, if it doesnt yet exist, create one. if (JSONcontainer.hasOwnProperty(elementType)) { // this element has been created before // check if there is an redundant element if (JSONcontainer[elementType].redundant.length > 0) { element = JSONcontainer[elementType].redundant[0]; JSONcontainer[elementType].redundant.shift(); } else { // create a new element and add it to the SVG element = document.createElement(elementType); if (insertBefore !== undefined) { DOMContainer.insertBefore(element, insertBefore); } else { DOMContainer.appendChild(element); } } } else { // create a new element and add it to the SVG, also create a new object in the svgElements to keep track of it. element = document.createElement(elementType); JSONcontainer[elementType] = {used: [], redundant: []}; if (insertBefore !== undefined) { DOMContainer.insertBefore(element, insertBefore); } else { DOMContainer.appendChild(element); } } JSONcontainer[elementType].used.push(element); return element; } /** * Draw a point object. This is a separate function because it can also be called by the legend. * The reason the JSONcontainer and the target SVG svgContainer have to be supplied is so the legend can use these functions * as well. * * @param {number} x * @param {number} y * @param {Object} groupTemplate: A template containing the necessary information to draw the datapoint e.g., {style: 'circle', size: 5, className: 'className' } * @param {Object} JSONcontainer * @param {Object} svgContainer * @param {Object} labelObj * @returns {vis.PointItem} */ function drawPoint(x, y, groupTemplate, JSONcontainer, svgContainer, labelObj) { var point; if (groupTemplate.style == 'circle') { point = getSVGElement('circle', JSONcontainer, svgContainer); point.setAttributeNS(null, "cx", x); point.setAttributeNS(null, "cy", y); point.setAttributeNS(null, "r", 0.5 * groupTemplate.size); } else { point = getSVGElement('rect', JSONcontainer, svgContainer); point.setAttributeNS(null, "x", x - 0.5 * groupTemplate.size); point.setAttributeNS(null, "y", y - 0.5 * groupTemplate.size); point.setAttributeNS(null, "width", groupTemplate.size); point.setAttributeNS(null, "height", groupTemplate.size); } if (groupTemplate.styles !== undefined) { point.setAttributeNS(null, "style", groupTemplate.styles); } point.setAttributeNS(null, "class", groupTemplate.className + " vis-point"); //handle label if (labelObj) { var label = getSVGElement('text', JSONcontainer, svgContainer); if (labelObj.xOffset) { x = x + labelObj.xOffset; } if (labelObj.yOffset) { y = y + labelObj.yOffset; } if (labelObj.content) { label.textContent = labelObj.content; } if (labelObj.className) { label.setAttributeNS(null, "class", labelObj.className + " vis-label"); } label.setAttributeNS(null, "x", x); label.setAttributeNS(null, "y", y); } return point; } /** * draw a bar SVG element centered on the X coordinate * * @param {number} x * @param {number} y * @param {number} width * @param {number} height * @param {string} className * @param {Object} JSONcontainer * @param {Object} svgContainer * @param {string} style */ function drawBar (x, y, width, height, className, JSONcontainer, svgContainer, style) { if (height != 0) { if (height < 0) { height *= -1; y -= height; } var rect = getSVGElement('rect',JSONcontainer, svgContainer); rect.setAttributeNS(null, "x", x - 0.5 * width); rect.setAttributeNS(null, "y", y); rect.setAttributeNS(null, "width", width); rect.setAttributeNS(null, "height", height); rect.setAttributeNS(null, "class", className); if (style) { rect.setAttributeNS(null, "style", style); } } } /** * get default language * @returns {string} */ function getNavigatorLanguage() { try { if (!navigator) return 'en'; if (navigator.languages && navigator.languages.length) { return navigator.languages; } else { return navigator.userLanguage || navigator.language || navigator.browserLanguage || 'en'; } } catch(error) { return 'en'; } } /** DataScale */ class DataScale { /** * * @param {number} start * @param {number} end * @param {boolean} autoScaleStart * @param {boolean} autoScaleEnd * @param {number} containerHeight * @param {number} majorCharHeight * @param {boolean} zeroAlign * @param {function} formattingFunction * @constructor DataScale */ constructor( start, end, autoScaleStart, autoScaleEnd, containerHeight, majorCharHeight, zeroAlign = false, formattingFunction=false) { this.majorSteps = [1, 2, 5, 10]; this.minorSteps = [0.25, 0.5, 1, 2]; this.customLines = null; this.containerHeight = containerHeight; this.majorCharHeight = majorCharHeight; this._start = start; this._end = end; this.scale = 1; this.minorStepIdx = -1; this.magnitudefactor = 1; this.determineScale(); this.zeroAlign = zeroAlign; this.autoScaleStart = autoScaleStart; this.autoScaleEnd = autoScaleEnd; this.formattingFunction = formattingFunction; if (autoScaleStart || autoScaleEnd) { const me = this; const roundToMinor = value => { const rounded = value - (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx])); if (value % (me.magnitudefactor * me.minorSteps[me.minorStepIdx]) > 0.5 * (me.magnitudefactor * me.minorSteps[me.minorStepIdx])) { return rounded + (me.magnitudefactor * me.minorSteps[me.minorStepIdx]); } else { return rounded; } }; if (autoScaleStart) { this._start -= this.magnitudefactor * 2 * this.minorSteps[this.minorStepIdx]; this._start = roundToMinor(this._start); } if (autoScaleEnd) { this._end += this.magnitudefactor * this.minorSteps[this.minorStepIdx]; this._end = roundToMinor(this._end); } this.determineScale(); } } /** * set chart height * @param {number} majorCharHeight */ setCharHeight(majorCharHeight) { this.majorCharHeight = majorCharHeight; } /** * set height * @param {number} containerHeight */ setHeight(containerHeight) { this.containerHeight = containerHeight; } /** * determine scale */ determineScale() { const range = this._end - this._start; this.scale = this.containerHeight / range; const minimumStepValue = this.majorCharHeight / this.scale; const orderOfMagnitude = (range > 0) ? Math.round(Math.log(range) / Math.LN10) : 0; this.minorStepIdx = -1; this.magnitudefactor = Math.pow(10, orderOfMagnitude); let start = 0; if (orderOfMagnitude < 0) { start = orderOfMagnitude; } let solutionFound = false; for (let l = start; Math.abs(l) <= Math.abs(orderOfMagnitude); l++) { this.magnitudefactor = Math.pow(10, l); for (let j = 0; j < this.minorSteps.length; j++) { const stepSize = this.magnitudefactor * this.minorSteps[j]; if (stepSize >= minimumStepValue) { solutionFound = true; this.minorStepIdx = j; break; } } if (solutionFound === true) { break; } } } /** * returns if value is major * @param {number} value * @returns {boolean} */ is_major(value) { return (value % (this.magnitudefactor * this.majorSteps[this.minorStepIdx]) === 0); } /** * returns step size * @returns {number} */ getStep() { return this.magnitudefactor * this.minorSteps[this.minorStepIdx]; } /** * returns first major * @returns {number} */ getFirstMajor() { const majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; return this.convertValue(this._start + ((majorStep - (this._start % majorStep)) % majorStep)); } /** * returns first major * @param {date} current * @returns {date} formatted date */ formatValue(current) { let returnValue = current.toPrecision(5); if (typeof this.formattingFunction === 'function') { returnValue = this.formattingFunction(current); } if (typeof returnValue === 'number') { return `${returnValue}`; } else if (typeof returnValue === 'string') { return returnValue; } else { return current.toPrecision(5); } } /** * returns lines * @returns {object} lines */ getLines() { const lines = []; const step = this.getStep(); const bottomOffset = (step - (this._start % step)) % step; for (let i = (this._start + bottomOffset); this._end-i > 0.00001; i += step) { if (i != this._start) { //Skip the bottom line lines.push({major: this.is_major(i), y: this.convertValue(i), val: this.formatValue(i)}); } } return lines; } /** * follow scale * @param {object} other */ followScale(other) { const oldStepIdx = this.minorStepIdx; const oldStart = this._start; const oldEnd = this._end; const me = this; const increaseMagnitude = () => { me.magnitudefactor *= 2; }; const decreaseMagnitude = () => { me.magnitudefactor /= 2; }; if ((other.minorStepIdx <= 1 && this.minorStepIdx <= 1) || (other.minorStepIdx > 1 && this.minorStepIdx > 1)) ; else if (other.minorStepIdx < this.minorStepIdx) { //I'm 5, they are 4 per major. this.minorStepIdx = 1; if (oldStepIdx == 2) { increaseMagnitude(); } else { increaseMagnitude(); increaseMagnitude(); } } else { //I'm 4, they are 5 per major this.minorStepIdx = 2; if (oldStepIdx == 1) { decreaseMagnitude(); } else { decreaseMagnitude(); decreaseMagnitude(); } } //Get masters stats: const otherZero = other.convertValue(0); const otherStep = other.getStep() * other.scale; let done = false; let count = 0; //Loop until magnitude is correct for given constrains. while (!done && count++ <5) { //Get my stats: this.scale = otherStep / (this.minorSteps[this.minorStepIdx] * this.magnitudefactor); const newRange = this.containerHeight / this.scale; //For the case the magnitudefactor has changed: this._start = oldStart; this._end = this._start + newRange; const myOriginalZero = this._end * this.scale; const majorStep = this.magnitudefactor * this.majorSteps[this.minorStepIdx]; const majorOffset = this.getFirstMajor() - other.getFirstMajor(); if (this.zeroAlign) { const zeroOffset = otherZero - myOriginalZero; this._end += (zeroOffset / this.scale); this._start = this._end - newRange; } else { if (!this.autoScaleStart) { this._start += majorStep - (majorOffset / this.scale); this._end = this._start + newRange; } else { this._start -= majorOffset / this.scale; this._end = this._start + newRange; } } if (!this.autoScaleEnd && this._end > oldEnd+0.00001) { //Need to decrease magnitude to prevent scale overshoot! (end) decreaseMagnitude(); done = false; continue; } if (!this.autoScaleStart && this._start < oldStart-0.00001) { if (this.zeroAlign && oldStart >= 0) { console.warn("Can't adhere to given 'min' range, due to zeroalign"); } else { //Need to decrease magnitude to prevent scale overshoot! (start) decreaseMagnitude(); done = false; continue; } } if (this.autoScaleStart && this.autoScaleEnd && newRange < (oldEnd-oldStart)){ increaseMagnitude(); done = false; continue; } done = true; } } /** * convert value * @param {number} value * @returns {number} */ convertValue(value) { return this.containerHeight - ((value - this._start) * this.scale); } /** * returns screen to value * @param {number} pixels * @returns {number} */ screenToValue(pixels) { return ((this.containerHeight - pixels) / this.scale) + this._start; } } /** A horizontal time axis */ class DataAxis extends Component { /** * @param {Object} body * @param {Object} [options] See DataAxis.setOptions for the available * options. * @param {SVGElement} svg * @param {timeline.LineGraph.options} linegraphOptions * @constructor DataAxis * @extends Component */ constructor(body, options, svg, linegraphOptions) { super(); this.id = dist.v4(); this.body = body; this.defaultOptions = { orientation: 'left', // supported: 'left', 'right' showMinorLabels: true, showMajorLabels: true, showWeekScale: false, icons: false, majorLinesOffset: 7, minorLinesOffset: 4, labelOffsetX: 10, labelOffsetY: 2, iconWidth: 20, width: '40px', visible: true, alignZeros: true, left: { range: {min: undefined, max: undefined}, format(value) { return `${parseFloat(value.toPrecision(3))}`; }, title: {text: undefined, style: undefined} }, right: { range: {min: undefined, max: undefined}, format(value) { return `${parseFloat(value.toPrecision(3))}`; }, title: {text: undefined, style: undefined} } }; this.linegraphOptions = linegraphOptions; this.linegraphSVG = svg; this.props = {}; this.DOMelements = { // dynamic elements lines: {}, labels: {}, title: {} }; this.dom = {}; this.scale = undefined; this.range = {start: 0, end: 0}; this.options = util$3.extend({}, this.defaultOptions); this.conversionFactor = 1; this.setOptions(options); this.width = Number((`${this.options.width}`).replace("px", "")); this.minWidth = this.width; this.height = this.linegraphSVG.getBoundingClientRect().height; this.hidden = false; this.stepPixels = 25; this.zeroCrossing = -1; this.amountOfSteps = -1; this.lineOffset = 0; this.master = true; this.masterAxis = null; this.svgElements = {}; this.iconsRemoved = false; this.groups = {}; this.amountOfGroups = 0; // create the HTML DOM this._create(); if (this.scale == undefined) { this._redrawLabels(); } this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; const me = this; this.body.emitter.on("verticalDrag", () => { me.dom.lineContainer.style.top = `${me.body.domProps.scrollTop}px`; }); } /** * Adds group to data axis * @param {string} label * @param {object} graphOptions */ addGroup(label, graphOptions) { if (!this.groups.hasOwnProperty(label)) { this.groups[label] = graphOptions; } this.amountOfGroups += 1; } /** * updates group of data axis * @param {string} label * @param {object} graphOptions */ updateGroup(label, graphOptions) { if (!this.groups.hasOwnProperty(label)) { this.amountOfGroups += 1; } this.groups[label] = graphOptions; } /** * removes group of data axis * @param {string} label */ removeGroup(label) { if (this.groups.hasOwnProperty(label)) { delete this.groups[label]; this.amountOfGroups -= 1; } } /** * sets options * @param {object} options */ setOptions(options) { if (options) { let redraw = false; if (this.options.orientation != options.orientation && options.orientation !== undefined) { redraw = true; } const fields = [ 'orientation', 'showMinorLabels', 'showMajorLabels', 'icons', 'majorLinesOffset', 'minorLinesOffset', 'labelOffsetX', 'labelOffsetY', 'iconWidth', 'width', 'visible', 'left', 'right', 'alignZeros' ]; util$3.selectiveDeepExtend(fields, this.options, options); this.minWidth = Number((`${this.options.width}`).replace("px", "")); if (redraw === true && this.dom.frame) { this.hide(); this.show(); } } } /** * Create the HTML DOM for the DataAxis */ _create() { this.dom.frame = document.createElement('div'); this.dom.frame.style.width = this.options.width; this.dom.frame.style.height = this.height; this.dom.lineContainer = document.createElement('div'); this.dom.lineContainer.style.width = '100%'; this.dom.lineContainer.style.height = this.height; this.dom.lineContainer.style.position = 'relative'; this.dom.lineContainer.style.visibility = 'visible'; this.dom.lineContainer.style.display = 'block'; // create svg element for graph drawing. this.svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); this.svg.style.position = "absolute"; this.svg.style.top = '0px'; this.svg.style.height = '100%'; this.svg.style.width = '100%'; this.svg.style.display = "block"; this.dom.frame.appendChild(this.svg); } /** * redraws groups icons */ _redrawGroupIcons() { prepareElements(this.svgElements); let x; const iconWidth = this.options.iconWidth; const iconHeight = 15; const iconOffset = 4; let y = iconOffset + 0.5 * iconHeight; if (this.options.orientation === 'left') { x = iconOffset; } else { x = this.width - iconWidth - iconOffset; } const groupArray = Object.keys(this.groups); groupArray.sort((a, b) => a < b ? -1 : 1); for (const groupId of groupArray) { if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) { this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + iconOffset; } } cleanupElements(this.svgElements); this.iconsRemoved = false; } /** * Cleans up icons */ _cleanupIcons() { if (this.iconsRemoved === false) { prepareElements(this.svgElements); cleanupElements(this.svgElements); this.iconsRemoved = true; } } /** * Create the HTML DOM for the DataAxis */ show() { this.hidden = false; if (!this.dom.frame.parentNode) { if (this.options.orientation === 'left') { this.body.dom.left.appendChild(this.dom.frame); } else { this.body.dom.right.appendChild(this.dom.frame); } } if (!this.dom.lineContainer.parentNode) { this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer); } this.dom.lineContainer.style.display = 'block'; } /** * Create the HTML DOM for the DataAxis */ hide() { this.hidden = true; if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); } this.dom.lineContainer.style.display = 'none'; } /** * Set a range (start and end) * @param {number} start * @param {number} end */ setRange(start, end) { this.range.start = start; this.range.end = end; } /** * Repaint the component * @return {boolean} Returns true if the component is resized */ redraw() { let resized = false; let activeGroups = 0; // Make sure the line container adheres to the vertical scrolling. this.dom.lineContainer.style.top = `${this.body.domProps.scrollTop}px`; for (const groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { if (this.groups[groupId].visible === true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] === true)) { activeGroups++; } } } if (this.amountOfGroups === 0 || activeGroups === 0) { this.hide(); } else { this.show(); this.height = Number(this.linegraphSVG.style.height.replace("px", "")); // svg offsetheight did not work in firefox and explorer... this.dom.lineContainer.style.height = `${this.height}px`; this.width = this.options.visible === true ? Number((`${this.options.width}`).replace("px", "")) : 0; const props = this.props; const frame = this.dom.frame; // update classname frame.className = 'vis-data-axis'; // calculate character width and height this._calculateCharSize(); const orientation = this.options.orientation; const showMinorLabels = this.options.showMinorLabels; const showMajorLabels = this.options.showMajorLabels; const backgroundHorizontalOffsetWidth = this.body.dom.backgroundHorizontal.offsetWidth; // determine the width and height of the elements for the axis props.minorLabelHeight = showMinorLabels ? props.minorCharHeight : 0; props.majorLabelHeight = showMajorLabels ? props.majorCharHeight : 0; props.minorLineWidth = backgroundHorizontalOffsetWidth - this.lineOffset - this.width + 2 * this.options.minorLinesOffset; props.minorLineHeight = 1; props.majorLineWidth = backgroundHorizontalOffsetWidth - this.lineOffset - this.width + 2 * this.options.majorLinesOffset; props.majorLineHeight = 1; // take frame offline while updating (is almost twice as fast) if (orientation === 'left') { frame.style.top = '0'; frame.style.left = '0'; frame.style.bottom = ''; frame.style.width = `${this.width}px`; frame.style.height = `${this.height}px`; this.props.width = this.body.domProps.left.width; this.props.height = this.body.domProps.left.height; } else { // right frame.style.top = ''; frame.style.bottom = '0'; frame.style.left = '0'; frame.style.width = `${this.width}px`; frame.style.height = `${this.height}px`; this.props.width = this.body.domProps.right.width; this.props.height = this.body.domProps.right.height; } resized = this._redrawLabels(); resized = this._isResized() || resized; if (this.options.icons === true) { this._redrawGroupIcons(); } else { this._cleanupIcons(); } this._redrawTitle(orientation); } return resized; } /** * Repaint major and minor text labels and vertical grid lines * * @returns {boolean} * @private */ _redrawLabels() { let resized = false; prepareElements(this.DOMelements.lines); prepareElements(this.DOMelements.labels); const orientation = this.options['orientation']; const customRange = this.options[orientation].range != undefined ? this.options[orientation].range : {}; //Override range with manual options: let autoScaleEnd = true; if (customRange.max != undefined) { this.range.end = customRange.max; autoScaleEnd = false; } let autoScaleStart = true; if (customRange.min != undefined) { this.range.start = customRange.min; autoScaleStart = false; } this.scale = new DataScale( this.range.start, this.range.end, autoScaleStart, autoScaleEnd, this.dom.frame.offsetHeight, this.props.majorCharHeight, this.options.alignZeros, this.options[orientation].format ); if (this.master === false && this.masterAxis != undefined) { this.scale.followScale(this.masterAxis.scale); this.dom.lineContainer.style.display = 'none'; } else { this.dom.lineContainer.style.display = 'block'; } //Is updated in side-effect of _redrawLabel(): this.maxLabelSize = 0; const lines = this.scale.getLines(); lines.forEach( line=> { const y = line.y; const isMajor = line.major; if (this.options['showMinorLabels'] && isMajor === false) { this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-minor', this.props.minorCharHeight); } if (isMajor) { if (y >= 0) { this._redrawLabel(y - 2, line.val, orientation, 'vis-y-axis vis-major', this.props.majorCharHeight); } } if (this.master === true) { if (isMajor) { this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-major', this.options.majorLinesOffset, this.props.majorLineWidth); } else { this._redrawLine(y, orientation, 'vis-grid vis-horizontal vis-minor', this.options.minorLinesOffset, this.props.minorLineWidth); } } }); // Note that title is rotated, so we're using the height, not width! let titleWidth = 0; if (this.options[orientation].title !== undefined && this.options[orientation].title.text !== undefined) { titleWidth = this.props.titleCharHeight; } const offset = this.options.icons === true ? Math.max(this.options.iconWidth, titleWidth) + this.options.labelOffsetX + 15 : titleWidth + this.options.labelOffsetX + 15; // this will resize the yAxis to accommodate the labels. if (this.maxLabelSize > (this.width - offset) && this.options.visible === true) { this.width = this.maxLabelSize + offset; this.options.width = `${this.width}px`; cleanupElements(this.DOMelements.lines); cleanupElements(this.DOMelements.labels); this.redraw(); resized = true; } // this will resize the yAxis if it is too big for the labels. else if (this.maxLabelSize < (this.width - offset) && this.options.visible === true && this.width > this.minWidth) { this.width = Math.max(this.minWidth, this.maxLabelSize + offset); this.options.width = `${this.width}px`; cleanupElements(this.DOMelements.lines); cleanupElements(this.DOMelements.labels); this.redraw(); resized = true; } else { cleanupElements(this.DOMelements.lines); cleanupElements(this.DOMelements.labels); resized = false; } return resized; } /** * converts value * @param {number} value * @returns {number} converted number */ convertValue(value) { return this.scale.convertValue(value); } /** * converts value * @param {number} x * @returns {number} screen value */ screenToValue(x) { return this.scale.screenToValue(x); } /** * Create a label for the axis at position x * * @param {number} y * @param {string} text * @param {'top'|'right'|'bottom'|'left'} orientation * @param {string} className * @param {number} characterHeight * @private */ _redrawLabel(y, text, orientation, className, characterHeight) { // reuse redundant label const label = getDOMElement('div', this.DOMelements.labels, this.dom.frame); //this.dom.redundant.labels.shift(); label.className = className; label.innerHTML = util$3.xss(text); if (orientation === 'left') { label.style.left = `-${this.options.labelOffsetX}px`; label.style.textAlign = "right"; } else { label.style.right = `-${this.options.labelOffsetX}px`; label.style.textAlign = "left"; } label.style.top = `${y - 0.5 * characterHeight + this.options.labelOffsetY}px`; text += ''; const largestWidth = Math.max(this.props.majorCharWidth, this.props.minorCharWidth); if (this.maxLabelSize < text.length * largestWidth) { this.maxLabelSize = text.length * largestWidth; } } /** * Create a minor line for the axis at position y * @param {number} y * @param {'top'|'right'|'bottom'|'left'} orientation * @param {string} className * @param {number} offset * @param {number} width */ _redrawLine(y, orientation, className, offset, width) { if (this.master === true) { const line = getDOMElement('div', this.DOMelements.lines, this.dom.lineContainer); //this.dom.redundant.lines.shift(); line.className = className; line.innerHTML = ''; if (orientation === 'left') { line.style.left = `${this.width - offset}px`; } else { line.style.right = `${this.width - offset}px`; } line.style.width = `${width}px`; line.style.top = `${y}px`; } } /** * Create a title for the axis * @private * @param {'top'|'right'|'bottom'|'left'} orientation */ _redrawTitle(orientation) { prepareElements(this.DOMelements.title); // Check if the title is defined for this axes if (this.options[orientation].title !== undefined && this.options[orientation].title.text !== undefined) { const title = getDOMElement('div', this.DOMelements.title, this.dom.frame); title.className = `vis-y-axis vis-title vis-${orientation}`; title.innerHTML = util$3.xss(this.options[orientation].title.text); // Add style - if provided if (this.options[orientation].title.style !== undefined) { util$3.addCssText(title, this.options[orientation].title.style); } if (orientation === 'left') { title.style.left = `${this.props.titleCharHeight}px`; } else { title.style.right = `${this.props.titleCharHeight}px`; } title.style.width = `${this.height}px`; } // we need to clean up in case we did not use all elements. cleanupElements(this.DOMelements.title); } /** * Determine the size of text on the axis (both major and minor axis). * The size is calculated only once and then cached in this.props. * @private */ _calculateCharSize() { // determine the char width and height on the minor axis if (!('minorCharHeight' in this.props)) { const textMinor = document.createTextNode('0'); const measureCharMinor = document.createElement('div'); measureCharMinor.className = 'vis-y-axis vis-minor vis-measure'; measureCharMinor.appendChild(textMinor); this.dom.frame.appendChild(measureCharMinor); this.props.minorCharHeight = measureCharMinor.clientHeight; this.props.minorCharWidth = measureCharMinor.clientWidth; this.dom.frame.removeChild(measureCharMinor); } if (!('majorCharHeight' in this.props)) { const textMajor = document.createTextNode('0'); const measureCharMajor = document.createElement('div'); measureCharMajor.className = 'vis-y-axis vis-major vis-measure'; measureCharMajor.appendChild(textMajor); this.dom.frame.appendChild(measureCharMajor); this.props.majorCharHeight = measureCharMajor.clientHeight; this.props.majorCharWidth = measureCharMajor.clientWidth; this.dom.frame.removeChild(measureCharMajor); } if (!('titleCharHeight' in this.props)) { const textTitle = document.createTextNode('0'); const measureCharTitle = document.createElement('div'); measureCharTitle.className = 'vis-y-axis vis-title vis-measure'; measureCharTitle.appendChild(textTitle); this.dom.frame.appendChild(measureCharTitle); this.props.titleCharHeight = measureCharTitle.clientHeight; this.props.titleCharWidth = measureCharTitle.clientWidth; this.dom.frame.removeChild(measureCharTitle); } } } /** * * @param {number | string} groupId * @param {Object} options // TODO: Describe options * * @constructor Points */ function Points(groupId, options) { // eslint-disable-line no-unused-vars } /** * draw the data points * * @param {Array} dataset * @param {GraphGroup} group * @param {Object} framework | SVG DOM element * @param {number} [offset] */ Points.draw = function (dataset, group, framework, offset) { offset = offset || 0; var callback = getCallback(framework, group); for (var i = 0; i < dataset.length; i++) { if (!callback) { // draw the point the simple way. drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group), framework.svgElements, framework.svg, dataset[i].label); } else { var callbackResult = callback(dataset[i], group); // result might be true, false or an object if (callbackResult === true || typeof callbackResult === 'object') { drawPoint(dataset[i].screen_x + offset, dataset[i].screen_y, getGroupTemplate(group, callbackResult), framework.svgElements, framework.svg, dataset[i].label); } } } }; Points.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { var fillHeight = iconHeight * 0.5; var outline = getSVGElement("rect", framework.svgElements, framework.svg); outline.setAttributeNS(null, "x", x); outline.setAttributeNS(null, "y", y - fillHeight); outline.setAttributeNS(null, "width", iconWidth); outline.setAttributeNS(null, "height", 2 * fillHeight); outline.setAttributeNS(null, "class", "vis-outline"); //Don't call callback on icon drawPoint(x + 0.5 * iconWidth, y, getGroupTemplate(group), framework.svgElements, framework.svg); }; /** * * @param {vis.Group} group * @param {any} callbackResult * @returns {{style: *, styles: (*|string), size: *, className: *}} */ function getGroupTemplate(group, callbackResult) { callbackResult = (typeof callbackResult === 'undefined') ? {} : callbackResult; return { style: callbackResult.style || group.options.drawPoints.style, styles: callbackResult.styles || group.options.drawPoints.styles, size: callbackResult.size || group.options.drawPoints.size, className: callbackResult.className || group.className }; } /** * * @param {Object} framework | SVG DOM element * @param {vis.Group} group * @returns {function} */ function getCallback(framework, group) { var callback = undefined; // check for the graph2d onRender if (framework.options && framework.options.drawPoints && framework.options.drawPoints.onRender && typeof framework.options.drawPoints.onRender == 'function') { callback = framework.options.drawPoints.onRender; } // override it with the group onRender if defined if (group.group.options && group.group.options.drawPoints && group.group.options.drawPoints.onRender && typeof group.group.options.drawPoints.onRender == 'function') { callback = group.group.options.drawPoints.onRender; } return callback; } /** * * @param {vis.GraphGroup.id} groupId * @param {Object} options // TODO: Describe options * @constructor Bargraph */ function Bargraph(groupId, options) { // eslint-disable-line no-unused-vars } Bargraph.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { var fillHeight = iconHeight * 0.5; var outline = getSVGElement("rect", framework.svgElements, framework.svg); outline.setAttributeNS(null, "x", x); outline.setAttributeNS(null, "y", y - fillHeight); outline.setAttributeNS(null, "width", iconWidth); outline.setAttributeNS(null, "height", 2 * fillHeight); outline.setAttributeNS(null, "class", "vis-outline"); var barWidth = Math.round(0.3 * iconWidth); var originalWidth = group.options.barChart.width; var scale = originalWidth / barWidth; var bar1Height = Math.round(0.4 * iconHeight); var bar2Height = Math.round(0.75 * iconHeight); var offset = Math.round((iconWidth - (2 * barWidth)) / 3); drawBar(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, barWidth, bar1Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); drawBar(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, barWidth, bar2Height, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); if (group.options.drawPoints.enabled == true) { var groupTemplate = { style: group.options.drawPoints.style, styles: group.options.drawPoints.styles, size: (group.options.drawPoints.size / scale), className: group.className }; drawPoint(x + 0.5 * barWidth + offset, y + fillHeight - bar1Height - 1, groupTemplate, framework.svgElements, framework.svg); drawPoint(x + 1.5 * barWidth + offset + 2, y + fillHeight - bar2Height - 1, groupTemplate, framework.svgElements, framework.svg); } }; /** * draw a bar graph * * @param {Array.<vis.GraphGroup.id>} groupIds * @param {Object} processedGroupData * @param {{svg: Object, svgElements: Array.<Object>, options: Object, groups: Array.<vis.Group>}} framework */ Bargraph.draw = function (groupIds, processedGroupData, framework) { var combinedData = []; var intersections = {}; var coreDistance; var key, drawData; var group; var i, j; var barPoints = 0; // combine all barchart data for (i = 0; i < groupIds.length; i++) { group = framework.groups[groupIds[i]]; if (group.options.style === 'bar') { if (group.visible === true && (framework.options.groups.visibility[groupIds[i]] === undefined || framework.options.groups.visibility[groupIds[i]] === true)) { for (j = 0; j < processedGroupData[groupIds[i]].length; j++) { combinedData.push({ screen_x: processedGroupData[groupIds[i]][j].screen_x, screen_end: processedGroupData[groupIds[i]][j].screen_end, screen_y: processedGroupData[groupIds[i]][j].screen_y, x: processedGroupData[groupIds[i]][j].x, end: processedGroupData[groupIds[i]][j].end, y: processedGroupData[groupIds[i]][j].y, groupId: groupIds[i], label: processedGroupData[groupIds[i]][j].label }); barPoints += 1; } } } } if (barPoints === 0) { return; } // sort by time and by group combinedData.sort(function (a, b) { if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; } else { return a.screen_x - b.screen_x; } }); // get intersections Bargraph._getDataIntersections(intersections, combinedData); // plot barchart for (i = 0; i < combinedData.length; i++) { group = framework.groups[combinedData[i].groupId]; var minWidth = group.options.barChart.minWidth != undefined ? group.options.barChart.minWidth : 0.1 * group.options.barChart.width; key = combinedData[i].screen_x; var heightOffset = 0; if (intersections[key] === undefined) { if (i + 1 < combinedData.length) { coreDistance = Math.abs(combinedData[i + 1].screen_x - key); } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); } else { var nextKey = i + (intersections[key].amount - intersections[key].resolved); if (nextKey < combinedData.length) { coreDistance = Math.abs(combinedData[nextKey].screen_x - key); } drawData = Bargraph._getSafeDrawData(coreDistance, group, minWidth); intersections[key].resolved += 1; if (group.options.stack === true && group.options.excludeFromStacking !== true) { if (combinedData[i].screen_y < group.zeroPosition) { heightOffset = intersections[key].accumulatedNegative; intersections[key].accumulatedNegative += group.zeroPosition - combinedData[i].screen_y; } else { heightOffset = intersections[key].accumulatedPositive; intersections[key].accumulatedPositive += group.zeroPosition - combinedData[i].screen_y; } } else if (group.options.barChart.sideBySide === true) { drawData.width = drawData.width / intersections[key].amount; drawData.offset += (intersections[key].resolved) * drawData.width - (0.5 * drawData.width * (intersections[key].amount + 1)); } } let dataWidth = drawData.width; let start = combinedData[i].screen_x; // are we drawing explicit boxes? (we supplied an end value) if (combinedData[i].screen_end != undefined){ dataWidth = combinedData[i].screen_end - combinedData[i].screen_x; start += (dataWidth * 0.5); } else { start += drawData.offset; } drawBar(start, combinedData[i].screen_y - heightOffset, dataWidth, group.zeroPosition - combinedData[i].screen_y, group.className + ' vis-bar', framework.svgElements, framework.svg, group.style); // draw points if (group.options.drawPoints.enabled === true) { let pointData = { screen_x: combinedData[i].screen_x, screen_y: combinedData[i].screen_y - heightOffset, x: combinedData[i].x, y: combinedData[i].y, groupId: combinedData[i].groupId, label: combinedData[i].label }; Points.draw([pointData], group, framework, drawData.offset); //DOMutil.drawPoint(combinedData[i].x + drawData.offset, combinedData[i].y, group, framework.svgElements, framework.svg); } } }; /** * Fill the intersections object with counters of how many datapoints share the same x coordinates * @param {Object} intersections * @param {Array.<Object>} combinedData * @private */ Bargraph._getDataIntersections = function (intersections, combinedData) { // get intersections var coreDistance; for (var i = 0; i < combinedData.length; i++) { if (i + 1 < combinedData.length) { coreDistance = Math.abs(combinedData[i + 1].screen_x - combinedData[i].screen_x); } if (i > 0) { coreDistance = Math.min(coreDistance, Math.abs(combinedData[i - 1].screen_x - combinedData[i].screen_x)); } if (coreDistance === 0) { if (intersections[combinedData[i].screen_x] === undefined) { intersections[combinedData[i].screen_x] = { amount: 0, resolved: 0, accumulatedPositive: 0, accumulatedNegative: 0 }; } intersections[combinedData[i].screen_x].amount += 1; } } }; /** * Get the width and offset for bargraphs based on the coredistance between datapoints * * @param {number} coreDistance * @param {vis.Group} group * @param {number} minWidth * @returns {{width: number, offset: number}} * @private */ Bargraph._getSafeDrawData = function (coreDistance, group, minWidth) { var width, offset; if (coreDistance < group.options.barChart.width && coreDistance > 0) { width = coreDistance < minWidth ? minWidth : coreDistance; offset = 0; // recalculate offset with the new width; if (group.options.barChart.align === 'left') { offset -= 0.5 * coreDistance; } else if (group.options.barChart.align === 'right') { offset += 0.5 * coreDistance; } } else { // default settings width = group.options.barChart.width; offset = 0; if (group.options.barChart.align === 'left') { offset -= 0.5 * group.options.barChart.width; } else if (group.options.barChart.align === 'right') { offset += 0.5 * group.options.barChart.width; } } return {width: width, offset: offset}; }; Bargraph.getStackedYRange = function (combinedData, groupRanges, groupIds, groupLabel, orientation) { if (combinedData.length > 0) { // sort by time and by group combinedData.sort(function (a, b) { if (a.screen_x === b.screen_x) { return a.groupId < b.groupId ? -1 : 1; } else { return a.screen_x - b.screen_x; } }); var intersections = {}; Bargraph._getDataIntersections(intersections, combinedData); groupRanges[groupLabel] = Bargraph._getStackedYRange(intersections, combinedData); groupRanges[groupLabel].yAxisOrientation = orientation; groupIds.push(groupLabel); } }; Bargraph._getStackedYRange = function (intersections, combinedData) { var key; var yMin = combinedData[0].screen_y; var yMax = combinedData[0].screen_y; for (var i = 0; i < combinedData.length; i++) { key = combinedData[i].screen_x; if (intersections[key] === undefined) { yMin = yMin > combinedData[i].screen_y ? combinedData[i].screen_y : yMin; yMax = yMax < combinedData[i].screen_y ? combinedData[i].screen_y : yMax; } else { if (combinedData[i].screen_y < 0) { intersections[key].accumulatedNegative += combinedData[i].screen_y; } else { intersections[key].accumulatedPositive += combinedData[i].screen_y; } } } for (var xpos in intersections) { if (intersections.hasOwnProperty(xpos)) { yMin = yMin > intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMin; yMin = yMin > intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMin; yMax = yMax < intersections[xpos].accumulatedNegative ? intersections[xpos].accumulatedNegative : yMax; yMax = yMax < intersections[xpos].accumulatedPositive ? intersections[xpos].accumulatedPositive : yMax; } } return {min: yMin, max: yMax}; }; /** * * @param {vis.GraphGroup.id} groupId * @param {Object} options // TODO: Describe options * @constructor Line */ function Line(groupId, options) { // eslint-disable-line no-unused-vars } Line.calcPath = function (dataset, group) { if (dataset != null) { if (dataset.length > 0) { var d = []; // construct path from dataset if (group.options.interpolation.enabled == true) { d = Line._catmullRom(dataset, group); } else { d = Line._linear(dataset); } return d; } } }; Line.drawIcon = function (group, x, y, iconWidth, iconHeight, framework) { var fillHeight = iconHeight * 0.5; var path, fillPath; var outline = getSVGElement("rect", framework.svgElements, framework.svg); outline.setAttributeNS(null, "x", x); outline.setAttributeNS(null, "y", y - fillHeight); outline.setAttributeNS(null, "width", iconWidth); outline.setAttributeNS(null, "height", 2 * fillHeight); outline.setAttributeNS(null, "class", "vis-outline"); path = getSVGElement("path", framework.svgElements, framework.svg); path.setAttributeNS(null, "class", group.className); if (group.style !== undefined) { path.setAttributeNS(null, "style", group.style); } path.setAttributeNS(null, "d", "M" + x + "," + y + " L" + (x + iconWidth) + "," + y + ""); if (group.options.shaded.enabled == true) { fillPath = getSVGElement("path", framework.svgElements, framework.svg); if (group.options.shaded.orientation == 'top') { fillPath.setAttributeNS(null, "d", "M" + x + ", " + (y - fillHeight) + "L" + x + "," + y + " L" + (x + iconWidth) + "," + y + " L" + (x + iconWidth) + "," + (y - fillHeight)); } else { fillPath.setAttributeNS(null, "d", "M" + x + "," + y + " " + "L" + x + "," + (y + fillHeight) + " " + "L" + (x + iconWidth) + "," + (y + fillHeight) + "L" + (x + iconWidth) + "," + y); } fillPath.setAttributeNS(null, "class", group.className + " vis-icon-fill"); if (group.options.shaded.style !== undefined && group.options.shaded.style !== "") { fillPath.setAttributeNS(null, "style", group.options.shaded.style); } } if (group.options.drawPoints.enabled == true) { var groupTemplate = { style: group.options.drawPoints.style, styles: group.options.drawPoints.styles, size: group.options.drawPoints.size, className: group.className }; drawPoint(x + 0.5 * iconWidth, y, groupTemplate, framework.svgElements, framework.svg); } }; Line.drawShading = function (pathArray, group, subPathArray, framework) { // append shading to the path if (group.options.shaded.enabled == true) { var svgHeight = Number(framework.svg.style.height.replace('px','')); var fillPath = getSVGElement('path', framework.svgElements, framework.svg); var type = "L"; if (group.options.interpolation.enabled == true){ type = "C"; } var dFill; var zero = 0; if (group.options.shaded.orientation == 'top') { zero = 0; } else if (group.options.shaded.orientation == 'bottom') { zero = svgHeight; } else { zero = Math.min(Math.max(0, group.zeroPosition), svgHeight); } if (group.options.shaded.orientation == 'group' && (subPathArray != null && subPathArray != undefined)) { dFill = 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + this.serializePath(pathArray,type,false) + ' L'+ subPathArray[subPathArray.length-1][0]+ "," + subPathArray[subPathArray.length-1][1] + " " + this.serializePath(subPathArray,type,true) + subPathArray[0][0]+ ","+subPathArray[0][1] + " Z"; } else { dFill = 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + this.serializePath(pathArray,type,false) + ' V' + zero + ' H'+ pathArray[0][0] + " Z"; } fillPath.setAttributeNS(null, 'class', group.className + ' vis-fill'); if (group.options.shaded.style !== undefined) { fillPath.setAttributeNS(null, 'style', group.options.shaded.style); } fillPath.setAttributeNS(null, 'd', dFill); } }; /** * draw a line graph * * @param {Array.<Object>} pathArray * @param {vis.Group} group * @param {{svg: Object, svgElements: Array.<Object>, options: Object, groups: Array.<vis.Group>}} framework */ Line.draw = function (pathArray, group, framework) { if (pathArray != null && pathArray != undefined) { var path = getSVGElement('path', framework.svgElements, framework.svg); path.setAttributeNS(null, "class", group.className); if (group.style !== undefined) { path.setAttributeNS(null, "style", group.style); } var type = "L"; if (group.options.interpolation.enabled == true){ type = "C"; } // copy properties to path for drawing. path.setAttributeNS(null, 'd', 'M' + pathArray[0][0]+ ","+pathArray[0][1] + " " + this.serializePath(pathArray,type,false)); } }; Line.serializePath = function(pathArray,type,inverse){ if (pathArray.length < 2){ //Too little data to create a path. return ""; } var d = type; var i; if (inverse){ for (i = pathArray.length-2; i > 0; i--){ d += pathArray[i][0] + "," + pathArray[i][1] + " "; } } else { for (i = 1; i < pathArray.length; i++){ d += pathArray[i][0] + "," + pathArray[i][1] + " "; } } return d; }; /** * This uses an uniform parametrization of the interpolation algorithm: * 'On the Parameterization of Catmull-Rom Curves' by Cem Yuksel et al. * @param {Array.<Object>} data * @returns {string} * @private */ Line._catmullRomUniform = function (data) { // catmull rom var p0, p1, p2, p3, bp1, bp2; var d = []; d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]); var normalization = 1 / 6; var length = data.length; for (var i = 0; i < length - 1; i++) { p0 = (i == 0) ? data[0] : data[i - 1]; p1 = data[i]; p2 = data[i + 1]; p3 = (i + 2 < length) ? data[i + 2] : p2; // Catmull-Rom to Cubic Bezier conversion matrix // 0 1 0 0 // -1/6 1 1/6 0 // 0 1/6 1 -1/6 // 0 0 1 0 // bp0 = { x: p1.x, y: p1.y }; bp1 = { screen_x: ((-p0.screen_x + 6 * p1.screen_x + p2.screen_x) * normalization), screen_y: ((-p0.screen_y + 6 * p1.screen_y + p2.screen_y) * normalization) }; bp2 = { screen_x: (( p1.screen_x + 6 * p2.screen_x - p3.screen_x) * normalization), screen_y: (( p1.screen_y + 6 * p2.screen_y - p3.screen_y) * normalization) }; // bp0 = { x: p2.x, y: p2.y }; d.push( [ bp1.screen_x , bp1.screen_y ]); d.push( [ bp2.screen_x , bp2.screen_y ]); d.push( [ p2.screen_x , p2.screen_y ]); } return d; }; /** * This uses either the chordal or centripetal parameterization of the catmull-rom algorithm. * By default, the centripetal parameterization is used because this gives the nicest results. * These parameterizations are relatively heavy because the distance between 4 points have to be calculated. * * One optimization can be used to reuse distances since this is a sliding window approach. * @param {Array.<Object>} data * @param {vis.GraphGroup} group * @returns {string} * @private */ Line._catmullRom = function (data, group) { var alpha = group.options.interpolation.alpha; if (alpha == 0 || alpha === undefined) { return this._catmullRomUniform(data); } else { var p0, p1, p2, p3, bp1, bp2, d1, d2, d3, A, B, N, M; var d3powA, d2powA, d3pow2A, d2pow2A, d1pow2A, d1powA; var d = []; d.push( [ Math.round(data[0].screen_x) , Math.round(data[0].screen_y) ]); var length = data.length; for (var i = 0; i < length - 1; i++) { p0 = (i == 0) ? data[0] : data[i - 1]; p1 = data[i]; p2 = data[i + 1]; p3 = (i + 2 < length) ? data[i + 2] : p2; d1 = Math.sqrt(Math.pow(p0.screen_x - p1.screen_x, 2) + Math.pow(p0.screen_y - p1.screen_y, 2)); d2 = Math.sqrt(Math.pow(p1.screen_x - p2.screen_x, 2) + Math.pow(p1.screen_y - p2.screen_y, 2)); d3 = Math.sqrt(Math.pow(p2.screen_x - p3.screen_x, 2) + Math.pow(p2.screen_y - p3.screen_y, 2)); // Catmull-Rom to Cubic Bezier conversion matrix // A = 2d1^2a + 3d1^a * d2^a + d3^2a // B = 2d3^2a + 3d3^a * d2^a + d2^2a // [ 0 1 0 0 ] // [ -d2^2a /N A/N d1^2a /N 0 ] // [ 0 d3^2a /M B/M -d2^2a /M ] // [ 0 0 1 0 ] d3powA = Math.pow(d3, alpha); d3pow2A = Math.pow(d3, 2 * alpha); d2powA = Math.pow(d2, alpha); d2pow2A = Math.pow(d2, 2 * alpha); d1powA = Math.pow(d1, alpha); d1pow2A = Math.pow(d1, 2 * alpha); A = 2 * d1pow2A + 3 * d1powA * d2powA + d2pow2A; B = 2 * d3pow2A + 3 * d3powA * d2powA + d2pow2A; N = 3 * d1powA * (d1powA + d2powA); if (N > 0) { N = 1 / N; } M = 3 * d3powA * (d3powA + d2powA); if (M > 0) { M = 1 / M; } bp1 = { screen_x: ((-d2pow2A * p0.screen_x + A * p1.screen_x + d1pow2A * p2.screen_x) * N), screen_y: ((-d2pow2A * p0.screen_y + A * p1.screen_y + d1pow2A * p2.screen_y) * N) }; bp2 = { screen_x: (( d3pow2A * p1.screen_x + B * p2.screen_x - d2pow2A * p3.screen_x) * M), screen_y: (( d3pow2A * p1.screen_y + B * p2.screen_y - d2pow2A * p3.screen_y) * M) }; if (bp1.screen_x == 0 && bp1.screen_y == 0) { bp1 = p1; } if (bp2.screen_x == 0 && bp2.screen_y == 0) { bp2 = p2; } d.push( [ bp1.screen_x , bp1.screen_y ]); d.push( [ bp2.screen_x , bp2.screen_y ]); d.push( [ p2.screen_x , p2.screen_y ]); } return d; } }; /** * this generates the SVG path for a linear drawing between datapoints. * @param {Array.<Object>} data * @returns {string} * @private */ Line._linear = function (data) { // linear var d = []; for (var i = 0; i < data.length; i++) { d.push([ data[i].screen_x , data[i].screen_y ]); } return d; }; /** * /** * @param {object} group | the object of the group from the dataset * @param {string} groupId | ID of the group * @param {object} options | the default options * @param {array} groupsUsingDefaultStyles | this array has one entree. * It is passed as an array so it is passed by reference. * It enumerates through the default styles * @constructor GraphGroup */ function GraphGroup(group, groupId, options, groupsUsingDefaultStyles) { this.id = groupId; var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'drawPoints', 'shaded', 'interpolation', 'zIndex','excludeFromStacking', 'excludeFromLegend']; this.options = util$3.selectiveBridgeObject(fields, options); this.usingDefaultStyle = group.className === undefined; this.groupsUsingDefaultStyles = groupsUsingDefaultStyles; this.zeroPosition = 0; this.update(group); if (this.usingDefaultStyle == true) { this.groupsUsingDefaultStyles[0] += 1; } this.itemsData = []; this.visible = group.visible === undefined ? true : group.visible; } /** * this loads a reference to all items in this group into this group. * @param {array} items */ GraphGroup.prototype.setItems = function (items) { if (items != null) { this.itemsData = items; if (this.options.sort == true) { util$3.insertSort(this.itemsData,function (a, b) { return a.x > b.x ? 1 : -1; }); } } else { this.itemsData = []; } }; GraphGroup.prototype.getItems = function () { return this.itemsData; }; /** * this is used for barcharts and shading, this way, we only have to calculate it once. * @param {number} pos */ GraphGroup.prototype.setZeroPosition = function (pos) { this.zeroPosition = pos; }; /** * set the options of the graph group over the default options. * @param {Object} options */ GraphGroup.prototype.setOptions = function (options) { if (options !== undefined) { var fields = ['sampling', 'style', 'sort', 'yAxisOrientation', 'barChart', 'zIndex','excludeFromStacking', 'excludeFromLegend']; util$3.selectiveDeepExtend(fields, this.options, options); // if the group's drawPoints is a function delegate the callback to the onRender property if (typeof options.drawPoints == 'function') { options.drawPoints = { onRender: options.drawPoints }; } util$3.mergeOptions(this.options, options, 'interpolation'); util$3.mergeOptions(this.options, options, 'drawPoints'); util$3.mergeOptions(this.options, options, 'shaded'); if (options.interpolation) { if (typeof options.interpolation == 'object') { if (options.interpolation.parametrization) { if (options.interpolation.parametrization == 'uniform') { this.options.interpolation.alpha = 0; } else if (options.interpolation.parametrization == 'chordal') { this.options.interpolation.alpha = 1.0; } else { this.options.interpolation.parametrization = 'centripetal'; this.options.interpolation.alpha = 0.5; } } } } } }; /** * this updates the current group class with the latest group dataset entree, used in _updateGroup in linegraph * @param {vis.Group} group */ GraphGroup.prototype.update = function (group) { this.group = group; this.content = group.content || 'graph'; this.className = group.className || this.className || 'vis-graph-group' + this.groupsUsingDefaultStyles[0] % 10; this.visible = group.visible === undefined ? true : group.visible; this.style = group.style; this.setOptions(group.options); }; /** * return the legend entree for this group. * * @param {number} iconWidth * @param {number} iconHeight * @param {{svg: (*|Element), svgElements: Object, options: Object, groups: Array.<Object>}} framework * @param {number} x * @param {number} y * @returns {{icon: (*|Element), label: (*|string), orientation: *}} */ GraphGroup.prototype.getLegend = function (iconWidth, iconHeight, framework, x, y) { if (framework == undefined || framework == null) { var svg = document.createElementNS('http://www.w3.org/2000/svg', "svg"); framework = {svg: svg, svgElements:{}, options: this.options, groups: [this]}; } if (x == undefined || x == null){ x = 0; } if (y == undefined || y == null){ y = 0.5 * iconHeight; } switch (this.options.style){ case "line": Line.drawIcon(this, x, y, iconWidth, iconHeight, framework); break; case "points": //explicit no break case "point": Points.drawIcon(this, x, y, iconWidth, iconHeight, framework); break; case "bar": Bargraph.drawIcon(this, x, y, iconWidth, iconHeight, framework); break; } return {icon: framework.svg, label: this.content, orientation: this.options.yAxisOrientation}; }; GraphGroup.prototype.getYRange = function (groupData) { var yMin = groupData[0].y; var yMax = groupData[0].y; for (var j = 0; j < groupData.length; j++) { yMin = yMin > groupData[j].y ? groupData[j].y : yMin; yMax = yMax < groupData[j].y ? groupData[j].y : yMax; } return {min: yMin, max: yMax, yAxisOrientation: this.options.yAxisOrientation}; }; /** * Legend for Graph2d * * @param {vis.Graph2d.body} body * @param {vis.Graph2d.options} options * @param {number} side * @param {vis.LineGraph.options} linegraphOptions * @constructor Legend * @extends Component */ function Legend(body, options, side, linegraphOptions) { this.body = body; this.defaultOptions = { enabled: false, icons: true, iconSize: 20, iconSpacing: 6, left: { visible: true, position: 'top-left' // top/bottom - left,center,right }, right: { visible: true, position: 'top-right' // top/bottom - left,center,right } }; this.side = side; this.options = util$3.extend({}, this.defaultOptions); this.linegraphOptions = linegraphOptions; this.svgElements = {}; this.dom = {}; this.groups = {}; this.amountOfGroups = 0; this._create(); this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; this.setOptions(options); } Legend.prototype = new Component(); Legend.prototype.clear = function() { this.groups = {}; this.amountOfGroups = 0; }; Legend.prototype.addGroup = function(label, graphOptions) { // Include a group only if the group option 'excludeFromLegend: false' is not set. if (graphOptions.options.excludeFromLegend != true) { if (!this.groups.hasOwnProperty(label)) { this.groups[label] = graphOptions; } this.amountOfGroups += 1; } }; Legend.prototype.updateGroup = function(label, graphOptions) { this.groups[label] = graphOptions; }; Legend.prototype.removeGroup = function(label) { if (this.groups.hasOwnProperty(label)) { delete this.groups[label]; this.amountOfGroups -= 1; } }; Legend.prototype._create = function() { this.dom.frame = document.createElement('div'); this.dom.frame.className = 'vis-legend'; this.dom.frame.style.position = "absolute"; this.dom.frame.style.top = "10px"; this.dom.frame.style.display = "block"; this.dom.textArea = document.createElement('div'); this.dom.textArea.className = 'vis-legend-text'; this.dom.textArea.style.position = "relative"; this.dom.textArea.style.top = "0px"; this.svg = document.createElementNS('http://www.w3.org/2000/svg',"svg"); this.svg.style.position = 'absolute'; this.svg.style.top = 0 +'px'; this.svg.style.width = this.options.iconSize + 5 + 'px'; this.svg.style.height = '100%'; this.dom.frame.appendChild(this.svg); this.dom.frame.appendChild(this.dom.textArea); }; /** * Hide the component from the DOM */ Legend.prototype.hide = function() { // remove the frame containing the items if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); } }; /** * Show the component in the DOM (when not already visible). */ Legend.prototype.show = function() { // show frame containing the items if (!this.dom.frame.parentNode) { this.body.dom.center.appendChild(this.dom.frame); } }; Legend.prototype.setOptions = function(options) { var fields = ['enabled','orientation','icons','left','right']; util$3.selectiveDeepExtend(fields, this.options, options); }; Legend.prototype.redraw = function() { var activeGroups = 0; var groupArray = Object.keys(this.groups); groupArray.sort(function (a,b) { return (a < b ? -1 : 1); }); for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { activeGroups++; } } if (this.options[this.side].visible == false || this.amountOfGroups == 0 || this.options.enabled == false || activeGroups == 0) { this.hide(); } else { this.show(); if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'bottom-left') { this.dom.frame.style.left = '4px'; this.dom.frame.style.textAlign = "left"; this.dom.textArea.style.textAlign = "left"; this.dom.textArea.style.left = (this.options.iconSize + 15) + 'px'; this.dom.textArea.style.right = ''; this.svg.style.left = 0 +'px'; this.svg.style.right = ''; } else { this.dom.frame.style.right = '4px'; this.dom.frame.style.textAlign = "right"; this.dom.textArea.style.textAlign = "right"; this.dom.textArea.style.right = (this.options.iconSize + 15) + 'px'; this.dom.textArea.style.left = ''; this.svg.style.right = 0 +'px'; this.svg.style.left = ''; } if (this.options[this.side].position == 'top-left' || this.options[this.side].position == 'top-right') { this.dom.frame.style.top = 4 - Number(this.body.dom.center.style.top.replace("px","")) + 'px'; this.dom.frame.style.bottom = ''; } else { var scrollableHeight = this.body.domProps.center.height - this.body.domProps.centerContainer.height; this.dom.frame.style.bottom = 4 + scrollableHeight + Number(this.body.dom.center.style.top.replace("px","")) + 'px'; this.dom.frame.style.top = ''; } if (this.options.icons == false) { this.dom.frame.style.width = this.dom.textArea.offsetWidth + 10 + 'px'; this.dom.textArea.style.right = ''; this.dom.textArea.style.left = ''; this.svg.style.width = '0px'; } else { this.dom.frame.style.width = this.options.iconSize + 15 + this.dom.textArea.offsetWidth + 10 + 'px'; this.drawLegendIcons(); } var content = ''; for (i = 0; i < groupArray.length; i++) { groupId = groupArray[i]; if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { content += this.groups[groupId].content + '<br />'; } } this.dom.textArea.innerHTML = util$3.xss(content); this.dom.textArea.style.lineHeight = ((0.75 * this.options.iconSize) + this.options.iconSpacing) + 'px'; } }; Legend.prototype.drawLegendIcons = function() { if (this.dom.frame.parentNode) { var groupArray = Object.keys(this.groups); groupArray.sort(function (a,b) { return (a < b ? -1 : 1); }); // this resets the elements so the order is maintained resetElements(this.svgElements); var padding = window.getComputedStyle(this.dom.frame).paddingTop; var iconOffset = Number(padding.replace('px','')); var x = iconOffset; var iconWidth = this.options.iconSize; var iconHeight = 0.75 * this.options.iconSize; var y = iconOffset + 0.5 * iconHeight + 3; this.svg.style.width = iconWidth + 5 + iconOffset + 'px'; for (var i = 0; i < groupArray.length; i++) { var groupId = groupArray[i]; if (this.groups[groupId].visible == true && (this.linegraphOptions.visibility[groupId] === undefined || this.linegraphOptions.visibility[groupId] == true)) { this.groups[groupId].getLegend(iconWidth, iconHeight, this.framework, x, y); y += iconHeight + this.options.iconSpacing; } } } }; var UNGROUPED$3 = '__ungrouped__'; // reserved group id for ungrouped items /** * This is the constructor of the LineGraph. It requires a Timeline body and options. * * @param {vis.Timeline.body} body * @param {Object} options * @constructor LineGraph * @extends Component */ function LineGraph(body, options) { this.id = dist.v4(); this.body = body; this.defaultOptions = { yAxisOrientation: 'left', defaultGroup: 'default', sort: true, sampling: true, stack: false, graphHeight: '400px', shaded: { enabled: false, orientation: 'bottom' // top, bottom, zero }, style: 'line', // line, bar barChart: { width: 50, sideBySide: false, align: 'center' // left, center, right }, interpolation: { enabled: true, parametrization: 'centripetal', // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) alpha: 0.5 }, drawPoints: { enabled: true, size: 6, style: 'square' // square, circle }, dataAxis: {}, //Defaults are done on DataAxis level legend: {}, //Defaults are done on Legend level groups: { visibility: {} } }; // options is shared by this lineGraph and all its items this.options = util$3.extend({}, this.defaultOptions); this.dom = {}; this.props = {}; this.hammer = null; this.groups = {}; this.abortedGraphUpdate = false; this.updateSVGheight = false; this.updateSVGheightOnResize = false; this.forceGraphUpdate = true; var me = this; this.itemsData = null; // DataSet this.groupsData = null; // DataSet // listeners for the DataSet of the items this.itemListeners = { 'add': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onAdd(params.items); }, 'update': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onUpdate(params.items); }, 'remove': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onRemove(params.items); } }; // listeners for the DataSet of the groups this.groupListeners = { 'add': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onAddGroups(params.items); }, 'update': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onUpdateGroups(params.items); }, 'remove': function (event, params, senderId) { // eslint-disable-line no-unused-vars me._onRemoveGroups(params.items); } }; this.items = {}; // object with an Item for every data item this.selection = []; // list with the ids of all selected nodes this.lastStart = this.body.range.start; this.touchParams = {}; // stores properties while dragging this.svgElements = {}; this.setOptions(options); this.groupsUsingDefaultStyles = [0]; this.body.emitter.on('rangechanged', function () { me.svg.style.left = util$3.option.asSize(-me.props.width); me.forceGraphUpdate = true; //Is this local redraw necessary? (Core also does a change event!) me.redraw.call(me); }); // create the HTML DOM this._create(); this.framework = {svg: this.svg, svgElements: this.svgElements, options: this.options, groups: this.groups}; } LineGraph.prototype = new Component(); /** * Create the HTML DOM for the ItemSet */ LineGraph.prototype._create = function () { var frame = document.createElement('div'); frame.className = 'vis-line-graph'; this.dom.frame = frame; // create svg element for graph drawing. this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); this.svg.style.position = 'relative'; this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px'; this.svg.style.display = 'block'; frame.appendChild(this.svg); // data axis this.options.dataAxis.orientation = 'left'; this.yAxisLeft = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); this.options.dataAxis.orientation = 'right'; this.yAxisRight = new DataAxis(this.body, this.options.dataAxis, this.svg, this.options.groups); delete this.options.dataAxis.orientation; // legends this.legendLeft = new Legend(this.body, this.options.legend, 'left', this.options.groups); this.legendRight = new Legend(this.body, this.options.legend, 'right', this.options.groups); this.show(); }; /** * set the options of the LineGraph. the mergeOptions is used for subObjects that have an enabled element. * @param {object} options */ LineGraph.prototype.setOptions = function (options) { if (options) { var fields = ['sampling', 'defaultGroup', 'stack', 'height', 'graphHeight', 'yAxisOrientation', 'style', 'barChart', 'dataAxis', 'sort', 'groups']; if (options.graphHeight === undefined && options.height !== undefined) { this.updateSVGheight = true; this.updateSVGheightOnResize = true; } else if (this.body.domProps.centerContainer.height !== undefined && options.graphHeight !== undefined) { if (parseInt((options.graphHeight + '').replace("px", '')) < this.body.domProps.centerContainer.height) { this.updateSVGheight = true; } } util$3.selectiveDeepExtend(fields, this.options, options); util$3.mergeOptions(this.options, options, 'interpolation'); util$3.mergeOptions(this.options, options, 'drawPoints'); util$3.mergeOptions(this.options, options, 'shaded'); util$3.mergeOptions(this.options, options, 'legend'); if (options.interpolation) { if (typeof options.interpolation == 'object') { if (options.interpolation.parametrization) { if (options.interpolation.parametrization == 'uniform') { this.options.interpolation.alpha = 0; } else if (options.interpolation.parametrization == 'chordal') { this.options.interpolation.alpha = 1.0; } else { this.options.interpolation.parametrization = 'centripetal'; this.options.interpolation.alpha = 0.5; } } } } if (this.yAxisLeft) { if (options.dataAxis !== undefined) { this.yAxisLeft.setOptions(this.options.dataAxis); this.yAxisRight.setOptions(this.options.dataAxis); } } if (this.legendLeft) { if (options.legend !== undefined) { this.legendLeft.setOptions(this.options.legend); this.legendRight.setOptions(this.options.legend); } } if (this.groups.hasOwnProperty(UNGROUPED$3)) { this.groups[UNGROUPED$3].setOptions(options); } } // this is used to redraw the graph if the visibility of the groups is changed. if (this.dom.frame) { //not on initial run? this.forceGraphUpdate=true; this.body.emitter.emit("_change",{queue: true}); } }; /** * Hide the component from the DOM */ LineGraph.prototype.hide = function () { // remove the frame containing the items if (this.dom.frame.parentNode) { this.dom.frame.parentNode.removeChild(this.dom.frame); } }; /** * Show the component in the DOM (when not already visible). */ LineGraph.prototype.show = function () { // show frame containing the items if (!this.dom.frame.parentNode) { this.body.dom.center.appendChild(this.dom.frame); } }; /** * Set items * @param {vis.DataSet | null} items */ LineGraph.prototype.setItems = function (items) { var me = this, ids, oldItemsData = this.itemsData; // replace the dataset if (!items) { this.itemsData = null; } else if (isDataViewLike("id", items)) { this.itemsData = typeCoerceDataSet(items); } else { throw new TypeError('Data must implement the interface of DataSet or DataView'); } if (oldItemsData) { // unsubscribe from old dataset util$3.forEach(this.itemListeners, function (callback, event) { oldItemsData.off(event, callback); }); // stop maintaining a coerced version of the old data set oldItemsData.dispose(); // remove all drawn items ids = oldItemsData.getIds(); this._onRemove(ids); } if (this.itemsData) { // subscribe to new dataset var id = this.id; util$3.forEach(this.itemListeners, function (callback, event) { me.itemsData.on(event, callback, id); }); // add all new items ids = this.itemsData.getIds(); this._onAdd(ids); } }; /** * Set groups * @param {vis.DataSet} groups */ LineGraph.prototype.setGroups = function (groups) { var me = this; var ids; // unsubscribe from current dataset if (this.groupsData) { util$3.forEach(this.groupListeners, function (callback, event) { me.groupsData.off(event, callback); }); // remove all drawn groups ids = this.groupsData.getIds(); this.groupsData = null; for (var i = 0; i < ids.length; i++) { this._removeGroup(ids[i]); } } // replace the dataset if (!groups) { this.groupsData = null; } else if (isDataViewLike("id", groups)) { this.groupsData = groups; } else { throw new TypeError('Data must implement the interface of DataSet or DataView'); } if (this.groupsData) { // subscribe to new dataset var id = this.id; util$3.forEach(this.groupListeners, function (callback, event) { me.groupsData.on(event, callback, id); }); // draw all ms ids = this.groupsData.getIds(); this._onAddGroups(ids); } }; LineGraph.prototype._onUpdate = function (ids) { this._updateAllGroupData(ids); }; LineGraph.prototype._onAdd = function (ids) { this._onUpdate(ids); }; LineGraph.prototype._onRemove = function (ids) { this._onUpdate(ids); }; LineGraph.prototype._onUpdateGroups = function (groupIds) { this._updateAllGroupData(null, groupIds); }; LineGraph.prototype._onAddGroups = function (groupIds) { this._onUpdateGroups(groupIds); }; /** * this cleans the group out off the legends and the dataaxis, updates the ungrouped and updates the graph * @param {Array} groupIds * @private */ LineGraph.prototype._onRemoveGroups = function (groupIds) { for (var i = 0; i < groupIds.length; i++) { this._removeGroup(groupIds[i]); } this.forceGraphUpdate = true; this.body.emitter.emit("_change",{queue: true}); }; /** * this cleans the group out off the legends and the dataaxis * @param {vis.GraphGroup.id} groupId * @private */ LineGraph.prototype._removeGroup = function (groupId) { if (this.groups.hasOwnProperty(groupId)) { if (this.groups[groupId].options.yAxisOrientation == 'right') { this.yAxisRight.removeGroup(groupId); this.legendRight.removeGroup(groupId); this.legendRight.redraw(); } else { this.yAxisLeft.removeGroup(groupId); this.legendLeft.removeGroup(groupId); this.legendLeft.redraw(); } delete this.groups[groupId]; } }; /** * update a group object with the group dataset entree * * @param {vis.GraphGroup} group * @param {vis.GraphGroup.id} groupId * @private */ LineGraph.prototype._updateGroup = function (group, groupId) { if (!this.groups.hasOwnProperty(groupId)) { this.groups[groupId] = new GraphGroup(group, groupId, this.options, this.groupsUsingDefaultStyles); if (this.groups[groupId].options.yAxisOrientation == 'right') { this.yAxisRight.addGroup(groupId, this.groups[groupId]); this.legendRight.addGroup(groupId, this.groups[groupId]); } else { this.yAxisLeft.addGroup(groupId, this.groups[groupId]); this.legendLeft.addGroup(groupId, this.groups[groupId]); } } else { this.groups[groupId].update(group); if (this.groups[groupId].options.yAxisOrientation == 'right') { this.yAxisRight.updateGroup(groupId, this.groups[groupId]); this.legendRight.updateGroup(groupId, this.groups[groupId]); //If yAxisOrientation changed, clean out the group from the other axis. this.yAxisLeft.removeGroup(groupId); this.legendLeft.removeGroup(groupId); } else { this.yAxisLeft.updateGroup(groupId, this.groups[groupId]); this.legendLeft.updateGroup(groupId, this.groups[groupId]); //If yAxisOrientation changed, clean out the group from the other axis. this.yAxisRight.removeGroup(groupId); this.legendRight.removeGroup(groupId); } } this.legendLeft.redraw(); this.legendRight.redraw(); }; /** * this updates all groups, it is used when there is an update the the itemset. * * @param {Array} ids * @param {Array} groupIds * @private */ LineGraph.prototype._updateAllGroupData = function (ids, groupIds) { if (this.itemsData != null) { var groupsContent = {}; var items = this.itemsData.get(); var fieldId = this.itemsData.idProp; var idMap = {}; if (ids){ ids.map(function (id) { idMap[id] = id; }); } //pre-Determine array sizes, for more efficient memory claim var groupCounts = {}; for (var i = 0; i < items.length; i++) { var item = items[i]; var groupId = item.group; if (groupId === null || groupId === undefined) { groupId = UNGROUPED$3; } groupCounts.hasOwnProperty(groupId) ? groupCounts[groupId]++ : groupCounts[groupId] = 1; } //Pre-load arrays from existing groups if items are not changed (not in ids) var existingItemsMap = {}; if (!groupIds && ids) { for (groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { group = this.groups[groupId]; var existing_items = group.getItems(); groupsContent[groupId] = existing_items.filter(function (item) { existingItemsMap[item[fieldId]] = item[fieldId]; return (item[fieldId] !== idMap[item[fieldId]]); }); var newLength = groupCounts[groupId]; groupCounts[groupId] -= groupsContent[groupId].length; if (groupsContent[groupId].length < newLength) { groupsContent[groupId][newLength - 1] = {}; } } } } //Now insert data into the arrays. for (i = 0; i < items.length; i++) { item = items[i]; groupId = item.group; if (groupId === null || groupId === undefined) { groupId = UNGROUPED$3; } if (!groupIds && ids && (item[fieldId] !== idMap[item[fieldId]]) && existingItemsMap.hasOwnProperty(item[fieldId])) { continue; } if (!groupsContent.hasOwnProperty(groupId)) { groupsContent[groupId] = new Array(groupCounts[groupId]); } //Copy data (because of unmodifiable DataView input. var extended = util$3.bridgeObject(item); extended.x = util$3.convert(item.x, 'Date'); extended.end = util$3.convert(item.end, 'Date'); extended.orginalY = item.y; //real Y extended.y = Number(item.y); extended[fieldId] = item[fieldId]; var index= groupsContent[groupId].length - groupCounts[groupId]--; groupsContent[groupId][index] = extended; } //Make sure all groups are present, to allow removal of old groups for (groupId in this.groups){ if (this.groups.hasOwnProperty(groupId)){ if (!groupsContent.hasOwnProperty(groupId)) { groupsContent[groupId] = new Array(0); } } } //Update legendas, style and axis for (groupId in groupsContent) { if (groupsContent.hasOwnProperty(groupId)) { if (groupsContent[groupId].length == 0) { if (this.groups.hasOwnProperty(groupId)) { this._removeGroup(groupId); } } else { var group = undefined; if (this.groupsData != undefined) { group = this.groupsData.get(groupId); } if (group == undefined) { group = {id: groupId, content: this.options.defaultGroup + groupId}; } this._updateGroup(group, groupId); this.groups[groupId].setItems(groupsContent[groupId]); } } } this.forceGraphUpdate = true; this.body.emitter.emit("_change",{queue: true}); } }; /** * Redraw the component, mandatory function * @return {boolean} Returns true if the component is resized */ LineGraph.prototype.redraw = function () { var resized = false; // calculate actual size and position this.props.width = this.dom.frame.offsetWidth; this.props.height = this.body.domProps.centerContainer.height - this.body.domProps.border.top - this.body.domProps.border.bottom; // check if this component is resized resized = this._isResized() || resized; // check whether zoomed (in that case we need to re-stack everything) var visibleInterval = this.body.range.end - this.body.range.start; var zoomed = (visibleInterval != this.lastVisibleInterval); this.lastVisibleInterval = visibleInterval; // the svg element is three times as big as the width, this allows for fully dragging left and right // without reloading the graph. the controls for this are bound to events in the constructor if (resized == true) { this.svg.style.width = util$3.option.asSize(3 * this.props.width); this.svg.style.left = util$3.option.asSize(-this.props.width); // if the height of the graph is set as proportional, change the height of the svg if ((this.options.height + '').indexOf("%") != -1 || this.updateSVGheightOnResize == true) { this.updateSVGheight = true; } } // update the height of the graph on each redraw of the graph. if (this.updateSVGheight == true) { if (this.options.graphHeight != this.props.height + 'px') { this.options.graphHeight = this.props.height + 'px'; this.svg.style.height = this.props.height + 'px'; } this.updateSVGheight = false; } else { this.svg.style.height = ('' + this.options.graphHeight).replace('px', '') + 'px'; } // zoomed is here to ensure that animations are shown correctly. if (resized == true || zoomed == true || this.abortedGraphUpdate == true || this.forceGraphUpdate == true) { resized = this._updateGraph() || resized; this.forceGraphUpdate = false; this.lastStart = this.body.range.start; this.svg.style.left = (-this.props.width) + 'px'; } else { // move the whole svg while dragging if (this.lastStart != 0) { var offset = this.body.range.start - this.lastStart; var range = this.body.range.end - this.body.range.start; if (this.props.width != 0) { var rangePerPixelInv = this.props.width / range; var xOffset = offset * rangePerPixelInv; this.svg.style.left = (-this.props.width - xOffset) + 'px'; } } } this.legendLeft.redraw(); this.legendRight.redraw(); return resized; }; LineGraph.prototype._getSortedGroupIds = function(){ // getting group Ids var grouplist = []; for (var groupId in this.groups) { if (this.groups.hasOwnProperty(groupId)) { var group = this.groups[groupId]; if (group.visible == true && (this.options.groups.visibility[groupId] === undefined || this.options.groups.visibility[groupId] == true)) { grouplist.push({id:groupId,zIndex:group.options.zIndex}); } } } util$3.insertSort(grouplist,function(a,b){ var az = a.zIndex; var bz = b.zIndex; if (az === undefined) az=0; if (bz === undefined) bz=0; return az==bz? 0: (az<bz ? -1: 1); }); var groupIds = new Array(grouplist.length); for (var i=0; i< grouplist.length; i++){ groupIds[i] = grouplist[i].id; } return groupIds; }; /** * Update and redraw the graph. * * @returns {boolean} * @private */ LineGraph.prototype._updateGraph = function () { // reset the svg elements prepareElements(this.svgElements); if (this.props.width != 0 && this.itemsData != null) { var group, i; var groupRanges = {}; var changeCalled = false; // this is the range of the SVG canvas var minDate = this.body.util.toGlobalTime(-this.body.domProps.root.width); var maxDate = this.body.util.toGlobalTime(2 * this.body.domProps.root.width); // getting group Ids var groupIds = this._getSortedGroupIds(); if (groupIds.length > 0) { var groupsData = {}; // fill groups data, this only loads the data we require based on the timewindow this._getRelevantData(groupIds, groupsData, minDate, maxDate); // apply sampling, if disabled, it will pass through this function. this._applySampling(groupIds, groupsData); // we transform the X coordinates to detect collisions for (i = 0; i < groupIds.length; i++) { this._convertXcoordinates(groupsData[groupIds[i]]); } // now all needed data has been collected we start the processing. this._getYRanges(groupIds, groupsData, groupRanges); // update the Y axis first, we use this data to draw at the correct Y points changeCalled = this._updateYAxis(groupIds, groupRanges); // at changeCalled, abort this update cycle as the graph needs another update with new Width input from the Redraw container. // Cleanup SVG elements on abort. if (changeCalled == true) { cleanupElements(this.svgElements); this.abortedGraphUpdate = true; return true; } this.abortedGraphUpdate = false; // With the yAxis scaled correctly, use this to get the Y values of the points. var below = undefined; for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (this.options.stack === true && this.options.style === 'line') { if (group.options.excludeFromStacking == undefined || !group.options.excludeFromStacking) { if (below != undefined) { this._stack(groupsData[group.id], groupsData[below.id]); if (group.options.shaded.enabled == true && group.options.shaded.orientation !== "group"){ if (group.options.shaded.orientation == "top" && below.options.shaded.orientation !== "group"){ below.options.shaded.orientation="group"; below.options.shaded.groupId=group.id; } else { group.options.shaded.orientation="group"; group.options.shaded.groupId=below.id; } } } below = group; } } this._convertYcoordinates(groupsData[groupIds[i]], group); } //Precalculate paths and draw shading if appropriate. This will make sure the shading is always behind any lines. var paths = {}; for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (group.options.style === 'line' && group.options.shaded.enabled == true) { var dataset = groupsData[groupIds[i]]; if (dataset == null || dataset.length == 0) { continue; } if (!paths.hasOwnProperty(groupIds[i])) { paths[groupIds[i]] = Line.calcPath(dataset, group); } if (group.options.shaded.orientation === "group") { var subGroupId = group.options.shaded.groupId; if (groupIds.indexOf(subGroupId) === -1) { console.log(group.id + ": Unknown shading group target given:" + subGroupId); continue; } if (!paths.hasOwnProperty(subGroupId)) { paths[subGroupId] = Line.calcPath(groupsData[subGroupId], this.groups[subGroupId]); } Line.drawShading(paths[groupIds[i]], group, paths[subGroupId], this.framework); } else { Line.drawShading(paths[groupIds[i]], group, undefined, this.framework); } } } // draw the groups, calculating paths if still necessary. Bargraph.draw(groupIds, groupsData, this.framework); for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (groupsData[groupIds[i]].length > 0) { switch (group.options.style) { case "line": if (!paths.hasOwnProperty(groupIds[i])) { paths[groupIds[i]] = Line.calcPath(groupsData[groupIds[i]], group); } Line.draw(paths[groupIds[i]], group, this.framework); // eslint-disable-line no-fallthrough case "point": // eslint-disable-line no-fallthrough case "points": if (group.options.style == "point" || group.options.style == "points" || group.options.drawPoints.enabled == true) { Points.draw(groupsData[groupIds[i]], group, this.framework); } break; //do nothing... } } } } } // cleanup unused svg elements cleanupElements(this.svgElements); return false; }; LineGraph.prototype._stack = function (data, subData) { var index, dx, dy, subPrevPoint, subNextPoint; index = 0; // for each data point we look for a matching on in the set below for (var j = 0; j < data.length; j++) { subPrevPoint = undefined; subNextPoint = undefined; // we look for time matches or a before-after point for (var k = index; k < subData.length; k++) { // if times match exactly if (subData[k].x === data[j].x) { subPrevPoint = subData[k]; subNextPoint = subData[k]; index = k; break; } else if (subData[k].x > data[j].x) { // overshoot subNextPoint = subData[k]; if (k == 0) { subPrevPoint = subNextPoint; } else { subPrevPoint = subData[k - 1]; } index = k; break; } } // in case the last data point has been used, we assume it stays like this. if (subNextPoint === undefined) { subPrevPoint = subData[subData.length - 1]; subNextPoint = subData[subData.length - 1]; } // linear interpolation dx = subNextPoint.x - subPrevPoint.x; dy = subNextPoint.y - subPrevPoint.y; if (dx == 0) { data[j].y = data[j].orginalY + subNextPoint.y; } else { data[j].y = data[j].orginalY + (dy / dx) * (data[j].x - subPrevPoint.x) + subPrevPoint.y; // ax + b where b is data[j].y } } }; /** * first select and preprocess the data from the datasets. * the groups have their preselection of data, we now loop over this data to see * what data we need to draw. Sorted data is much faster. * more optimization is possible by doing the sampling before and using the binary search * to find the end date to determine the increment. * * @param {array} groupIds * @param {object} groupsData * @param {date} minDate * @param {date} maxDate * @private */ LineGraph.prototype._getRelevantData = function (groupIds, groupsData, minDate, maxDate) { var group, i, j, item; if (groupIds.length > 0) { for (i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; var itemsData = group.getItems(); // optimization for sorted data if (group.options.sort == true) { var dateComparator = function (a, b) { return a.getTime() == b.getTime() ? 0 : a < b ? -1 : 1 }; var first = Math.max(0, util$3.binarySearchValue(itemsData, minDate, 'x', 'before', dateComparator)); var last = Math.min(itemsData.length, util$3.binarySearchValue(itemsData, maxDate, 'x', 'after', dateComparator) + 1); if (last <= 0) { last = itemsData.length; } var dataContainer = new Array(last-first); for (j = first; j < last; j++) { item = group.itemsData[j]; dataContainer[j-first] = item; } groupsData[groupIds[i]] = dataContainer; } else { // If unsorted data, all data is relevant, just returning entire structure groupsData[groupIds[i]] = group.itemsData; } } } }; /** * * @param {Array.<vis.GraphGroup.id>} groupIds * @param {vis.DataSet} groupsData * @private */ LineGraph.prototype._applySampling = function (groupIds, groupsData) { var group; if (groupIds.length > 0) { for (var i = 0; i < groupIds.length; i++) { group = this.groups[groupIds[i]]; if (group.options.sampling == true) { var dataContainer = groupsData[groupIds[i]]; if (dataContainer.length > 0) { var increment = 1; var amountOfPoints = dataContainer.length; // the global screen is used because changing the width of the yAxis may affect the increment, resulting in an endless loop // of width changing of the yAxis. //TODO: This assumes sorted data, but that's not guaranteed! var xDistance = this.body.util.toGlobalScreen(dataContainer[dataContainer.length - 1].x) - this.body.util.toGlobalScreen(dataContainer[0].x); var pointsPerPixel = amountOfPoints / xDistance; increment = Math.min(Math.ceil(0.2 * amountOfPoints), Math.max(1, Math.round(pointsPerPixel))); var sampledData = new Array(amountOfPoints); for (var j = 0; j < amountOfPoints; j += increment) { var idx = Math.round(j/increment); sampledData[idx]=dataContainer[j]; } groupsData[groupIds[i]] = sampledData.splice(0,Math.round(amountOfPoints/increment)); } } } } }; /** * * @param {Array.<vis.GraphGroup.id>} groupIds * @param {vis.DataSet} groupsData * @param {object} groupRanges | this is being filled here * @private */ LineGraph.prototype._getYRanges = function (groupIds, groupsData, groupRanges) { var groupData, group, i; var combinedDataLeft = []; var combinedDataRight = []; var options; if (groupIds.length > 0) { for (i = 0; i < groupIds.length; i++) { groupData = groupsData[groupIds[i]]; options = this.groups[groupIds[i]].options; if (groupData.length > 0) { group = this.groups[groupIds[i]]; // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. if (options.stack === true && options.style === 'bar') { if (options.yAxisOrientation === 'left') { combinedDataLeft = combinedDataLeft.concat(groupData); } else { combinedDataRight = combinedDataRight.concat(groupData); } } else { groupRanges[groupIds[i]] = group.getYRange(groupData, groupIds[i]); } } } // if bar graphs are stacked, their range need to be handled differently and accumulated over all groups. Bargraph.getStackedYRange(combinedDataLeft, groupRanges, groupIds, '__barStackLeft', 'left'); Bargraph.getStackedYRange(combinedDataRight, groupRanges, groupIds, '__barStackRight', 'right'); } }; /** * this sets the Y ranges for the Y axis. It also determines which of the axis should be shown or hidden. * @param {Array.<vis.GraphGroup.id>} groupIds * @param {Object} groupRanges * @returns {boolean} resized * @private */ LineGraph.prototype._updateYAxis = function (groupIds, groupRanges) { var resized = false; var yAxisLeftUsed = false; var yAxisRightUsed = false; var minLeft = 1e9, minRight = 1e9, maxLeft = -1e9, maxRight = -1e9, minVal, maxVal; // if groups are present if (groupIds.length > 0) { // this is here to make sure that if there are no items in the axis but there are groups, that there is no infinite draw/redraw loop. for (var i = 0; i < groupIds.length; i++) { var group = this.groups[groupIds[i]]; if (group && group.options.yAxisOrientation != 'right') { yAxisLeftUsed = true; minLeft = 1e9; maxLeft = -1e9; } else if (group && group.options.yAxisOrientation) { yAxisRightUsed = true; minRight = 1e9; maxRight = -1e9; } } // if there are items: for (i = 0; i < groupIds.length; i++) { if (groupRanges.hasOwnProperty(groupIds[i])) { if (groupRanges[groupIds[i]].ignore !== true) { minVal = groupRanges[groupIds[i]].min; maxVal = groupRanges[groupIds[i]].max; if (groupRanges[groupIds[i]].yAxisOrientation != 'right') { yAxisLeftUsed = true; minLeft = minLeft > minVal ? minVal : minLeft; maxLeft = maxLeft < maxVal ? maxVal : maxLeft; } else { yAxisRightUsed = true; minRight = minRight > minVal ? minVal : minRight; maxRight = maxRight < maxVal ? maxVal : maxRight; } } } } if (yAxisLeftUsed == true) { this.yAxisLeft.setRange(minLeft, maxLeft); } if (yAxisRightUsed == true) { this.yAxisRight.setRange(minRight, maxRight); } } resized = this._toggleAxisVisiblity(yAxisLeftUsed, this.yAxisLeft) || resized; resized = this._toggleAxisVisiblity(yAxisRightUsed, this.yAxisRight) || resized; if (yAxisRightUsed == true && yAxisLeftUsed == true) { this.yAxisLeft.drawIcons = true; this.yAxisRight.drawIcons = true; } else { this.yAxisLeft.drawIcons = false; this.yAxisRight.drawIcons = false; } this.yAxisRight.master = !yAxisLeftUsed; this.yAxisRight.masterAxis = this.yAxisLeft; if (this.yAxisRight.master == false) { if (yAxisRightUsed == true) { this.yAxisLeft.lineOffset = this.yAxisRight.width; } else { this.yAxisLeft.lineOffset = 0; } resized = this.yAxisLeft.redraw() || resized; resized = this.yAxisRight.redraw() || resized; } else { resized = this.yAxisRight.redraw() || resized; } // clean the accumulated lists var tempGroups = ['__barStackLeft', '__barStackRight', '__lineStackLeft', '__lineStackRight']; for (i = 0; i < tempGroups.length; i++) { if (groupIds.indexOf(tempGroups[i]) != -1) { groupIds.splice(groupIds.indexOf(tempGroups[i]), 1); } } return resized; }; /** * This shows or hides the Y axis if needed. If there is a change, the changed event is emitted by the updateYAxis function * * @param {boolean} axisUsed * @param {vis.DataAxis} axis * @returns {boolean} * @private */ LineGraph.prototype._toggleAxisVisiblity = function (axisUsed, axis) { var changed = false; if (axisUsed == false) { if (axis.dom.frame.parentNode && axis.hidden == false) { axis.hide(); changed = true; } } else { if (!axis.dom.frame.parentNode && axis.hidden == true) { axis.show(); changed = true; } } return changed; }; /** * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for * the yAxis. * * @param {Array.<Object>} datapoints * @private */ LineGraph.prototype._convertXcoordinates = function (datapoints) { var toScreen = this.body.util.toScreen; for (var i = 0; i < datapoints.length; i++) { datapoints[i].screen_x = toScreen(datapoints[i].x) + this.props.width; datapoints[i].screen_y = datapoints[i].y; //starting point for range calculations if (datapoints[i].end != undefined) { datapoints[i].screen_end = toScreen(datapoints[i].end) + this.props.width; } else { datapoints[i].screen_end = undefined; } } }; /** * This uses the DataAxis object to generate the correct X coordinate on the SVG window. It uses the * util function toScreen to get the x coordinate from the timestamp. It also pre-filters the data and get the minMax ranges for * the yAxis. * * @param {Array.<Object>} datapoints * @param {vis.GraphGroup} group * @private */ LineGraph.prototype._convertYcoordinates = function (datapoints, group) { var axis = this.yAxisLeft; var svgHeight = Number(this.svg.style.height.replace('px', '')); if (group.options.yAxisOrientation == 'right') { axis = this.yAxisRight; } for (var i = 0; i < datapoints.length; i++) { datapoints[i].screen_y = Math.round(axis.convertValue(datapoints[i].y)); } group.setZeroPosition(Math.min(svgHeight, axis.convertValue(0))); }; /** * This object contains all possible options. It will check if the types are correct, if required if the option is one * of the allowed values. * * __any__ means that the name of the property does not matter. * __type__ is a required field for all objects and contains the allowed types of all objects */ let string$1 = 'string'; let bool$1 = 'boolean'; let number$1 = 'number'; let array$1 = 'array'; let date$1 = 'date'; let object$1 = 'object'; // should only be in a __type__ property let dom$1 = 'dom'; let moment$2 = 'moment'; let any$1 = 'any'; let allOptions$2 = { configure: { enabled: {'boolean': bool$1}, filter: {'boolean': bool$1,'function': 'function'}, container: {dom: dom$1}, __type__: {object: object$1,'boolean': bool$1,'function': 'function'} }, //globals : alignCurrentTime: {string: string$1, 'undefined': 'undefined'}, yAxisOrientation: {string:['left','right']}, defaultGroup: {string: string$1}, sort: {'boolean': bool$1}, sampling: {'boolean': bool$1}, stack:{'boolean': bool$1}, graphHeight: {string: string$1, number: number$1}, shaded: { enabled: {'boolean': bool$1}, orientation: {string:['bottom','top','zero','group']}, // top, bottom, zero, group groupId: {object: object$1}, __type__: {'boolean': bool$1,object: object$1} }, style: {string:['line','bar','points']}, // line, bar barChart: { width: {number: number$1}, minWidth: {number: number$1}, sideBySide: {'boolean': bool$1}, align: {string:['left','center','right']}, __type__: {object: object$1} }, interpolation: { enabled: {'boolean': bool$1}, parametrization: {string:['centripetal', 'chordal','uniform']}, // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) alpha: {number: number$1}, __type__: {object: object$1,'boolean': bool$1} }, drawPoints: { enabled: {'boolean': bool$1}, onRender: { 'function': 'function' }, size: {number: number$1}, style: {string:['square','circle']}, // square, circle __type__: {object: object$1,'boolean': bool$1,'function': 'function'} }, dataAxis: { showMinorLabels: {'boolean': bool$1}, showMajorLabels: {'boolean': bool$1}, showWeekScale: {'boolean': bool$1}, icons: {'boolean': bool$1}, width: {string: string$1, number: number$1}, visible: {'boolean': bool$1}, alignZeros: {'boolean': bool$1}, left:{ range: {min:{number: number$1,'undefined': 'undefined'},max:{number: number$1,'undefined': 'undefined'},__type__: {object: object$1}}, format: {'function': 'function'}, title: {text:{string: string$1,number: number$1,'undefined': 'undefined'},style:{string: string$1,'undefined': 'undefined'},__type__: {object: object$1}}, __type__: {object: object$1} }, right:{ range: {min:{number: number$1,'undefined': 'undefined'},max:{number: number$1,'undefined': 'undefined'},__type__: {object: object$1}}, format: {'function': 'function'}, title: {text:{string: string$1,number: number$1,'undefined': 'undefined'},style:{string: string$1,'undefined': 'undefined'},__type__: {object: object$1}}, __type__: {object: object$1} }, __type__: {object: object$1} }, legend: { enabled: {'boolean': bool$1}, icons: {'boolean': bool$1}, left: { visible: {'boolean': bool$1}, position: {string:['top-right','bottom-right','top-left','bottom-left']}, __type__: {object: object$1} }, right: { visible: {'boolean': bool$1}, position: {string:['top-right','bottom-right','top-left','bottom-left']}, __type__: {object: object$1} }, __type__: {object: object$1,'boolean': bool$1} }, groups: { visibility: {any: any$1}, __type__: {object: object$1} }, autoResize: {'boolean': bool$1}, throttleRedraw: {number: number$1}, // TODO: DEPRICATED see https://github.com/almende/vis/issues/2511 clickToUse: {'boolean': bool$1}, end: {number: number$1, date: date$1, string: string$1, moment: moment$2}, format: { minorLabels: { millisecond: {string: string$1,'undefined': 'undefined'}, second: {string: string$1,'undefined': 'undefined'}, minute: {string: string$1,'undefined': 'undefined'}, hour: {string: string$1,'undefined': 'undefined'}, weekday: {string: string$1,'undefined': 'undefined'}, day: {string: string$1,'undefined': 'undefined'}, week: {string: string$1,'undefined': 'undefined'}, month: {string: string$1,'undefined': 'undefined'}, quarter: {string: string$1,'undefined': 'undefined'}, year: {string: string$1,'undefined': 'undefined'}, __type__: {object: object$1} }, majorLabels: { millisecond: {string: string$1,'undefined': 'undefined'}, second: {string: string$1,'undefined': 'undefined'}, minute: {string: string$1,'undefined': 'undefined'}, hour: {string: string$1,'undefined': 'undefined'}, weekday: {string: string$1,'undefined': 'undefined'}, day: {string: string$1,'undefined': 'undefined'}, week: {string: string$1,'undefined': 'undefined'}, month: {string: string$1,'undefined': 'undefined'}, quarter: {string: string$1,'undefined': 'undefined'}, year: {string: string$1,'undefined': 'undefined'}, __type__: {object: object$1} }, __type__: {object: object$1} }, moment: {'function': 'function'}, height: {string: string$1, number: number$1}, hiddenDates: { start: {date: date$1, number: number$1, string: string$1, moment: moment$2}, end: {date: date$1, number: number$1, string: string$1, moment: moment$2}, repeat: {string: string$1}, __type__: {object: object$1, array: array$1} }, locale:{string: string$1}, locales:{ __any__: {any: any$1}, __type__: {object: object$1} }, max: {date: date$1, number: number$1, string: string$1, moment: moment$2}, maxHeight: {number: number$1, string: string$1}, maxMinorChars: {number: number$1}, min: {date: date$1, number: number$1, string: string$1, moment: moment$2}, minHeight: {number: number$1, string: string$1}, moveable: {'boolean': bool$1}, multiselect: {'boolean': bool$1}, orientation: {string: string$1}, showCurrentTime: {'boolean': bool$1}, showMajorLabels: {'boolean': bool$1}, showMinorLabels: {'boolean': bool$1}, showWeekScale: {'boolean': bool$1}, snap: {'function': 'function', 'null': 'null'}, start: {date: date$1, number: number$1, string: string$1, moment: moment$2}, timeAxis: { scale: {string: string$1,'undefined': 'undefined'}, step: {number: number$1,'undefined': 'undefined'}, __type__: {object: object$1} }, width: {string: string$1, number: number$1}, zoomable: {'boolean': bool$1}, zoomKey: {string: ['ctrlKey', 'altKey', 'metaKey', '']}, zoomMax: {number: number$1}, zoomMin: {number: number$1}, zIndex: {number: number$1}, __type__: {object: object$1} }; let configureOptions$1 = { global: { alignCurrentTime: ['none', 'year', 'month', 'quarter', 'week', 'isoWeek', 'day', 'date', 'hour', 'minute', 'second'], //yAxisOrientation: ['left','right'], // TDOO: enable as soon as Grahp2d doesn't crash when changing this on the fly sort: true, sampling: true, stack:false, shaded: { enabled: false, orientation: ['zero','top','bottom','group'] // zero, top, bottom }, style: ['line','bar','points'], // line, bar barChart: { width: [50,5,100,5], minWidth: [50,5,100,5], sideBySide: false, align: ['left','center','right'] // left, center, right }, interpolation: { enabled: true, parametrization: ['centripetal','chordal','uniform'] // uniform (alpha = 0.0), chordal (alpha = 1.0), centripetal (alpha = 0.5) }, drawPoints: { enabled: true, size: [6,2,30,1], style: ['square', 'circle'] // square, circle }, dataAxis: { showMinorLabels: true, showMajorLabels: true, showWeekScale: false, icons: false, width: [40,0,200,1], visible: true, alignZeros: true, left:{ //range: {min:'undefined': 'undefined'ined,max:'undefined': 'undefined'ined}, //format: function (value) {return value;}, title: {text:'',style:''} }, right:{ //range: {min:'undefined': 'undefined'ined,max:'undefined': 'undefined'ined}, //format: function (value) {return value;}, title: {text:'',style:''} } }, legend: { enabled: false, icons: true, left: { visible: true, position: ['top-right','bottom-right','top-left','bottom-left'] // top/bottom - left,right }, right: { visible: true, position: ['top-right','bottom-right','top-left','bottom-left'] // top/bottom - left,right } }, autoResize: true, clickToUse: false, end: '', format: { minorLabels: { millisecond:'SSS', second: 's', minute: 'HH:mm', hour: 'HH:mm', weekday: 'ddd D', day: 'D', week: 'w', month: 'MMM', quarter: '[Q]Q', year: 'YYYY' }, majorLabels: { millisecond:'HH:mm:ss', second: 'D MMMM HH:mm', minute: 'ddd D MMMM', hour: 'ddd D MMMM', weekday: 'MMMM YYYY', day: 'MMMM YYYY', week: 'MMMM YYYY', month: 'YYYY', quarter: 'YYYY', year: '' } }, height: '', locale: '', max: '', maxHeight: '', maxMinorChars: [7, 0, 20, 1], min: '', minHeight: '', moveable:true, orientation: ['both', 'bottom', 'top'], showCurrentTime: false, showMajorLabels: true, showMinorLabels: true, showWeekScale: false, start: '', width: '100%', zoomable: true, zoomKey: ['ctrlKey', 'altKey', 'metaKey', ''], zoomMax: [315360000000000, 10, 315360000000000, 1], zoomMin: [10, 10, 315360000000000, 1], zIndex: 0 } }; /** * Create a timeline visualization * @param {HTMLElement} container * @param {vis.DataSet | Array} [items] * @param {vis.DataSet | Array | vis.DataView | Object} [groups] * @param {Object} [options] See Graph2d.setOptions for the available options. * @constructor Graph2d * @extends Core */ function Graph2d (container, items, groups, options) { // if the third element is options, the forth is groups (optionally); if (!(Array.isArray(groups) || isDataViewLike("id", groups)) && groups instanceof Object) { var forthArgument = options; options = groups; groups = forthArgument; } // TODO: REMOVE THIS in the next MAJOR release // see https://github.com/almende/vis/issues/2511 if (options && options.throttleRedraw) { console.warn("Graph2d option \"throttleRedraw\" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release."); } var me = this; this.defaultOptions = { start: null, end: null, autoResize: true, orientation: { axis: 'bottom', // axis orientation: 'bottom', 'top', or 'both' item: 'bottom' // not relevant for Graph2d }, moment: moment$1, width: null, height: null, maxHeight: null, minHeight: null }; this.options = util$3.deepExtend({}, this.defaultOptions); // Create the DOM, props, and emitter this._create(container); // all components listed here will be repainted automatically this.components = []; this.body = { dom: this.dom, domProps: this.props, emitter: { on: this.on.bind(this), off: this.off.bind(this), emit: this.emit.bind(this) }, hiddenDates: [], util: { getScale() { return me.timeAxis.step.scale; }, getStep() { return me.timeAxis.step.step; }, toScreen: me._toScreen.bind(me), toGlobalScreen: me._toGlobalScreen.bind(me), // this refers to the root.width toTime: me._toTime.bind(me), toGlobalTime : me._toGlobalTime.bind(me) } }; // range this.range = new Range(this.body); this.components.push(this.range); this.body.range = this.range; // time axis this.timeAxis = new TimeAxis(this.body); this.components.push(this.timeAxis); //this.body.util.snap = this.timeAxis.snap.bind(this.timeAxis); // current time bar this.currentTime = new CurrentTime(this.body); this.components.push(this.currentTime); // item set this.linegraph = new LineGraph(this.body); this.components.push(this.linegraph); this.itemsData = null; // DataSet this.groupsData = null; // DataSet this.on('tap', function (event) { me.emit('click', me.getEventProperties(event)); }); this.on('doubletap', function (event) { me.emit('doubleClick', me.getEventProperties(event)); }); this.dom.root.oncontextmenu = function (event) { me.emit('contextmenu', me.getEventProperties(event)); }; //Single time autoscale/fit this.initialFitDone = false; this.on('changed', function (){ if (me.itemsData == null) return; if (!me.initialFitDone && !me.options.rollingMode) { me.initialFitDone = true; if (me.options.start != undefined || me.options.end != undefined) { if (me.options.start == undefined || me.options.end == undefined) { var range = me.getItemRange(); } var start = me.options.start != undefined ? me.options.start : range.min; var end = me.options.end != undefined ? me.options.end : range.max; me.setWindow(start, end, {animation: false}); } else { me.fit({animation: false}); } } if (!me.initialDrawDone && (me.initialRangeChangeDone || (!me.options.start && !me.options.end) || me.options.rollingMode)) { me.initialDrawDone = true; me.dom.root.style.visibility = 'visible'; me.dom.loadingScreen.parentNode.removeChild(me.dom.loadingScreen); if (me.options.onInitialDrawComplete) { setTimeout(() => { return me.options.onInitialDrawComplete(); }, 0); } } }); // apply options if (options) { this.setOptions(options); } // IMPORTANT: THIS HAPPENS BEFORE SET ITEMS! if (groups) { this.setGroups(groups); } // create itemset if (items) { this.setItems(items); } // draw for the first time this._redraw(); } // Extend the functionality from Core Graph2d.prototype = new Core(); Graph2d.prototype.setOptions = function (options) { // validate options let errorFound = Validator$2.validate(options, allOptions$2); if (errorFound === true) { console.log('%cErrors have been found in the supplied options object.', printStyle); } Core.prototype.setOptions.call(this, options); }; /** * Set items * @param {vis.DataSet | Array | null} items */ Graph2d.prototype.setItems = function(items) { var initialLoad = (this.itemsData == null); // convert to type DataSet when needed var newDataSet; if (!items) { newDataSet = null; } else if (isDataViewLike("id", newDataSet)) { newDataSet = typeCoerceDataSet(items); } else { // turn an array into a dataset newDataSet = typeCoerceDataSet(new DataSet(items)); } // set items if (this.itemsData) { // stop maintaining a coerced version of the old data set this.itemsData.dispose(); } this.itemsData = newDataSet; this.linegraph && this.linegraph.setItems(newDataSet != null ? newDataSet.rawDS : null); if (initialLoad) { if (this.options.start != undefined || this.options.end != undefined) { var start = this.options.start != undefined ? this.options.start : null; var end = this.options.end != undefined ? this.options.end : null; this.setWindow(start, end, {animation: false}); } else { this.fit({animation: false}); } } }; /** * Set groups * @param {vis.DataSet | Array} groups */ Graph2d.prototype.setGroups = function(groups) { // convert to type DataSet when needed var newDataSet; if (!groups) { newDataSet = null; } else if (isDataViewLike("id", groups)) { newDataSet = groups; } else { // turn an array into a dataset newDataSet = new DataSet(groups); } this.groupsData = newDataSet; this.linegraph.setGroups(newDataSet); }; /** * Returns an object containing an SVG element with the icon of the group (size determined by iconWidth and iconHeight), the label of the group (content) and the yAxisOrientation of the group (left or right). * @param {vis.GraphGroup.id} groupId * @param {number} width * @param {number} height * @returns {{icon: SVGElement, label: string, orientation: string}|string} */ Graph2d.prototype.getLegend = function(groupId, width, height) { if (width === undefined) {width = 15;} if (height === undefined) {height = 15;} if (this.linegraph.groups[groupId] !== undefined) { return this.linegraph.groups[groupId].getLegend(width,height); } else { return "cannot find group:'" + groupId + "'"; } }; /** * This checks if the visible option of the supplied group (by ID) is true or false. * @param {vis.GraphGroup.id} groupId * @returns {boolean} */ Graph2d.prototype.isGroupVisible = function(groupId) { if (this.linegraph.groups[groupId] !== undefined) { return (this.linegraph.groups[groupId].visible && (this.linegraph.options.groups.visibility[groupId] === undefined || this.linegraph.options.groups.visibility[groupId] == true)); } else { return false; } }; /** * Get the data range of the item set. * @returns {{min: Date, max: Date}} range A range with a start and end Date. * When no minimum is found, min==null * When no maximum is found, max==null */ Graph2d.prototype.getDataRange = function() { var min = null; var max = null; // calculate min from start filed for (var groupId in this.linegraph.groups) { if (this.linegraph.groups.hasOwnProperty(groupId)) { if (this.linegraph.groups[groupId].visible == true) { for (var i = 0; i < this.linegraph.groups[groupId].itemsData.length; i++) { var item = this.linegraph.groups[groupId].itemsData[i]; var value = util$3.convert(item.x, 'Date').valueOf(); min = min == null ? value : min > value ? value : min; max = max == null ? value : max < value ? value : max; } } } } return { min: (min != null) ? new Date(min) : null, max: (max != null) ? new Date(max) : null }; }; /** * Generate Timeline related information from an event * @param {Event} event * @return {Object} An object with related information, like on which area * The event happened, whether clicked on an item, etc. */ Graph2d.prototype.getEventProperties = function (event) { var clientX = event.center ? event.center.x : event.clientX; var clientY = event.center ? event.center.y : event.clientY; var x = clientX - util$3.getAbsoluteLeft(this.dom.centerContainer); var y = clientY - util$3.getAbsoluteTop(this.dom.centerContainer); var time = this._toTime(x); var customTime = CustomTime.customTimeFromTarget(event); var element = util$3.getTarget(event); var what = null; if (util$3.hasParent(element, this.timeAxis.dom.foreground)) {what = 'axis';} else if (this.timeAxis2 && util$3.hasParent(element, this.timeAxis2.dom.foreground)) {what = 'axis';} else if (util$3.hasParent(element, this.linegraph.yAxisLeft.dom.frame)) {what = 'data-axis';} else if (util$3.hasParent(element, this.linegraph.yAxisRight.dom.frame)) {what = 'data-axis';} else if (util$3.hasParent(element, this.linegraph.legendLeft.dom.frame)) {what = 'legend';} else if (util$3.hasParent(element, this.linegraph.legendRight.dom.frame)) {what = 'legend';} else if (customTime != null) {what = 'custom-time';} else if (util$3.hasParent(element, this.currentTime.bar)) {what = 'current-time';} else if (util$3.hasParent(element, this.dom.center)) {what = 'background';} var value = []; var yAxisLeft = this.linegraph.yAxisLeft; var yAxisRight = this.linegraph.yAxisRight; if (!yAxisLeft.hidden && this.itemsData.length > 0) { value.push(yAxisLeft.screenToValue(y)); } if (!yAxisRight.hidden && this.itemsData.length > 0) { value.push(yAxisRight.screenToValue(y)); } return { event: event, customTime: customTime ? customTime.options.id : null, what: what, pageX: event.srcEvent ? event.srcEvent.pageX : event.pageX, pageY: event.srcEvent ? event.srcEvent.pageY : event.pageY, x: x, y: y, time: time, value: value } }; /** * Load a configurator * @return {Object} * @private */ Graph2d.prototype._createConfigurator = function () { return new Configurator$2(this, this.dom.container, configureOptions$1); }; // Locales have to be supplied by the user. const defaultLanguage = getNavigatorLanguage(); moment.locale(defaultLanguage); var visData_min = createCommonjsModule(function (module, exports) { /** * vis-data * http://visjs.org/ * * Manage unstructured data using DataSet. Add, update, and remove data, and listen for changes in the data. * * @version 7.1.2 * @date 2021-01-08T20:37:11.601Z * * @copyright (c) 2011-2017 Almende B.V, http://almende.com * @copyright (c) 2017-2019 visjs contributors, https://github.com/visjs * * @license * vis.js is dual licensed under both * * 1. The Apache 2.0 License * http://www.apache.org/licenses/LICENSE-2.0 * * and * * 2. The MIT License * http://opensource.org/licenses/MIT * * vis.js may be distributed under either license. */ !function(t,e){e(exports);}(commonjsGlobal,(function(t){var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof commonjsGlobal?commonjsGlobal:"undefined"!=typeof self?self:{};function r(t){var e={exports:{}};return t(e,e.exports),e.exports}var n=function(t){return t&&t.Math==Math&&t},i=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")(),o=function(t){try{return !!t()}catch(t){return !0}},a=!o((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),u={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,c={f:s&&!u.call({1:2},1)?function(t){var e=s(this,t);return !!e&&e.enumerable}:u},f=function(t,e){return {enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},l={}.toString,h=function(t){return l.call(t).slice(8,-1)},p="".split,v=o((function(){return !Object("z").propertyIsEnumerable(0)}))?function(t){return "String"==h(t)?p.call(t,""):Object(t)}:Object,d=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},y=function(t){return v(d(t))},g=function(t){return "object"==typeof t?null!==t:"function"==typeof t},m=function(t,e){if(!g(t))return t;var r,n;if(e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;if("function"==typeof(r=t.valueOf)&&!g(n=r.call(t)))return n;if(!e&&"function"==typeof(r=t.toString)&&!g(n=r.call(t)))return n;throw TypeError("Can't convert object to primitive value")},b={}.hasOwnProperty,_=function(t,e){return b.call(t,e)},w=i.document,E=g(w)&&g(w.createElement),O=function(t){return E?w.createElement(t):{}},T=!a&&!o((function(){return 7!=Object.defineProperty(O("div"),"a",{get:function(){return 7}}).a})),S=Object.getOwnPropertyDescriptor,x={f:a?S:function(t,e){if(t=y(t),e=m(e,!0),T)try{return S(t,e)}catch(t){}if(_(t,e))return f(!c.f.call(t,e),t[e])}},k=/#|\.prototype\./,A=function(t,e){var r=I[j(t)];return r==D||r!=P&&("function"==typeof e?o(e):!!e)},j=A.normalize=function(t){return String(t).replace(k,".").toLowerCase()},I=A.data={},P=A.NATIVE="N",D=A.POLYFILL="P",L=A,C={},R=function(t){if("function"!=typeof t)throw TypeError(String(t)+" is not a function");return t},M=function(t,e,r){if(R(t),void 0===e)return t;switch(r){case 0:return function(){return t.call(e)};case 1:return function(r){return t.call(e,r)};case 2:return function(r,n){return t.call(e,r,n)};case 3:return function(r,n,i){return t.call(e,r,n,i)}}return function(){return t.apply(e,arguments)}},N=function(t){if(!g(t))throw TypeError(String(t)+" is not an object");return t},F=Object.defineProperty,z={f:a?F:function(t,e,r){if(N(t),e=m(e,!0),N(r),T)try{return F(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return "value"in r&&(t[e]=r.value),t}},q=a?function(t,e,r){return z.f(t,e,f(1,r))}:function(t,e,r){return t[e]=r,t},Y=x.f,U=function(t){var e=function(e,r,n){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,r)}return new t(e,r,n)}return t.apply(this,arguments)};return e.prototype=t.prototype,e},X=function(t,e){var r,n,o,a,u,s,c,f,l=t.target,h=t.global,p=t.stat,v=t.proto,d=h?i:p?i[l]:(i[l]||{}).prototype,y=h?C:C[l]||(C[l]={}),g=y.prototype;for(o in e)r=!L(h?o:l+(p?".":"#")+o,t.forced)&&d&&_(d,o),u=y[o],r&&(s=t.noTargetGet?(f=Y(d,o))&&f.value:d[o]),a=r&&s?s:e[o],r&&typeof u==typeof a||(c=t.bind&&r?M(a,i):t.wrap&&r?U(a):v&&"function"==typeof a?M(Function.call,a):a,(t.sham||a&&a.sham||u&&u.sham)&&q(c,"sham",!0),y[o]=c,v&&(_(C,n=l+"Prototype")||q(C,n,{}),C[n][o]=a,t.real&&g&&!g[o]&&q(g,o,a)));},V=Array.isArray||function(t){return "Array"==h(t)},W=Math.ceil,G=Math.floor,H=function(t){return isNaN(t=+t)?0:(t>0?G:W)(t)},$=Math.min,J=function(t){return t>0?$(H(t),9007199254740991):0},Q=function(t,e,r,n,i,o,a,u){for(var s,c=i,f=0,l=!!a&&M(a,u,3);f<n;){if(f in r){if(s=l?l(r[f],f,e):r[f],o>0&&V(s))c=Q(t,e,s,J(s.length),c,o-1)-1;else {if(c>=9007199254740991)throw TypeError("Exceed the acceptable array length");t[c]=s;}c++;}f++;}return c},B=Q,K=function(t){return Object(d(t))},Z="__core-js_shared__",tt=i[Z]||function(t,e){try{q(i,t,e);}catch(r){i[t]=e;}return e}(Z,{}),et=r((function(t){(t.exports=function(t,e){return tt[t]||(tt[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.7.0",mode:"pure",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"});})),rt=0,nt=Math.random(),it=function(t){return "Symbol("+String(void 0===t?"":t)+")_"+(++rt+nt).toString(36)},ot=!!Object.getOwnPropertySymbols&&!o((function(){return !String(Symbol())})),at=ot&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,ut=et("wks"),st=i.Symbol,ct=at?st:st&&st.withoutSetter||it,ft=function(t){return _(ut,t)||(ot&&_(st,t)?ut[t]=st[t]:ut[t]=ct("Symbol."+t)),ut[t]},lt=ft("species"),ht=function(t,e){var r;return V(t)&&("function"!=typeof(r=t.constructor)||r!==Array&&!V(r.prototype)?g(r)&&null===(r=r[lt])&&(r=void 0):r=void 0),new(void 0===r?Array:r)(0===e?0:e)};X({target:"Array",proto:!0},{flatMap:function(t){var e,r=K(this),n=J(r.length);return R(t),(e=ht(r,0)).length=B(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}});var pt,vt,dt=function(t){return C[t+"Prototype"]},yt=dt("Array").flatMap,gt=Array.prototype,mt=function(t){var e=t.flatMap;return t===gt||t instanceof Array&&e===gt.flatMap?yt:e},bt=[].push,_t=function(t){var e=1==t,r=2==t,n=3==t,i=4==t,o=6==t,a=5==t||o;return function(u,s,c,f){for(var l,h,p=K(u),d=v(p),y=M(s,c,3),g=J(d.length),m=0,b=f||ht,_=e?b(u,g):r?b(u,0):void 0;g>m;m++)if((a||m in d)&&(h=y(l=d[m],m,p),t))if(e)_[m]=h;else if(h)switch(t){case 3:return !0;case 5:return l;case 6:return m;case 2:bt.call(_,l);}else if(i)return !1;return o?-1:n||i?i:_}},wt={forEach:_t(0),map:_t(1),filter:_t(2),some:_t(3),every:_t(4),find:_t(5),findIndex:_t(6)},Et=function(t){return "function"==typeof t?t:void 0},Ot=function(t,e){return arguments.length<2?Et(C[t])||Et(i[t]):C[t]&&C[t][e]||i[t]&&i[t][e]},Tt=Ot("navigator","userAgent")||"",St=i.process,xt=St&&St.versions,kt=xt&&xt.v8;kt?vt=(pt=kt.split("."))[0]+pt[1]:Tt&&(!(pt=Tt.match(/Edge\/(\d+)/))||pt[1]>=74)&&(pt=Tt.match(/Chrome\/(\d+)/))&&(vt=pt[1]);var At=vt&&+vt,jt=ft("species"),It=function(t){return At>=51||!o((function(){var e=[];return (e.constructor={})[jt]=function(){return {foo:1}},1!==e[t](Boolean).foo}))},Pt=Object.defineProperty,Dt={},Lt=function(t){throw t},Ct=function(t,e){if(_(Dt,t))return Dt[t];e||(e={});var r=[][t],n=!!_(e,"ACCESSORS")&&e.ACCESSORS,i=_(e,0)?e[0]:Lt,u=_(e,1)?e[1]:void 0;return Dt[t]=!!r&&!o((function(){if(n&&!a)return !0;var t={length:-1};n?Pt(t,1,{enumerable:!0,get:Lt}):t[1]=1,r.call(t,i,u);}))},Rt=wt.map,Mt=It("map"),Nt=Ct("map");X({target:"Array",proto:!0,forced:!Mt||!Nt},{map:function(t){return Rt(this,t,arguments.length>1?arguments[1]:void 0)}});var Ft=dt("Array").map,zt=Array.prototype,qt=function(t){var e=t.map;return t===zt||t instanceof Array&&e===zt.map?Ft:e},Yt=wt.filter,Ut=It("filter"),Xt=Ct("filter");X({target:"Array",proto:!0,forced:!Ut||!Xt},{filter:function(t){return Yt(this,t,arguments.length>1?arguments[1]:void 0)}});var Vt=dt("Array").filter,Wt=Array.prototype,Gt=function(t){var e=t.filter;return t===Wt||t instanceof Array&&e===Wt.filter?Vt:e},Ht=function(t){return function(e,r,n,i){R(r);var o=K(e),a=v(o),u=J(o.length),s=t?u-1:0,c=t?-1:1;if(n<2)for(;;){if(s in a){i=a[s],s+=c;break}if(s+=c,t?s<0:u<=s)throw TypeError("Reduce of empty array with no initial value")}for(;t?s>=0:u>s;s+=c)s in a&&(i=r(i,a[s],s,o));return i}},$t={left:Ht(!1),right:Ht(!0)},Jt=function(t,e){var r=[][t];return !!r&&o((function(){r.call(null,e||function(){throw 1},1);}))},Qt="process"==h(i.process),Bt=$t.left,Kt=Jt("reduce"),Zt=Ct("reduce",{1:0});X({target:"Array",proto:!0,forced:!Kt||!Zt||!Qt&&At>79&&At<83},{reduce:function(t){return Bt(this,t,arguments.length,arguments.length>1?arguments[1]:void 0)}});var te=dt("Array").reduce,ee=Array.prototype,re=function(t){var e=t.reduce;return t===ee||t instanceof Array&&e===ee.reduce?te:e},ne=[].slice,ie={},oe=function(t,e,r){if(!(e in ie)){for(var n=[],i=0;i<e;i++)n[i]="a["+i+"]";ie[e]=Function("C,a","return new C("+n.join(",")+")");}return ie[e](t,r)},ae=Function.bind||function(t){var e=R(this),r=ne.call(arguments,1),n=function(){var i=r.concat(ne.call(arguments));return this instanceof n?oe(e,i.length,i):e.apply(t,i)};return g(e.prototype)&&(n.prototype=e.prototype),n};X({target:"Function",proto:!0},{bind:ae});var ue=dt("Function").bind,se=Function.prototype,ce=function(t){var e=t.bind;return t===se||t instanceof Function&&e===se.bind?ue:e};var fe=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")};X({target:"Object",stat:!0,forced:!a,sham:!a},{defineProperty:z.f});var le=r((function(t){var e=C.Object,r=t.exports=function(t,r,n){return e.defineProperty(t,r,n)};e.defineProperty.sham&&(r.sham=!0);})),he=le;function pe(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),he(t,n.key,n);}}var ve=function(t,e,r){return e&&pe(t.prototype,e),r&&pe(t,r),t};var de=function(){function t(e,r,n){var i,o,a;fe(this,t),this._source=e,this._transformers=r,this._target=n,this._listeners={add:ce(i=this._add).call(i,this),remove:ce(o=this._remove).call(o,this),update:ce(a=this._update).call(a,this)};}return ve(t,[{key:"all",value:function(){return this._target.update(this._transformItems(this._source.get())),this}},{key:"start",value:function(){return this._source.on("add",this._listeners.add),this._source.on("remove",this._listeners.remove),this._source.on("update",this._listeners.update),this}},{key:"stop",value:function(){return this._source.off("add",this._listeners.add),this._source.off("remove",this._listeners.remove),this._source.off("update",this._listeners.update),this}},{key:"_transformItems",value:function(t){var e;return re(e=this._transformers).call(e,(function(t,e){return e(t)}),t)}},{key:"_add",value:function(t,e){null!=e&&this._target.add(this._transformItems(this._source.get(e.items)));}},{key:"_update",value:function(t,e){null!=e&&this._target.update(this._transformItems(this._source.get(e.items)));}},{key:"_remove",value:function(t,e){null!=e&&this._target.remove(this._transformItems(e.oldData));}}]),t}(),ye=function(){function t(e){fe(this,t),this._source=e,this._transformers=[];}return ve(t,[{key:"filter",value:function(t){return this._transformers.push((function(e){return Gt(e).call(e,t)})),this}},{key:"map",value:function(t){return this._transformers.push((function(e){return qt(e).call(e,t)})),this}},{key:"flatMap",value:function(t){return this._transformers.push((function(e){return mt(e).call(e,t)})),this}},{key:"to",value:function(t){return new de(this._source,this._transformers,t)}}]),t}(),ge=le,me=Math.max,be=Math.min,_e=function(t,e){var r=H(t);return r<0?me(r+e,0):be(r,e)},we=function(t){return function(e,r,n){var i,o=y(e),a=J(o.length),u=_e(n,a);if(t&&r!=r){for(;a>u;)if((i=o[u++])!=i)return !0}else for(;a>u;u++)if((t||u in o)&&o[u]===r)return t||u||0;return !t&&-1}},Ee={includes:we(!0),indexOf:we(!1)},Oe={},Te=Ee.indexOf,Se=function(t,e){var r,n=y(t),i=0,o=[];for(r in n)!_(Oe,r)&&_(n,r)&&o.push(r);for(;e.length>i;)_(n,r=e[i++])&&(~Te(o,r)||o.push(r));return o},xe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ke=Object.keys||function(t){return Se(t,xe)},Ae=a?Object.defineProperties:function(t,e){N(t);for(var r,n=ke(e),i=n.length,o=0;i>o;)z.f(t,r=n[o++],e[r]);return t};X({target:"Object",stat:!0,forced:!a,sham:!a},{defineProperties:Ae});var je=r((function(t){var e=C.Object,r=t.exports=function(t,r){return e.defineProperties(t,r)};e.defineProperties.sham&&(r.sham=!0);})),Ie=xe.concat("length","prototype"),Pe={f:Object.getOwnPropertyNames||function(t){return Se(t,Ie)}},De={f:Object.getOwnPropertySymbols},Le=Ot("Reflect","ownKeys")||function(t){var e=Pe.f(N(t)),r=De.f;return r?e.concat(r(t)):e},Ce=function(t,e,r){var n=m(e);n in t?z.f(t,n,f(0,r)):t[n]=r;};X({target:"Object",stat:!0,sham:!a},{getOwnPropertyDescriptors:function(t){for(var e,r,n=y(t),i=x.f,o=Le(n),a={},u=0;o.length>u;)void 0!==(r=i(n,e=o[u++]))&&Ce(a,e,r);return a}});var Re=C.Object.getOwnPropertyDescriptors,Me=x.f,Ne=o((function(){Me(1);}));X({target:"Object",stat:!0,forced:!a||Ne,sham:!a},{getOwnPropertyDescriptor:function(t,e){return Me(y(t),e)}});var Fe,ze=r((function(t){var e=C.Object,r=t.exports=function(t,r){return e.getOwnPropertyDescriptor(t,r)};e.getOwnPropertyDescriptor.sham&&(r.sham=!0);})),qe=Ot("document","documentElement"),Ye=et("keys"),Ue=function(t){return Ye[t]||(Ye[t]=it(t))},Xe=Ue("IE_PROTO"),Ve=function(){},We=function(t){return "<script>"+t+"</"+"script>"},Ge=function(){try{Fe=document.domain&&new ActiveXObject("htmlfile");}catch(t){}var t,e;Ge=Fe?function(t){t.write(We("")),t.close();var e=t.parentWindow.Object;return t=null,e}(Fe):((e=O("iframe")).style.display="none",qe.appendChild(e),e.src=String("javascript:"),(t=e.contentWindow.document).open(),t.write(We("document.F=Object")),t.close(),t.F);for(var r=xe.length;r--;)delete Ge.prototype[xe[r]];return Ge()};Oe[Xe]=!0;var He=Object.create||function(t,e){var r;return null!==t?(Ve.prototype=N(t),r=new Ve,Ve.prototype=null,r[Xe]=t):r=Ge(),void 0===e?r:Ae(r,e)},$e=Pe.f,Je={}.toString,Qe="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Be={f:function(t){return Qe&&"[object Window]"==Je.call(t)?function(t){try{return $e(t)}catch(t){return Qe.slice()}}(t):$e(y(t))}},Ke=function(t,e,r,n){n&&n.enumerable?t[e]=r:q(t,e,r);},Ze={f:ft},tr=z.f,er=function(t){var e=C.Symbol||(C.Symbol={});_(e,t)||tr(e,t,{value:Ze.f(t)});},rr={};rr[ft("toStringTag")]="z";var nr="[object z]"===String(rr),ir=ft("toStringTag"),or="Arguments"==h(function(){return arguments}()),ar=nr?h:function(t){var e,r,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=Object(t),ir))?r:or?h(e):"Object"==(n=h(e))&&"function"==typeof e.callee?"Arguments":n},ur=nr?{}.toString:function(){return "[object "+ar(this)+"]"},sr=z.f,cr=ft("toStringTag"),fr=function(t,e,r,n){if(t){var i=r?t:t.prototype;_(i,cr)||sr(i,cr,{configurable:!0,value:e}),n&&!nr&&q(i,"toString",ur);}},lr=Function.toString;"function"!=typeof tt.inspectSource&&(tt.inspectSource=function(t){return lr.call(t)});var hr,pr,vr,dr=tt.inspectSource,yr=i.WeakMap,gr="function"==typeof yr&&/native code/.test(dr(yr)),mr=i.WeakMap;if(gr){var br=tt.state||(tt.state=new mr),_r=br.get,wr=br.has,Er=br.set;hr=function(t,e){return e.facade=t,Er.call(br,t,e),e},pr=function(t){return _r.call(br,t)||{}},vr=function(t){return wr.call(br,t)};}else {var Or=Ue("state");Oe[Or]=!0,hr=function(t,e){return e.facade=t,q(t,Or,e),e},pr=function(t){return _(t,Or)?t[Or]:{}},vr=function(t){return _(t,Or)};}var Tr={set:hr,get:pr,has:vr,enforce:function(t){return vr(t)?pr(t):hr(t,{})},getterFor:function(t){return function(e){var r;if(!g(e)||(r=pr(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},Sr=wt.forEach,xr=Ue("hidden"),kr="Symbol",Ar=ft("toPrimitive"),jr=Tr.set,Ir=Tr.getterFor(kr),Pr=Object.prototype,Dr=i.Symbol,Lr=Ot("JSON","stringify"),Cr=x.f,Rr=z.f,Mr=Be.f,Nr=c.f,Fr=et("symbols"),zr=et("op-symbols"),qr=et("string-to-symbol-registry"),Yr=et("symbol-to-string-registry"),Ur=et("wks"),Xr=i.QObject,Vr=!Xr||!Xr.prototype||!Xr.prototype.findChild,Wr=a&&o((function(){return 7!=He(Rr({},"a",{get:function(){return Rr(this,"a",{value:7}).a}})).a}))?function(t,e,r){var n=Cr(Pr,e);n&&delete Pr[e],Rr(t,e,r),n&&t!==Pr&&Rr(Pr,e,n);}:Rr,Gr=function(t,e){var r=Fr[t]=He(Dr.prototype);return jr(r,{type:kr,tag:t,description:e}),a||(r.description=e),r},Hr=at?function(t){return "symbol"==typeof t}:function(t){return Object(t)instanceof Dr},$r=function(t,e,r){t===Pr&&$r(zr,e,r),N(t);var n=m(e,!0);return N(r),_(Fr,n)?(r.enumerable?(_(t,xr)&&t[xr][n]&&(t[xr][n]=!1),r=He(r,{enumerable:f(0,!1)})):(_(t,xr)||Rr(t,xr,f(1,{})),t[xr][n]=!0),Wr(t,n,r)):Rr(t,n,r)},Jr=function(t,e){N(t);var r=y(e),n=ke(r).concat(Zr(r));return Sr(n,(function(e){a&&!Qr.call(r,e)||$r(t,e,r[e]);})),t},Qr=function(t){var e=m(t,!0),r=Nr.call(this,e);return !(this===Pr&&_(Fr,e)&&!_(zr,e))&&(!(r||!_(this,e)||!_(Fr,e)||_(this,xr)&&this[xr][e])||r)},Br=function(t,e){var r=y(t),n=m(e,!0);if(r!==Pr||!_(Fr,n)||_(zr,n)){var i=Cr(r,n);return !i||!_(Fr,n)||_(r,xr)&&r[xr][n]||(i.enumerable=!0),i}},Kr=function(t){var e=Mr(y(t)),r=[];return Sr(e,(function(t){_(Fr,t)||_(Oe,t)||r.push(t);})),r},Zr=function(t){var e=t===Pr,r=Mr(e?zr:y(t)),n=[];return Sr(r,(function(t){!_(Fr,t)||e&&!_(Pr,t)||n.push(Fr[t]);})),n};if(ot||(Ke((Dr=function(){if(this instanceof Dr)throw TypeError("Symbol is not a constructor");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=it(t),r=function(t){this===Pr&&r.call(zr,t),_(this,xr)&&_(this[xr],e)&&(this[xr][e]=!1),Wr(this,e,f(1,t));};return a&&Vr&&Wr(Pr,e,{configurable:!0,set:r}),Gr(e,t)}).prototype,"toString",(function(){return Ir(this).tag})),Ke(Dr,"withoutSetter",(function(t){return Gr(it(t),t)})),c.f=Qr,z.f=$r,x.f=Br,Pe.f=Be.f=Kr,De.f=Zr,Ze.f=function(t){return Gr(ft(t),t)},a&&Rr(Dr.prototype,"description",{configurable:!0,get:function(){return Ir(this).description}})),X({global:!0,wrap:!0,forced:!ot,sham:!ot},{Symbol:Dr}),Sr(ke(Ur),(function(t){er(t);})),X({target:kr,stat:!0,forced:!ot},{for:function(t){var e=String(t);if(_(qr,e))return qr[e];var r=Dr(e);return qr[e]=r,Yr[r]=e,r},keyFor:function(t){if(!Hr(t))throw TypeError(t+" is not a symbol");if(_(Yr,t))return Yr[t]},useSetter:function(){Vr=!0;},useSimple:function(){Vr=!1;}}),X({target:"Object",stat:!0,forced:!ot,sham:!a},{create:function(t,e){return void 0===e?He(t):Jr(He(t),e)},defineProperty:$r,defineProperties:Jr,getOwnPropertyDescriptor:Br}),X({target:"Object",stat:!0,forced:!ot},{getOwnPropertyNames:Kr,getOwnPropertySymbols:Zr}),X({target:"Object",stat:!0,forced:o((function(){De.f(1);}))},{getOwnPropertySymbols:function(t){return De.f(K(t))}}),Lr){var tn=!ot||o((function(){var t=Dr();return "[null]"!=Lr([t])||"{}"!=Lr({a:t})||"{}"!=Lr(Object(t))}));X({target:"JSON",stat:!0,forced:tn},{stringify:function(t,e,r){for(var n,i=[t],o=1;arguments.length>o;)i.push(arguments[o++]);if(n=e,(g(e)||void 0!==t)&&!Hr(t))return V(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!Hr(e))return e}),i[1]=e,Lr.apply(null,i)}});}Dr.prototype[Ar]||q(Dr.prototype,Ar,Dr.prototype.valueOf),fr(Dr,kr),Oe[xr]=!0;var en,rn,nn,on=C.Object.getOwnPropertySymbols,an={},un=!o((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),sn=Ue("IE_PROTO"),cn=Object.prototype,fn=un?Object.getPrototypeOf:function(t){return t=K(t),_(t,sn)?t[sn]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?cn:null},ln=(ft("iterator"),!1);[].keys&&("next"in(nn=[].keys())?(rn=fn(fn(nn)))!==Object.prototype&&(en=rn):ln=!0),null==en&&(en={});var hn={IteratorPrototype:en,BUGGY_SAFARI_ITERATORS:ln},pn=hn.IteratorPrototype,vn=function(){return this},dn=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(r,[]),e=r instanceof Array;}catch(t){}return function(r,n){return N(r),function(t){if(!g(t)&&null!==t)throw TypeError("Can't set "+String(t)+" as a prototype")}(n),e?t.call(r,n):r.__proto__=n,r}}():void 0),yn=hn.IteratorPrototype,gn=hn.BUGGY_SAFARI_ITERATORS,mn=ft("iterator"),bn="keys",_n="values",wn="entries",En=function(){return this},On=function(t,e,r,n,i,o,a){!function(t,e,r){var n=e+" Iterator";t.prototype=He(pn,{next:f(1,r)}),fr(t,n,!1,!0),an[n]=vn;}(r,e,n);var u,s,c,l=function(t){if(t===i&&y)return y;if(!gn&&t in v)return v[t];switch(t){case bn:case _n:case wn:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+" Iterator",p=!1,v=t.prototype,d=v[mn]||v["@@iterator"]||i&&v[i],y=!gn&&d||l(i),g="Array"==e&&v.entries||d;if(g&&(u=fn(g.call(new t)),yn!==Object.prototype&&u.next&&(fr(u,h,!0,!0),an[h]=En)),i==_n&&d&&d.name!==_n&&(p=!0,y=function(){return d.call(this)}),a&&v[mn]!==y&&q(v,mn,y),an[e]=y,i)if(s={values:l(_n),keys:o?y:l(bn),entries:l(wn)},a)for(c in s)(gn||p||!(c in v))&&Ke(v,c,s[c]);else X({target:e,proto:!0,forced:gn||p},s);return s},Tn="Array Iterator",Sn=Tr.set,xn=Tr.getterFor(Tn);On(Array,"Array",(function(t,e){Sn(this,{type:Tn,target:y(t),index:0,kind:e});}),(function(){var t=xn(this),e=t.target,r=t.kind,n=t.index++;return !e||n>=e.length?(t.target=void 0,{value:void 0,done:!0}):"keys"==r?{value:n,done:!1}:"values"==r?{value:e[n],done:!1}:{value:[n,e[n]],done:!1}}),"values");an.Arguments=an.Array;var kn=ft("toStringTag");for(var An in {CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}){var jn=i[An],In=jn&&jn.prototype;In&&ar(In)!==kn&&q(In,kn,An),an[An]=an.Array;}var Pn=function(t){return function(e,r){var n,i,o=String(d(e)),a=H(r),u=o.length;return a<0||a>=u?t?"":void 0:(n=o.charCodeAt(a))<55296||n>56319||a+1===u||(i=o.charCodeAt(a+1))<56320||i>57343?t?o.charAt(a):n:t?o.slice(a,a+2):i-56320+(n-55296<<10)+65536}},Dn={codeAt:Pn(!1),charAt:Pn(!0)}.charAt,Ln="String Iterator",Cn=Tr.set,Rn=Tr.getterFor(Ln);On(String,"String",(function(t){Cn(this,{type:Ln,string:String(t),index:0});}),(function(){var t,e=Rn(this),r=e.string,n=e.index;return n>=r.length?{value:void 0,done:!0}:(t=Dn(r,n),e.index+=t.length,{value:t,done:!1})}));var Mn=ft("iterator"),Nn=function(t){if(null!=t)return t[Mn]||t["@@iterator"]||an[ar(t)]},Fn=function(t){var e=Nn(t);if("function"!=typeof e)throw TypeError(String(t)+" is not iterable");return N(e.call(t))},zn=Nn,qn=function(t){var e=t.return;if(void 0!==e)return N(e.call(t)).value},Yn=function(t,e,r,n){try{return n?e(N(r)[0],r[1]):e(r)}catch(e){throw qn(t),e}},Un=ft("iterator"),Xn=Array.prototype,Vn=function(t){return void 0!==t&&(an.Array===t||Xn[Un]===t)},Wn=ft("iterator"),Gn=!1;try{var Hn=0,$n={next:function(){return {done:!!Hn++}},return:function(){Gn=!0;}};$n[Wn]=function(){return this},Array.from($n,(function(){throw 2}));}catch(t){}var Jn=!function(t,e){if(!e&&!Gn)return !1;var r=!1;try{var n={};n[Wn]=function(){return {next:function(){return {done:r=!0}}}},t(n);}catch(t){}return r}((function(t){Array.from(t);}));X({target:"Array",stat:!0,forced:Jn},{from:function(t){var e,r,n,i,o,a,u=K(t),s="function"==typeof this?this:Array,c=arguments.length,f=c>1?arguments[1]:void 0,l=void 0!==f,h=Nn(u),p=0;if(l&&(f=M(f,c>2?arguments[2]:void 0,2)),null==h||s==Array&&Vn(h))for(r=new s(e=J(u.length));e>p;p++)a=l?f(u[p],p):u[p],Ce(r,p,a);else for(o=(i=h.call(u)).next,r=new s;!(n=o.call(i)).done;p++)a=l?Yn(i,f,[n.value,p],!0):n.value,Ce(r,p,a);return r.length=p,r}});var Qn=C.Array.from,Bn=Qn;X({target:"Array",proto:!0},{fill:function(t){for(var e=K(this),r=J(e.length),n=arguments.length,i=_e(n>1?arguments[1]:void 0,r),o=n>2?arguments[2]:void 0,a=void 0===o?r:_e(o,r);a>i;)e[i++]=t;return e}});dt("Array").fill;var Kn=[].slice,Zn=/MSIE .\./.test(Tt),ti=function(t){return function(e,r){var n=arguments.length>2,i=n?Kn.call(arguments,2):void 0;return t(n?function(){("function"==typeof e?e:Function(e)).apply(this,i);}:e,r)}};X({global:!0,bind:!0,forced:Zn},{setTimeout:ti(i.setTimeout),setInterval:ti(i.setInterval)});var ei=C.setTimeout,ri=Ot("JSON","stringify"),ni=/[\uD800-\uDFFF]/g,ii=/^[\uD800-\uDBFF]$/,oi=/^[\uDC00-\uDFFF]$/,ai=function(t,e,r){var n=r.charAt(e-1),i=r.charAt(e+1);return ii.test(t)&&!oi.test(i)||oi.test(t)&&!ii.test(n)?"\\u"+t.charCodeAt(0).toString(16):t},ui=o((function(){return '"\\udf06\\ud834"'!==ri("\udf06\ud834")||'"\\udead"'!==ri("\udead")}));ri&&X({target:"JSON",stat:!0,forced:ui},{stringify:function(t,e,r){var n=ri.apply(null,arguments);return "string"==typeof n?n.replace(ni,ai):n}}),C.JSON||(C.JSON={stringify:JSON.stringify});var si=function(t,e,r){return C.JSON.stringify.apply(null,arguments)};X({target:"Object",stat:!0,sham:!a},{create:He});var ci=C.Object,fi=function(t,e){return ci.create(t,e)},li=fi;var hi,pi=function(t,e,r){return e in t?he(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t},vi="\t\n\v\f\r \u2028\u2029\ufeff",di="["+vi+"]",yi=RegExp("^"+di+di+"*"),gi=RegExp(di+di+"*$"),mi=function(t){return function(e){var r=String(d(e));return 1&t&&(r=r.replace(yi,"")),2&t&&(r=r.replace(gi,"")),r}},bi={start:mi(1),end:mi(2),trim:mi(3)},_i=bi.trim;X({target:"String",proto:!0,forced:(hi="trim",o((function(){return !!vi[hi]()||" "!=" "[hi]()||vi[hi].name!==hi})))},{trim:function(){return _i(this)}});dt("String").trim;var wi=Ee.indexOf,Ei=[].indexOf,Oi=!!Ei&&1/[1].indexOf(1,-0)<0,Ti=Jt("indexOf"),Si=Ct("indexOf",{ACCESSORS:!0,1:0});X({target:"Array",proto:!0,forced:Oi||!Ti||!Si},{indexOf:function(t){return Oi?Ei.apply(this,arguments)||0:wi(this,t,arguments.length>1?arguments[1]:void 0)}});dt("Array").indexOf;var xi=bi.trim,ki=i.parseInt,Ai=/^[+-]?0[Xx]/,ji=8!==ki(vi+"08")||22!==ki(vi+"0x16")?function(t,e){var r=xi(String(t));return ki(r,e>>>0||(Ai.test(r)?16:10))}:ki;X({global:!0,forced:parseInt!=ji},{parseInt:ji});var Ii=c.f,Pi=function(t){return function(e){for(var r,n=y(e),i=ke(n),o=i.length,u=0,s=[];o>u;)r=i[u++],a&&!Ii.call(n,r)||s.push(t?[r,n[r]]:n[r]);return s}},Di={entries:Pi(!0),values:Pi(!1)}.values;X({target:"Object",stat:!0},{values:function(t){return Di(t)}});C.Object.values;var Li=o((function(){fn(1);}));X({target:"Object",stat:!0,forced:Li,sham:!un},{getPrototypeOf:function(t){return fn(K(t))}});var Ci=C.Object.getPrototypeOf,Ri=Ee.includes,Mi=Ct("indexOf",{ACCESSORS:!0,1:0});X({target:"Array",proto:!0,forced:!Mi},{includes:function(t){return Ri(this,t,arguments.length>1?arguments[1]:void 0)}});dt("Array").includes;var Ni=ft("match"),Fi=function(t){if(function(t){var e;return g(t)&&(void 0!==(e=t[Ni])?!!e:"RegExp"==h(t))}(t))throw TypeError("The method doesn't accept regular expressions");return t},zi=ft("match");X({target:"String",proto:!0,forced:!function(t){var e=/./;try{"/./"[t](e);}catch(r){try{return e[zi]=!1,"/./"[t](e)}catch(t){}}return !1}("includes")},{includes:function(t){return !!~String(d(this)).indexOf(Fi(t),arguments.length>1?arguments[1]:void 0)}});dt("String").includes;var qi=Object.assign,Yi=Object.defineProperty,Ui=!qi||o((function(){if(a&&1!==qi({b:1},qi(Yi({},"a",{enumerable:!0,get:function(){Yi(this,"b",{value:3,enumerable:!1});}}),{b:2})).b)return !0;var t={},e={},r=Symbol(),n="abcdefghijklmnopqrst";return t[r]=7,n.split("").forEach((function(t){e[t]=t;})),7!=qi({},t)[r]||ke(qi({},e)).join("")!=n}))?function(t,e){for(var r=K(t),n=arguments.length,i=1,o=De.f,u=c.f;n>i;)for(var s,f=v(arguments[i++]),l=o?ke(f).concat(o(f)):ke(f),h=l.length,p=0;h>p;)s=l[p++],a&&!u.call(f,s)||(r[s]=f[s]);return r}:qi;X({target:"Object",stat:!0,forced:Object.assign!==Ui},{assign:Ui});var Xi=C.Object.assign,Vi=It("splice"),Wi=Ct("splice",{ACCESSORS:!0,0:0,1:2}),Gi=Math.max,Hi=Math.min,$i=9007199254740991,Ji="Maximum allowed length exceeded";X({target:"Array",proto:!0,forced:!Vi||!Wi},{splice:function(t,e){var r,n,i,o,a,u,s=K(this),c=J(s.length),f=_e(t,c),l=arguments.length;if(0===l?r=n=0:1===l?(r=0,n=c-f):(r=l-2,n=Hi(Gi(H(e),0),c-f)),c+r-n>$i)throw TypeError(Ji);for(i=ht(s,n),o=0;o<n;o++)(a=f+o)in s&&Ce(i,o,s[a]);if(i.length=n,r<n){for(o=f;o<c-n;o++)u=o+r,(a=o+n)in s?s[u]=s[a]:delete s[u];for(o=c;o>c-n+r;o--)delete s[o-1];}else if(r>n)for(o=c-n;o>f;o--)u=o+r-1,(a=o+n-1)in s?s[u]=s[a]:delete s[u];for(o=0;o<r;o++)s[o+f]=arguments[o+2];return s.length=c-n+r,i}});var Qi=dt("Array").splice,Bi=Array.prototype,Ki=function(t){var e=t.splice;return t===Bi||t instanceof Array&&e===Bi.splice?Qi:e},Zi=[].reverse,to=[1,2];X({target:"Array",proto:!0,forced:String(to)===String(to.reverse())},{reverse:function(){return V(this)&&(this.length=this.length),Zi.call(this)}});var eo=dt("Array").reverse,ro=Array.prototype,no=function(t){var e=t.reverse;return t===ro||t instanceof Array&&e===ro.reverse?eo:e},io=wt.forEach,oo=Jt("forEach"),ao=Ct("forEach"),uo=oo&&ao?[].forEach:function(t){return io(this,t,arguments.length>1?arguments[1]:void 0)};X({target:"Array",proto:!0,forced:[].forEach!=uo},{forEach:uo});var so=dt("Array").forEach,co=Array.prototype,fo={DOMTokenList:!0,NodeList:!0},lo=function(t){var e=t.forEach;return t===co||t instanceof Array&&e===co.forEach||fo.hasOwnProperty(ar(t))?so:e};X({target:"Array",stat:!0},{isArray:V});var ho=C.Array.isArray,po=ho;var vo=function(t){if(po(t))return t},yo=ft("iterator"),go=function(t){var e=Object(t);return void 0!==e[yo]||"@@iterator"in e||an.hasOwnProperty(ar(e))},mo=ft("isConcatSpreadable"),bo=9007199254740991,_o="Maximum allowed index exceeded",wo=At>=51||!o((function(){var t=[];return t[mo]=!1,t.concat()[0]!==t})),Eo=It("concat"),Oo=function(t){if(!g(t))return !1;var e=t[mo];return void 0!==e?!!e:V(t)};X({target:"Array",proto:!0,forced:!wo||!Eo},{concat:function(t){var e,r,n,i,o,a=K(this),u=ht(a,0),s=0;for(e=-1,n=arguments.length;e<n;e++)if(Oo(o=-1===e?a:arguments[e])){if(s+(i=J(o.length))>bo)throw TypeError(_o);for(r=0;r<i;r++,s++)r in o&&Ce(u,s,o[r]);}else {if(s>=bo)throw TypeError(_o);Ce(u,s++,o);}return u.length=s,u}}),er("asyncIterator"),er("hasInstance"),er("isConcatSpreadable"),er("iterator"),er("match"),er("matchAll"),er("replace"),er("search"),er("species"),er("split"),er("toPrimitive"),er("toStringTag"),er("unscopables"),fr(i.JSON,"JSON",!0);var To=C.Symbol;er("asyncDispose"),er("dispose"),er("observable"),er("patternMatch"),er("replaceAll");var So=To;var xo=function(t,e){if(void 0!==So&&go(Object(t))){var r=[],n=!0,i=!1,o=void 0;try{for(var a,u=Fn(t);!(n=(a=u.next()).done)&&(r.push(a.value),!e||r.length!==e);n=!0);}catch(t){i=!0,o=t;}finally{try{n||null==u.return||u.return();}finally{if(i)throw o}}return r}},ko=Qn,Ao=It("slice"),jo=Ct("slice",{ACCESSORS:!0,0:0,1:2}),Io=ft("species"),Po=[].slice,Do=Math.max;X({target:"Array",proto:!0,forced:!Ao||!jo},{slice:function(t,e){var r,n,i,o=y(this),a=J(o.length),u=_e(t,a),s=_e(void 0===e?a:e,a);if(V(o)&&("function"!=typeof(r=o.constructor)||r!==Array&&!V(r.prototype)?g(r)&&null===(r=r[Io])&&(r=void 0):r=void 0,r===Array||void 0===r))return Po.call(o,u,s);for(n=new(void 0===r?Array:r)(Do(s-u,0)),i=0;u<s;u++,i++)u in o&&Ce(n,i,o[u]);return n.length=i,n}});var Lo=dt("Array").slice,Co=Array.prototype,Ro=function(t){var e=t.slice;return t===Co||t instanceof Array&&e===Co.slice?Lo:e},Mo=Ro;var No=function(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n};var Fo=function(t,e){var r;if(t){if("string"==typeof t)return No(t,e);var n=Mo(r=Object.prototype.toString.call(t)).call(r,8,-1);return "Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?ko(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?No(t,e):void 0}};var zo=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")};var qo=function(t,e){return vo(t)||xo(t,e)||Fo(t,e)||zo()};X({target:"Date",stat:!0},{now:function(){return (new Date).getTime()}});C.Date.now;var Yo=o((function(){ke(1);}));X({target:"Object",stat:!0,forced:Yo},{keys:function(t){return ke(K(t))}});var Uo=C.Object.keys,Xo=ho,Vo=Ze.f("iterator"),Wo=Vo,Go=r((function(t){function e(r){return t.exports=e="function"==typeof So&&"symbol"==typeof Wo?function(t){return typeof t}:function(t){return t&&"function"==typeof So&&t.constructor===So&&t!==So.prototype?"symbol":typeof t},e(r)}t.exports=e;}));X({target:"Reflect",stat:!0},{ownKeys:Le});var Ho=C.Reflect.ownKeys,$o=Ro;var Jo=function(t){if(po(t))return No(t)};var Qo=function(t){if(void 0!==So&&go(Object(t)))return ko(t)};var Bo=function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")};var Ko=function(t){return Jo(t)||Qo(t)||Fo(t)||Bo()},Zo=dt("Array").concat,ta=Array.prototype,ea=function(t){var e=t.concat;return t===ta||t instanceof Array&&e===ta.concat?Zo:e},ra=To,na=r((function(t){function e(t){if(t)return function(t){for(var r in e.prototype)t[r]=e.prototype[r];return t}(t)}t.exports=e,e.prototype.on=e.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks["$"+t]=this._callbacks["$"+t]||[]).push(e),this},e.prototype.once=function(t,e){function r(){this.off(t,r),e.apply(this,arguments);}return r.fn=e,this.on(t,r),this},e.prototype.off=e.prototype.removeListener=e.prototype.removeAllListeners=e.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var r,n=this._callbacks["$"+t];if(!n)return this;if(1==arguments.length)return delete this._callbacks["$"+t],this;for(var i=0;i<n.length;i++)if((r=n[i])===e||r.fn===e){n.splice(i,1);break}return 0===n.length&&delete this._callbacks["$"+t],this},e.prototype.emit=function(t){this._callbacks=this._callbacks||{};for(var e=new Array(arguments.length-1),r=this._callbacks["$"+t],n=1;n<arguments.length;n++)e[n-1]=arguments[n];if(r){n=0;for(var i=(r=r.slice(0)).length;n<i;++n)r[n].apply(this,e);}return this},e.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks["$"+t]||[]},e.prototype.hasListeners=function(t){return !!this.listeners(t).length};})); /*! Hammer.JS - v2.0.17-rc - 2019-12-16 * http://naver.github.io/egjs * * Forked By Naver egjs * Copyright (c) hammerjs * Licensed under the MIT license */ function ia(){return (ia=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(t[n]=r[n]);}return t}).apply(this,arguments)}function oa(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e;}function aa(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}var ua,sa="function"!=typeof Object.assign?function(t){if(null==t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),r=1;r<arguments.length;r++){var n=arguments[r];if(null!=n)for(var i in n)n.hasOwnProperty(i)&&(e[i]=n[i]);}return e}:Object.assign,ca=["","webkit","Moz","MS","ms","o"],fa="undefined"==typeof document?{style:{}}:document.createElement("div"),la=Math.round,ha=Math.abs,pa=Date.now;function va(t,e){for(var r,n,i=e[0].toUpperCase()+e.slice(1),o=0;o<ca.length;){if((n=(r=ca[o])?r+i:e)in t)return n;o++;}}ua="undefined"==typeof window?{}:window;var da=va(fa.style,"touchAction"),ya=void 0!==da;var ga="compute",ma="auto",ba="manipulation",_a="none",wa="pan-x",Ea="pan-y",Oa=function(){if(!ya)return !1;var t={},e=ua.CSS&&ua.CSS.supports;return ["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach((function(r){return t[r]=!e||ua.CSS.supports("touch-action",r)})),t}(),Ta="ontouchstart"in ua,Sa=void 0!==va(ua,"PointerEvent"),xa=Ta&&/mobile|tablet|ip(ad|hone|od)|android/i.test(navigator.userAgent),ka="touch",Aa="mouse",ja=16,Ia=24,Pa=["x","y"],Da=["clientX","clientY"];function La(t,e,r){var n;if(t)if(t.forEach)t.forEach(e,r);else if(void 0!==t.length)for(n=0;n<t.length;)e.call(r,t[n],n,t),n++;else for(n in t)t.hasOwnProperty(n)&&e.call(r,t[n],n,t);}function Ca(t,e){return "function"==typeof t?t.apply(e&&e[0]||void 0,e):t}function Ra(t,e){return t.indexOf(e)>-1}var Ma=function(){function t(t,e){this.manager=t,this.set(e);}var e=t.prototype;return e.set=function(t){t===ga&&(t=this.compute()),ya&&this.manager.element.style&&Oa[t]&&(this.manager.element.style[da]=t),this.actions=t.toLowerCase().trim();},e.update=function(){this.set(this.manager.options.touchAction);},e.compute=function(){var t=[];return La(this.manager.recognizers,(function(e){Ca(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()));})),function(t){if(Ra(t,_a))return _a;var e=Ra(t,wa),r=Ra(t,Ea);return e&&r?_a:e||r?e?wa:Ea:Ra(t,ba)?ba:ma}(t.join(" "))},e.preventDefaults=function(t){var e=t.srcEvent,r=t.offsetDirection;if(this.manager.session.prevented)e.preventDefault();else {var n=this.actions,i=Ra(n,_a)&&!Oa.none,o=Ra(n,Ea)&&!Oa["pan-y"],a=Ra(n,wa)&&!Oa["pan-x"];if(i){var u=1===t.pointers.length,s=t.distance<2,c=t.deltaTime<250;if(u&&s&&c)return}if(!a||!o)return i||o&&6&r||a&&r&Ia?this.preventSrc(e):void 0}},e.preventSrc=function(t){this.manager.session.prevented=!0,t.preventDefault();},t}();function Na(t,e){for(;t;){if(t===e)return !0;t=t.parentNode;}return !1}function Fa(t){var e=t.length;if(1===e)return {x:la(t[0].clientX),y:la(t[0].clientY)};for(var r=0,n=0,i=0;i<e;)r+=t[i].clientX,n+=t[i].clientY,i++;return {x:la(r/e),y:la(n/e)}}function za(t){for(var e=[],r=0;r<t.pointers.length;)e[r]={clientX:la(t.pointers[r].clientX),clientY:la(t.pointers[r].clientY)},r++;return {timeStamp:pa(),pointers:e,center:Fa(e),deltaX:t.deltaX,deltaY:t.deltaY}}function qa(t,e,r){r||(r=Pa);var n=e[r[0]]-t[r[0]],i=e[r[1]]-t[r[1]];return Math.sqrt(n*n+i*i)}function Ya(t,e,r){r||(r=Pa);var n=e[r[0]]-t[r[0]],i=e[r[1]]-t[r[1]];return 180*Math.atan2(i,n)/Math.PI}function Ua(t,e){return t===e?1:ha(t)>=ha(e)?t<0?2:4:e<0?8:ja}function Xa(t,e,r){return {x:e/t||0,y:r/t||0}}function Va(t,e){var r=t.session,n=e.pointers,i=n.length;r.firstInput||(r.firstInput=za(e)),i>1&&!r.firstMultiple?r.firstMultiple=za(e):1===i&&(r.firstMultiple=!1);var o=r.firstInput,a=r.firstMultiple,u=a?a.center:o.center,s=e.center=Fa(n);e.timeStamp=pa(),e.deltaTime=e.timeStamp-o.timeStamp,e.angle=Ya(u,s),e.distance=qa(u,s),function(t,e){var r=e.center,n=t.offsetDelta||{},i=t.prevDelta||{},o=t.prevInput||{};1!==e.eventType&&4!==o.eventType||(i=t.prevDelta={x:o.deltaX||0,y:o.deltaY||0},n=t.offsetDelta={x:r.x,y:r.y}),e.deltaX=i.x+(r.x-n.x),e.deltaY=i.y+(r.y-n.y);}(r,e),e.offsetDirection=Ua(e.deltaX,e.deltaY);var c,f,l=Xa(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=l.x,e.overallVelocityY=l.y,e.overallVelocity=ha(l.x)>ha(l.y)?l.x:l.y,e.scale=a?(c=a.pointers,qa((f=n)[0],f[1],Da)/qa(c[0],c[1],Da)):1,e.rotation=a?function(t,e){return Ya(e[1],e[0],Da)+Ya(t[1],t[0],Da)}(a.pointers,n):0,e.maxPointers=r.prevInput?e.pointers.length>r.prevInput.maxPointers?e.pointers.length:r.prevInput.maxPointers:e.pointers.length,function(t,e){var r,n,i,o,a=t.lastInterval||e,u=e.timeStamp-a.timeStamp;if(8!==e.eventType&&(u>25||void 0===a.velocity)){var s=e.deltaX-a.deltaX,c=e.deltaY-a.deltaY,f=Xa(u,s,c);n=f.x,i=f.y,r=ha(f.x)>ha(f.y)?f.x:f.y,o=Ua(s,c),t.lastInterval=e;}else r=a.velocity,n=a.velocityX,i=a.velocityY,o=a.direction;e.velocity=r,e.velocityX=n,e.velocityY=i,e.direction=o;}(r,e);var h,p=t.element,v=e.srcEvent;Na(h=v.composedPath?v.composedPath()[0]:v.path?v.path[0]:v.target,p)&&(p=h),e.target=p;}function Wa(t,e,r){var n=r.pointers.length,i=r.changedPointers.length,o=1&e&&n-i==0,a=12&e&&n-i==0;r.isFirst=!!o,r.isFinal=!!a,o&&(t.session={}),r.eventType=e,Va(t,r),t.emit("hammer.input",r),t.recognize(r),t.session.prevInput=r;}function Ga(t){return t.trim().split(/\s+/g)}function Ha(t,e,r){La(Ga(e),(function(e){t.addEventListener(e,r,!1);}));}function $a(t,e,r){La(Ga(e),(function(e){t.removeEventListener(e,r,!1);}));}function Ja(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||window}var Qa=function(){function t(t,e){var r=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){Ca(t.options.enable,[t])&&r.handler(e);},this.init();}var e=t.prototype;return e.handler=function(){},e.init=function(){this.evEl&&Ha(this.element,this.evEl,this.domHandler),this.evTarget&&Ha(this.target,this.evTarget,this.domHandler),this.evWin&&Ha(Ja(this.element),this.evWin,this.domHandler);},e.destroy=function(){this.evEl&&$a(this.element,this.evEl,this.domHandler),this.evTarget&&$a(this.target,this.evTarget,this.domHandler),this.evWin&&$a(Ja(this.element),this.evWin,this.domHandler);},t}();function Ba(t,e,r){if(t.indexOf&&!r)return t.indexOf(e);for(var n=0;n<t.length;){if(r&&t[n][r]==e||!r&&t[n]===e)return n;n++;}return -1}var Ka={pointerdown:1,pointermove:2,pointerup:4,pointercancel:8,pointerout:8},Za={2:ka,3:"pen",4:Aa,5:"kinect"},tu="pointerdown",eu="pointermove pointerup pointercancel";ua.MSPointerEvent&&!ua.PointerEvent&&(tu="MSPointerDown",eu="MSPointerMove MSPointerUp MSPointerCancel");var ru=function(t){function e(){var r,n=e.prototype;return n.evEl=tu,n.evWin=eu,(r=t.apply(this,arguments)||this).store=r.manager.session.pointerEvents=[],r}return oa(e,t),e.prototype.handler=function(t){var e=this.store,r=!1,n=t.type.toLowerCase().replace("ms",""),i=Ka[n],o=Za[t.pointerType]||t.pointerType,a=o===ka,u=Ba(e,t.pointerId,"pointerId");1&i&&(0===t.button||a)?u<0&&(e.push(t),u=e.length-1):12&i&&(r=!0),u<0||(e[u]=t,this.callback(this.manager,i,{pointers:e,changedPointers:[t],pointerType:o,srcEvent:t}),r&&e.splice(u,1));},e}(Qa);function nu(t){return Array.prototype.slice.call(t,0)}function iu(t,e,r){for(var n=[],i=[],o=0;o<t.length;){var a=e?t[o][e]:t[o];Ba(i,a)<0&&n.push(t[o]),i[o]=a,o++;}return r&&(n=e?n.sort((function(t,r){return t[e]>r[e]})):n.sort()),n}var ou={touchstart:1,touchmove:2,touchend:4,touchcancel:8},au="touchstart touchmove touchend touchcancel",uu=function(t){function e(){var r;return e.prototype.evTarget=au,(r=t.apply(this,arguments)||this).targetIds={},r}return oa(e,t),e.prototype.handler=function(t){var e=ou[t.type],r=su.call(this,t,e);r&&this.callback(this.manager,e,{pointers:r[0],changedPointers:r[1],pointerType:ka,srcEvent:t});},e}(Qa);function su(t,e){var r,n,i=nu(t.touches),o=this.targetIds;if(3&e&&1===i.length)return o[i[0].identifier]=!0,[i,i];var a=nu(t.changedTouches),u=[],s=this.target;if(n=i.filter((function(t){return Na(t.target,s)})),1===e)for(r=0;r<n.length;)o[n[r].identifier]=!0,r++;for(r=0;r<a.length;)o[a[r].identifier]&&u.push(a[r]),12&e&&delete o[a[r].identifier],r++;return u.length?[iu(n.concat(u),"identifier",!0),u]:void 0}var cu={mousedown:1,mousemove:2,mouseup:4},fu="mousedown",lu="mousemove mouseup",hu=function(t){function e(){var r,n=e.prototype;return n.evEl=fu,n.evWin=lu,(r=t.apply(this,arguments)||this).pressed=!1,r}return oa(e,t),e.prototype.handler=function(t){var e=cu[t.type];1&e&&0===t.button&&(this.pressed=!0),2&e&&1!==t.which&&(e=4),this.pressed&&(4&e&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:Aa,srcEvent:t}));},e}(Qa);function pu(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var r={x:e.clientX,y:e.clientY},n=this.lastTouches;this.lastTouches.push(r);setTimeout((function(){var t=n.indexOf(r);t>-1&&n.splice(t,1);}),2500);}}function vu(t,e){1&t?(this.primaryTouch=e.changedPointers[0].identifier,pu.call(this,e)):12&t&&pu.call(this,e);}function du(t){for(var e=t.srcEvent.clientX,r=t.srcEvent.clientY,n=0;n<this.lastTouches.length;n++){var i=this.lastTouches[n],o=Math.abs(e-i.x),a=Math.abs(r-i.y);if(o<=25&&a<=25)return !0}return !1}var yu=function(){return function(t){function e(e,r){var n;return (n=t.call(this,e,r)||this).handler=function(t,e,r){var i=r.pointerType===ka,o=r.pointerType===Aa;if(!(o&&r.sourceCapabilities&&r.sourceCapabilities.firesTouchEvents)){if(i)vu.call(aa(aa(n)),e,r);else if(o&&du.call(aa(aa(n)),r))return;n.callback(t,e,r);}},n.touch=new uu(n.manager,n.handler),n.mouse=new hu(n.manager,n.handler),n.primaryTouch=null,n.lastTouches=[],n}return oa(e,t),e.prototype.destroy=function(){this.touch.destroy(),this.mouse.destroy();},e}(Qa)}();function gu(t,e,r){return !!Array.isArray(t)&&(La(t,r[e],r),!0)}var mu=32,bu=1;function _u(t,e){var r=e.manager;return r?r.get(t):t}function wu(t){return 16&t?"cancel":8&t?"end":4&t?"move":2&t?"start":""}var Eu=function(){function t(t){void 0===t&&(t={}),this.options=ia({enable:!0},t),this.id=bu++,this.manager=null,this.state=1,this.simultaneous={},this.requireFail=[];}var e=t.prototype;return e.set=function(t){return sa(this.options,t),this.manager&&this.manager.touchAction.update(),this},e.recognizeWith=function(t){if(gu(t,"recognizeWith",this))return this;var e=this.simultaneous;return e[(t=_u(t,this)).id]||(e[t.id]=t,t.recognizeWith(this)),this},e.dropRecognizeWith=function(t){return gu(t,"dropRecognizeWith",this)||(t=_u(t,this),delete this.simultaneous[t.id]),this},e.requireFailure=function(t){if(gu(t,"requireFailure",this))return this;var e=this.requireFail;return -1===Ba(e,t=_u(t,this))&&(e.push(t),t.requireFailure(this)),this},e.dropRequireFailure=function(t){if(gu(t,"dropRequireFailure",this))return this;t=_u(t,this);var e=Ba(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},e.hasRequireFailures=function(){return this.requireFail.length>0},e.canRecognizeWith=function(t){return !!this.simultaneous[t.id]},e.emit=function(t){var e=this,r=this.state;function n(r){e.manager.emit(r,t);}r<8&&n(e.options.event+wu(r)),n(e.options.event),t.additionalEvent&&n(t.additionalEvent),r>=8&&n(e.options.event+wu(r));},e.tryEmit=function(t){if(this.canEmit())return this.emit(t);this.state=mu;},e.canEmit=function(){for(var t=0;t<this.requireFail.length;){if(!(33&this.requireFail[t].state))return !1;t++;}return !0},e.recognize=function(t){var e=sa({},t);if(!Ca(this.options.enable,[this,e]))return this.reset(),void(this.state=mu);56&this.state&&(this.state=1),this.state=this.process(e),30&this.state&&this.tryEmit(e);},e.process=function(t){},e.getTouchAction=function(){},e.reset=function(){},t}(),Ou=function(t){function e(e){var r;return void 0===e&&(e={}),(r=t.call(this,ia({event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},e))||this).pTime=!1,r.pCenter=!1,r._timer=null,r._input=null,r.count=0,r}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){return [ba]},r.process=function(t){var e=this,r=this.options,n=t.pointers.length===r.pointers,i=t.distance<r.threshold,o=t.deltaTime<r.time;if(this.reset(),1&t.eventType&&0===this.count)return this.failTimeout();if(i&&o&&n){if(4!==t.eventType)return this.failTimeout();var a=!this.pTime||t.timeStamp-this.pTime<r.interval,u=!this.pCenter||qa(this.pCenter,t.center)<r.posThreshold;if(this.pTime=t.timeStamp,this.pCenter=t.center,u&&a?this.count+=1:this.count=1,this._input=t,0===this.count%r.taps)return this.hasRequireFailures()?(this._timer=setTimeout((function(){e.state=8,e.tryEmit();}),r.interval),2):8}return mu},r.failTimeout=function(){var t=this;return this._timer=setTimeout((function(){t.state=mu;}),this.options.interval),mu},r.reset=function(){clearTimeout(this._timer);},r.emit=function(){8===this.state&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input));},e}(Eu),Tu=function(t){function e(e){return void 0===e&&(e={}),t.call(this,ia({pointers:1},e))||this}oa(e,t);var r=e.prototype;return r.attrTest=function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},r.process=function(t){var e=this.state,r=t.eventType,n=6&e,i=this.attrTest(t);return n&&(8&r||!i)?16|e:n||i?4&r?8|e:2&e?4|e:2:mu},e}(Eu);function Su(t){return t===ja?"down":8===t?"up":2===t?"left":4===t?"right":""}var xu=function(t){function e(e){var r;return void 0===e&&(e={}),(r=t.call(this,ia({event:"pan",threshold:10,pointers:1,direction:30},e))||this).pX=null,r.pY=null,r}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){var t=this.options.direction,e=[];return 6&t&&e.push(Ea),t&Ia&&e.push(wa),e},r.directionTest=function(t){var e=this.options,r=!0,n=t.distance,i=t.direction,o=t.deltaX,a=t.deltaY;return i&e.direction||(6&e.direction?(i=0===o?1:o<0?2:4,r=o!==this.pX,n=Math.abs(t.deltaX)):(i=0===a?1:a<0?8:ja,r=a!==this.pY,n=Math.abs(t.deltaY))),t.direction=i,r&&n>e.threshold&&i&e.direction},r.attrTest=function(t){return Tu.prototype.attrTest.call(this,t)&&(2&this.state||!(2&this.state)&&this.directionTest(t))},r.emit=function(e){this.pX=e.deltaX,this.pY=e.deltaY;var r=Su(e.direction);r&&(e.additionalEvent=this.options.event+r),t.prototype.emit.call(this,e);},e}(Tu),ku=function(t){function e(e){return void 0===e&&(e={}),t.call(this,ia({event:"swipe",threshold:10,velocity:.3,direction:30,pointers:1},e))||this}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){return xu.prototype.getTouchAction.call(this)},r.attrTest=function(e){var r,n=this.options.direction;return 30&n?r=e.overallVelocity:6&n?r=e.overallVelocityX:n&Ia&&(r=e.overallVelocityY),t.prototype.attrTest.call(this,e)&&n&e.offsetDirection&&e.distance>this.options.threshold&&e.maxPointers===this.options.pointers&&ha(r)>this.options.velocity&&4&e.eventType},r.emit=function(t){var e=Su(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t);},e}(Tu),Au=function(t){function e(e){return void 0===e&&(e={}),t.call(this,ia({event:"pinch",threshold:0,pointers:2},e))||this}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){return [_a]},r.attrTest=function(e){return t.prototype.attrTest.call(this,e)&&(Math.abs(e.scale-1)>this.options.threshold||2&this.state)},r.emit=function(e){if(1!==e.scale){var r=e.scale<1?"in":"out";e.additionalEvent=this.options.event+r;}t.prototype.emit.call(this,e);},e}(Tu),ju=function(t){function e(e){return void 0===e&&(e={}),t.call(this,ia({event:"rotate",threshold:0,pointers:2},e))||this}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){return [_a]},r.attrTest=function(e){return t.prototype.attrTest.call(this,e)&&(Math.abs(e.rotation)>this.options.threshold||2&this.state)},e}(Tu),Iu=function(t){function e(e){var r;return void 0===e&&(e={}),(r=t.call(this,ia({event:"press",pointers:1,time:251,threshold:9},e))||this)._timer=null,r._input=null,r}oa(e,t);var r=e.prototype;return r.getTouchAction=function(){return [ma]},r.process=function(t){var e=this,r=this.options,n=t.pointers.length===r.pointers,i=t.distance<r.threshold,o=t.deltaTime>r.time;if(this._input=t,!i||!n||12&t.eventType&&!o)this.reset();else if(1&t.eventType)this.reset(),this._timer=setTimeout((function(){e.state=8,e.tryEmit();}),r.time);else if(4&t.eventType)return 8;return mu},r.reset=function(){clearTimeout(this._timer);},r.emit=function(t){8===this.state&&(t&&4&t.eventType?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=pa(),this.manager.emit(this.options.event,this._input)));},e}(Eu),Pu={domEvents:!1,touchAction:ga,enable:!0,inputTarget:null,inputClass:null,cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}},Du=[[ju,{enable:!1}],[Au,{enable:!1},["rotate"]],[ku,{direction:6}],[xu,{direction:6},["swipe"]],[Ou],[Ou,{event:"doubletap",taps:2},["tap"]],[Iu]];function Lu(t,e){var r,n=t.element;n.style&&(La(t.options.cssProps,(function(i,o){r=va(n.style,o),e?(t.oldCssProps[r]=n.style[r],n.style[r]=i):n.style[r]=t.oldCssProps[r]||"";})),e||(t.oldCssProps={}));}var Cu=function(){function t(t,e){var r,n=this;this.options=sa({},Pu,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=new((r=this).options.inputClass||(Sa?ru:xa?uu:Ta?yu:hu))(r,Wa),this.touchAction=new Ma(this,this.options.touchAction),Lu(this,!0),La(this.options.recognizers,(function(t){var e=n.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3]);}),this);}var e=t.prototype;return e.set=function(t){return sa(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},e.stop=function(t){this.session.stopped=t?2:1;},e.recognize=function(t){var e=this.session;if(!e.stopped){var r;this.touchAction.preventDefaults(t);var n=this.recognizers,i=e.curRecognizer;(!i||i&&8&i.state)&&(e.curRecognizer=null,i=null);for(var o=0;o<n.length;)r=n[o],2===e.stopped||i&&r!==i&&!r.canRecognizeWith(i)?r.reset():r.recognize(t),!i&&14&r.state&&(e.curRecognizer=r,i=r),o++;}},e.get=function(t){if(t instanceof Eu)return t;for(var e=this.recognizers,r=0;r<e.length;r++)if(e[r].options.event===t)return e[r];return null},e.add=function(t){if(gu(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},e.remove=function(t){if(gu(t,"remove",this))return this;var e=this.get(t);if(t){var r=this.recognizers,n=Ba(r,e);-1!==n&&(r.splice(n,1),this.touchAction.update());}return this},e.on=function(t,e){if(void 0===t||void 0===e)return this;var r=this.handlers;return La(Ga(t),(function(t){r[t]=r[t]||[],r[t].push(e);})),this},e.off=function(t,e){if(void 0===t)return this;var r=this.handlers;return La(Ga(t),(function(t){e?r[t]&&r[t].splice(Ba(r[t],e),1):delete r[t];})),this},e.emit=function(t,e){this.options.domEvents&&function(t,e){var r=document.createEvent("Event");r.initEvent(t,!0,!0),r.gesture=e,e.target.dispatchEvent(r);}(t,e);var r=this.handlers[t]&&this.handlers[t].slice();if(r&&r.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault();};for(var n=0;n<r.length;)r[n](e),n++;}},e.destroy=function(){this.element&&Lu(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null;},t}(),Ru={touchstart:1,touchmove:2,touchend:4,touchcancel:8},Mu="touchstart",Nu="touchstart touchmove touchend touchcancel",Fu=function(t){function e(){var r,n=e.prototype;return n.evTarget=Mu,n.evWin=Nu,(r=t.apply(this,arguments)||this).started=!1,r}return oa(e,t),e.prototype.handler=function(t){var e=Ru[t.type];if(1===e&&(this.started=!0),this.started){var r=zu.call(this,t,e);12&e&&r[0].length-r[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:r[0],changedPointers:r[1],pointerType:ka,srcEvent:t});}},e}(Qa);function zu(t,e){var r=nu(t.touches),n=nu(t.changedTouches);return 12&e&&(r=iu(r.concat(n),"identifier",!0)),[r,n]}function qu(t,e,r){var n="DEPRECATED METHOD: "+e+"\n"+r+" AT \n";return function(){var e=new Error("get-stack-trace"),r=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",i=window.console&&(window.console.warn||window.console.log);return i&&i.call(window.console,n,r),t.apply(this,arguments)}}var Yu=qu((function(t,e,r){for(var n=Object.keys(e),i=0;i<n.length;)(!r||r&&void 0===t[n[i]])&&(t[n[i]]=e[n[i]]),i++;return t}),"extend","Use `assign`."),Uu=qu((function(t,e){return Yu(t,e,!0)}),"merge","Use `assign`.");function Xu(t,e,r){var n,i=e.prototype;(n=t.prototype=Object.create(i)).constructor=t,n._super=i,r&&sa(n,r);}function Vu(t,e){return function(){return t.apply(e,arguments)}}var Wu=function(){var t=function(t,e){return void 0===e&&(e={}),new Cu(t,ia({recognizers:Du.concat()},e))};return t.VERSION="2.0.17-rc",t.DIRECTION_ALL=30,t.DIRECTION_DOWN=ja,t.DIRECTION_LEFT=2,t.DIRECTION_RIGHT=4,t.DIRECTION_UP=8,t.DIRECTION_HORIZONTAL=6,t.DIRECTION_VERTICAL=Ia,t.DIRECTION_NONE=1,t.DIRECTION_DOWN=ja,t.INPUT_START=1,t.INPUT_MOVE=2,t.INPUT_END=4,t.INPUT_CANCEL=8,t.STATE_POSSIBLE=1,t.STATE_BEGAN=2,t.STATE_CHANGED=4,t.STATE_ENDED=8,t.STATE_RECOGNIZED=8,t.STATE_CANCELLED=16,t.STATE_FAILED=mu,t.Manager=Cu,t.Input=Qa,t.TouchAction=Ma,t.TouchInput=uu,t.MouseInput=hu,t.PointerEventInput=ru,t.TouchMouseInput=yu,t.SingleTouchInput=Fu,t.Recognizer=Eu,t.AttrRecognizer=Tu,t.Tap=Ou,t.Pan=xu,t.Swipe=ku,t.Pinch=Au,t.Rotate=ju,t.Press=Iu,t.on=Ha,t.off=$a,t.each=La,t.merge=Uu,t.extend=Yu,t.bindFn=Vu,t.assign=sa,t.inherit=Xu,t.bindFn=Vu,t.prefixed=va,t.toArray=nu,t.inArray=Ba,t.uniqueArray=iu,t.splitStr=Ga,t.boolOrFn=Ca,t.hasParent=Na,t.addEventListeners=Ha,t.removeEventListeners=$a,t.defaults=sa({},Pu,{preset:Du}),t}();function Gu(t,e){var r;if(void 0===ra||null==zn(t)){if(Xo(t)||(r=function(t,e){var r;if(!t)return;if("string"==typeof t)return Hu(t,e);var n=$o(r=Object.prototype.toString.call(t)).call(r,8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Bn(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Hu(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,i=function(){};return {s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return {s:function(){r=Fn(t);},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,o=t;},f:function(){try{a||null==r.return||r.return();}finally{if(u)throw o}}}}function Hu(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var $u=ra("DELETE");function Ju(){var t=Qu.apply(void 0,arguments);return Ku(t),t}function Qu(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];if(e.length<2)return e[0];var n;if(e.length>2)return Qu.apply(void 0,ea(n=[Ju(e[0],e[1])]).call(n,Ko($o(e).call(e,2))));var i,o=e[0],a=e[1],u=Gu(Ho(a));try{for(u.s();!(i=u.n()).done;){var s=i.value;Object.prototype.propertyIsEnumerable.call(a,s)&&(a[s]===$u?delete o[s]:null===o[s]||null===a[s]||"object"!==Go(o[s])||"object"!==Go(a[s])||Xo(o[s])||Xo(a[s])?o[s]=Bu(a[s]):o[s]=Qu(o[s],a[s]));}}catch(t){u.e(t);}finally{u.f();}return o}function Bu(t){return Xo(t)?qt(t).call(t,(function(t){return Bu(t)})):"object"===Go(t)&&null!==t?Qu({},t):t}function Ku(t){for(var e=0,r=Uo(t);e<r.length;e++){var n=r[e];t[n]===$u?delete t[n]:"object"===Go(t[n])&&null!==t[n]&&Ku(t[n]);}}var Zu="undefined"!=typeof window?window.Hammer||Wu:function(){return {on:t=function(){},off:t,destroy:t,emit:t,get:function(){return {set:t}}};var t;};function ts(t){var e,r=this;this._cleanupQueue=[],this.active=!1,this._dom={container:t,overlay:document.createElement("div")},this._dom.overlay.classList.add("vis-overlay"),this._dom.container.appendChild(this._dom.overlay),this._cleanupQueue.push((function(){r._dom.overlay.parentNode.removeChild(r._dom.overlay);}));var n=Zu(this._dom.overlay);n.on("tap",ce(e=this._onTapOverlay).call(e,this)),this._cleanupQueue.push((function(){n.destroy();}));var i=["tap","doubletap","press","pinch","pan","panstart","panmove","panend"];lo(i).call(i,(function(t){n.on(t,(function(t){t.srcEvent.stopPropagation();}));})),document&&document.body&&(this._onClick=function(e){(function(t,e){for(;t;){if(t===e)return !0;t=t.parentNode;}return !1})(e.target,t)||r.deactivate();},document.body.addEventListener("click",this._onClick),this._cleanupQueue.push((function(){document.body.removeEventListener("click",r._onClick);}))),this._escListener=function(t){("key"in t?"Escape"===t.key:27===t.keyCode)&&r.deactivate();};}na(ts.prototype),ts.current=null,ts.prototype.destroy=function(){var t,e;this.deactivate();var r,n=Gu(no(t=Ki(e=this._cleanupQueue).call(e,0)).call(t));try{for(n.s();!(r=n.n()).done;){(0,r.value)();}}catch(t){n.e(t);}finally{n.f();}},ts.prototype.activate=function(){ts.current&&ts.current.deactivate(),ts.current=this,this.active=!0,this._dom.overlay.style.display="none",this._dom.container.classList.add("vis-active"),this.emit("change"),this.emit("activate"),document.body.addEventListener("keydown",this._escListener);},ts.prototype.deactivate=function(){this.active=!1,this._dom.overlay.style.display="block",this._dom.container.classList.remove("vis-active"),document.body.removeEventListener("keydown",this._escListener),this.emit("change"),this.emit("deactivate");},ts.prototype._onTapOverlay=function(t){this.activate(),t.srcEvent.stopPropagation();};var es=Ot("Reflect","construct"),rs=o((function(){function t(){}return !(es((function(){}),[],t)instanceof t)})),ns=!o((function(){es((function(){}));})),is=rs||ns;X({target:"Reflect",stat:!0,forced:is,sham:is},{construct:function(t,e){R(t),N(e);var r=arguments.length<3?t:R(arguments[2]);if(ns&&!rs)return es(t,e,r);if(t==r){switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3])}var n=[null];return n.push.apply(n,e),new(ae.apply(t,n))}var i=r.prototype,o=He(g(i)?i:Object.prototype),a=Function.apply.call(t,o,e);return g(a)?a:o}});var os=C.Reflect.construct,as=dt("Array").entries,us=Array.prototype,ss={DOMTokenList:!0,NodeList:!0},cs=function(t){var e=t.entries;return t===us||t instanceof Array&&e===us.entries||ss.hasOwnProperty(ar(t))?as:e},fs=r((function(t){var e=function(t){var e,r=Object.prototype,n=r.hasOwnProperty,i="function"==typeof Symbol?Symbol:{},o=i.iterator||"@@iterator",a=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function s(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{s({},"");}catch(t){s=function(t,e,r){return t[e]=r};}function c(t,e,r,n){var i=e&&e.prototype instanceof y?e:y,o=Object.create(i.prototype),a=new A(n||[]);return o._invoke=function(t,e,r){var n=l;return function(i,o){if(n===p)throw new Error("Generator is already running");if(n===v){if("throw"===i)throw o;return I()}for(r.method=i,r.arg=o;;){var a=r.delegate;if(a){var u=S(a,r);if(u){if(u===d)continue;return u}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(n===l)throw n=v,r.arg;r.dispatchException(r.arg);}else "return"===r.method&&r.abrupt("return",r.arg);n=p;var s=f(t,e,r);if("normal"===s.type){if(n=r.done?v:h,s.arg===d)continue;return {value:s.arg,done:r.done}}"throw"===s.type&&(n=v,r.method="throw",r.arg=s.arg);}}}(t,r,a),o}function f(t,e,r){try{return {type:"normal",arg:t.call(e,r)}}catch(t){return {type:"throw",arg:t}}}t.wrap=c;var l="suspendedStart",h="suspendedYield",p="executing",v="completed",d={};function y(){}function g(){}function m(){}var b={};b[o]=function(){return this};var _=Object.getPrototypeOf,w=_&&_(_(j([])));w&&w!==r&&n.call(w,o)&&(b=w);var E=m.prototype=y.prototype=Object.create(b);function O(t){["next","throw","return"].forEach((function(e){s(t,e,(function(t){return this._invoke(e,t)}));}));}function T(t,e){function r(i,o,a,u){var s=f(t[i],t,o);if("throw"!==s.type){var c=s.arg,l=c.value;return l&&"object"==typeof l&&n.call(l,"__await")?e.resolve(l.__await).then((function(t){r("next",t,a,u);}),(function(t){r("throw",t,a,u);})):e.resolve(l).then((function(t){c.value=t,a(c);}),(function(t){return r("throw",t,a,u)}))}u(s.arg);}var i;this._invoke=function(t,n){function o(){return new e((function(e,i){r(t,n,e,i);}))}return i=i?i.then(o,o):o()};}function S(t,r){var n=t.iterator[r.method];if(n===e){if(r.delegate=null,"throw"===r.method){if(t.iterator.return&&(r.method="return",r.arg=e,S(t,r),"throw"===r.method))return d;r.method="throw",r.arg=new TypeError("The iterator does not provide a 'throw' method");}return d}var i=f(n,t.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,d;var o=i.arg;return o?o.done?(r[t.resultName]=o.value,r.next=t.nextLoc,"return"!==r.method&&(r.method="next",r.arg=e),r.delegate=null,d):o:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,d)}function x(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e);}function k(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e;}function A(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(x,this),this.reset(!0);}function j(t){if(t){var r=t[o];if(r)return r.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var i=-1,a=function r(){for(;++i<t.length;)if(n.call(t,i))return r.value=t[i],r.done=!1,r;return r.value=e,r.done=!0,r};return a.next=a}}return {next:I}}function I(){return {value:e,done:!0}}return g.prototype=E.constructor=m,m.constructor=g,g.displayName=s(m,u,"GeneratorFunction"),t.isGeneratorFunction=function(t){var e="function"==typeof t&&t.constructor;return !!e&&(e===g||"GeneratorFunction"===(e.displayName||e.name))},t.mark=function(t){return Object.setPrototypeOf?Object.setPrototypeOf(t,m):(t.__proto__=m,s(t,u,"GeneratorFunction")),t.prototype=Object.create(E),t},t.awrap=function(t){return {__await:t}},O(T.prototype),T.prototype[a]=function(){return this},t.AsyncIterator=T,t.async=function(e,r,n,i,o){void 0===o&&(o=Promise);var a=new T(c(e,r,n,i),o);return t.isGeneratorFunction(r)?a:a.next().then((function(t){return t.done?t.value:a.next()}))},O(E),s(E,u,"Generator"),E[o]=function(){return this},E.toString=function(){return "[object Generator]"},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e.reverse(),function r(){for(;e.length;){var n=e.pop();if(n in t)return r.value=n,r.done=!1,r}return r.done=!0,r}},t.values=j,A.prototype={constructor:A,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(k),!t)for(var r in this)"t"===r.charAt(0)&&n.call(this,r)&&!isNaN(+r.slice(1))&&(this[r]=e);},stop:function(){this.done=!0;var t=this.tryEntries[0].completion;if("throw"===t.type)throw t.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var r=this;function i(n,i){return u.type="throw",u.arg=t,r.next=n,i&&(r.method="next",r.arg=e),!!i}for(var o=this.tryEntries.length-1;o>=0;--o){var a=this.tryEntries[o],u=a.completion;if("root"===a.tryLoc)return i("end");if(a.tryLoc<=this.prev){var s=n.call(a,"catchLoc"),c=n.call(a,"finallyLoc");if(s&&c){if(this.prev<a.catchLoc)return i(a.catchLoc,!0);if(this.prev<a.finallyLoc)return i(a.finallyLoc)}else if(s){if(this.prev<a.catchLoc)return i(a.catchLoc,!0)}else {if(!c)throw new Error("try statement without catch or finally");if(this.prev<a.finallyLoc)return i(a.finallyLoc)}}}},abrupt:function(t,e){for(var r=this.tryEntries.length-1;r>=0;--r){var i=this.tryEntries[r];if(i.tryLoc<=this.prev&&n.call(i,"finallyLoc")&&this.prev<i.finallyLoc){var o=i;break}}o&&("break"===t||"continue"===t)&&o.tryLoc<=e&&e<=o.finallyLoc&&(o=null);var a=o?o.completion:{};return a.type=t,a.arg=e,o?(this.method="next",this.next=o.finallyLoc,d):this.complete(a)},complete:function(t,e){if("throw"===t.type)throw t.arg;return "break"===t.type||"continue"===t.type?this.next=t.arg:"return"===t.type?(this.rval=this.arg=t.arg,this.method="return",this.next="end"):"normal"===t.type&&e&&(this.next=e),d},finish:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),k(r),d}},catch:function(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var i=n.arg;k(r);}return i}}throw new Error("illegal catch attempt")},delegateYield:function(t,r,n){return this.delegate={iterator:j(t),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=e),d}},t}(t.exports);try{regeneratorRuntime=e;}catch(t){Function("r","regeneratorRuntime = r")(e);}})),ls=Vo,hs=dt("Array").values,ps=Array.prototype,vs={DOMTokenList:!0,NodeList:!0},ds=function(t){var e=t.values;return t===ps||t instanceof Array&&e===ps.values||vs.hasOwnProperty(ar(t))?hs:e},ys=[],gs=ys.sort,ms=o((function(){ys.sort(void 0);})),bs=o((function(){ys.sort(null);})),_s=Jt("sort");X({target:"Array",proto:!0,forced:ms||!bs||!_s},{sort:function(t){return void 0===t?gs.call(K(this)):gs.call(K(this),R(t))}});var ws=dt("Array").sort,Es=Array.prototype,Os=function(t){var e=t.sort;return t===Es||t instanceof Array&&e===Es.sort?ws:e},Ts=dt("Array").keys,Ss=Array.prototype,xs={DOMTokenList:!0,NodeList:!0},ks=function(t){var e=t.keys;return t===Ss||t instanceof Array&&e===Ss.keys||xs.hasOwnProperty(ar(t))?Ts:e},As=wt.some,js=Jt("some"),Is=Ct("some");X({target:"Array",proto:!0,forced:!js||!Is},{some:function(t){return As(this,t,arguments.length>1?arguments[1]:void 0)}});var Ps=dt("Array").some,Ds=Array.prototype,Ls=function(t){var e=t.some;return t===Ds||t instanceof Array&&e===Ds.some?Ps:e},Cs=!o((function(){return Object.isExtensible(Object.preventExtensions({}))})),Rs=r((function(t){var e=z.f,r=it("meta"),n=0,i=Object.isExtensible||function(){return !0},o=function(t){e(t,r,{value:{objectID:"O"+ ++n,weakData:{}}});},a=t.exports={REQUIRED:!1,fastKey:function(t,e){if(!g(t))return "symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!_(t,r)){if(!i(t))return "F";if(!e)return "E";o(t);}return t[r].objectID},getWeakData:function(t,e){if(!_(t,r)){if(!i(t))return !0;if(!e)return !1;o(t);}return t[r].weakData},onFreeze:function(t){return Cs&&a.REQUIRED&&i(t)&&!_(t,r)&&o(t),t}};Oe[r]=!0;})),Ms=function(t,e){this.stopped=t,this.result=e;},Ns=function(t,e,r){var n,i,o,a,u,s,c,f=r&&r.that,l=!(!r||!r.AS_ENTRIES),h=!(!r||!r.IS_ITERATOR),p=!(!r||!r.INTERRUPTED),v=M(e,f,1+l+p),d=function(t){return n&&qn(n),new Ms(!0,t)},y=function(t){return l?(N(t),p?v(t[0],t[1],d):v(t[0],t[1])):p?v(t,d):v(t)};if(h)n=t;else {if("function"!=typeof(i=Nn(t)))throw TypeError("Target is not iterable");if(Vn(i)){for(o=0,a=J(t.length);a>o;o++)if((u=y(t[o]))&&u instanceof Ms)return u;return new Ms(!1)}n=i.call(t);}for(s=n.next;!(c=s.call(n)).done;){try{u=y(c.value);}catch(t){throw qn(n),t}if("object"==typeof u&&u&&u instanceof Ms)return u}return new Ms(!1)},Fs=function(t,e,r){if(!(t instanceof e))throw TypeError("Incorrect "+(r?r+" ":"")+"invocation");return t},zs=z.f,qs=wt.forEach,Ys=Tr.set,Us=Tr.getterFor,Xs=function(t,e,r){var n,u=-1!==t.indexOf("Map"),s=-1!==t.indexOf("Weak"),c=u?"set":"add",f=i[t],l=f&&f.prototype,h={};if(a&&"function"==typeof f&&(s||l.forEach&&!o((function(){(new f).entries().next();})))){n=e((function(e,r){Ys(Fs(e,n,t),{type:t,collection:new f}),null!=r&&Ns(r,e[c],{that:e,AS_ENTRIES:u});}));var p=Us(t);qs(["add","clear","delete","forEach","get","has","set","keys","values","entries"],(function(t){var e="add"==t||"set"==t;!(t in l)||s&&"clear"==t||q(n.prototype,t,(function(r,n){var i=p(this).collection;if(!e&&s&&!g(r))return "get"==t&&void 0;var o=i[t](0===r?0:r,n);return e?this:o}));})),s||zs(n.prototype,"size",{configurable:!0,get:function(){return p(this).collection.size}});}else n=r.getConstructor(e,t,u,c),Rs.REQUIRED=!0;return fr(n,t,!1,!0),h[t]=n,X({global:!0,forced:!0},h),s||r.setStrong(n,t,u),n},Vs=function(t,e,r){for(var n in e)r&&r.unsafe&&t[n]?t[n]=e[n]:Ke(t,n,e[n],r);return t},Ws=ft("species"),Gs=z.f,Hs=Rs.fastKey,$s=Tr.set,Js=Tr.getterFor,Qs={getConstructor:function(t,e,r,n){var i=t((function(t,o){Fs(t,i,e),$s(t,{type:e,index:He(null),first:void 0,last:void 0,size:0}),a||(t.size=0),null!=o&&Ns(o,t[n],{that:t,AS_ENTRIES:r});})),o=Js(e),u=function(t,e,r){var n,i,u=o(t),c=s(t,e);return c?c.value=r:(u.last=c={index:i=Hs(e,!0),key:e,value:r,previous:n=u.last,next:void 0,removed:!1},u.first||(u.first=c),n&&(n.next=c),a?u.size++:t.size++,"F"!==i&&(u.index[i]=c)),t},s=function(t,e){var r,n=o(t),i=Hs(e);if("F"!==i)return n.index[i];for(r=n.first;r;r=r.next)if(r.key==e)return r};return Vs(i.prototype,{clear:function(){for(var t=o(this),e=t.index,r=t.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete e[r.index],r=r.next;t.first=t.last=void 0,a?t.size=0:this.size=0;},delete:function(t){var e=this,r=o(e),n=s(e,t);if(n){var i=n.next,u=n.previous;delete r.index[n.index],n.removed=!0,u&&(u.next=i),i&&(i.previous=u),r.first==n&&(r.first=i),r.last==n&&(r.last=u),a?r.size--:e.size--;}return !!n},forEach:function(t){for(var e,r=o(this),n=M(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous;},has:function(t){return !!s(this,t)}}),Vs(i.prototype,r?{get:function(t){var e=s(this,t);return e&&e.value},set:function(t,e){return u(this,0===t?0:t,e)}}:{add:function(t){return u(this,t=0===t?0:t,t)}}),a&&Gs(i.prototype,"size",{get:function(){return o(this).size}}),i},setStrong:function(t,e,r){var n=e+" Iterator",i=Js(e),o=Js(n);On(t,e,(function(t,e){$s(this,{type:n,target:t,state:i(t),kind:e,last:void 0});}),(function(){for(var t=o(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?"keys"==e?{value:r.key,done:!1}:"values"==e?{value:r.value,done:!1}:{value:[r.key,r.value],done:!1}:(t.target=void 0,{value:void 0,done:!0})}),r?"entries":"values",!r,!0),function(t){var e=Ot(t),r=z.f;a&&e&&!e[Ws]&&r(e,Ws,{configurable:!0,get:function(){return this}});}(e);}},Bs=(Xs("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),Qs),C.Map),Ks=fi;X({target:"Object",stat:!0},{setPrototypeOf:dn});var Zs=C.Object.setPrototypeOf,tc=r((function(t){function e(r,n){return t.exports=e=Zs||function(t,e){return t.__proto__=e,t},e(r,n)}t.exports=e;}));var ec=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Ks(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&tc(t,e);};var rc=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t};var nc,ic=function(t,e){return !e||"object"!==Go(e)&&"function"!=typeof e?rc(t):e},oc=Ci,ac=r((function(t){function e(r){return t.exports=e=Zs?oc:function(t){return t.__proto__||oc(t)},e(r)}t.exports=e;})),uc=new Uint8Array(16);function sc(){if(!nc&&!(nc="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return nc(uc)}var cc=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function fc(t){return "string"==typeof t&&cc.test(t)}for(var lc=[],hc=0;hc<256;++hc)lc.push((hc+256).toString(16).substr(1));function pc(t,e,r){var n=(t=t||{}).random||(t.rng||sc)();if(n[6]=15&n[6]|64,n[8]=63&n[8]|128,e){r=r||0;for(var i=0;i<16;++i)e[r+i]=n[i];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=(lc[t[e+0]]+lc[t[e+1]]+lc[t[e+2]]+lc[t[e+3]]+"-"+lc[t[e+4]]+lc[t[e+5]]+"-"+lc[t[e+6]]+lc[t[e+7]]+"-"+lc[t[e+8]]+lc[t[e+9]]+"-"+lc[t[e+10]]+lc[t[e+11]]+lc[t[e+12]]+lc[t[e+13]]+lc[t[e+14]]+lc[t[e+15]]).toLowerCase();if(!fc(r))throw TypeError("Stringified UUID is invalid");return r}(n)}function vc(t){return "string"==typeof t||"number"==typeof t}var dc=function(){function t(e){fe(this,t),this._queue=[],this._timeout=null,this._extended=null,this.delay=null,this.max=1/0,this.setOptions(e);}return ve(t,[{key:"setOptions",value:function(t){t&&void 0!==t.delay&&(this.delay=t.delay),t&&void 0!==t.max&&(this.max=t.max),this._flushIfNeeded();}},{key:"destroy",value:function(){if(this.flush(),this._extended){for(var t=this._extended.object,e=this._extended.methods,r=0;r<e.length;r++){var n=e[r];n.original?t[n.name]=n.original:delete t[n.name];}this._extended=null;}}},{key:"replace",value:function(t,e){var r=this,n=t[e];if(!n)throw new Error("Method "+e+" undefined");t[e]=function(){for(var t=arguments.length,e=new Array(t),i=0;i<t;i++)e[i]=arguments[i];r.queue({args:e,fn:n,context:this});};}},{key:"queue",value:function(t){"function"==typeof t?this._queue.push({fn:t}):this._queue.push(t),this._flushIfNeeded();}},{key:"_flushIfNeeded",value:function(){var t=this;this._queue.length>this.max&&this.flush(),null!=this._timeout&&(clearTimeout(this._timeout),this._timeout=null),this.queue.length>0&&"number"==typeof this.delay&&(this._timeout=ei((function(){t.flush();}),this.delay));}},{key:"flush",value:function(){var t,e;lo(t=Ki(e=this._queue).call(e,0)).call(t,(function(t){t.fn.apply(t.context||t.fn,t.args||[]);}));}}],[{key:"extend",value:function(e,r){var n=new t(r);if(void 0!==e.flush)throw new Error("Target object already has a property flush");e.flush=function(){n.flush();};var i=[{name:"flush",original:void 0}];if(r&&r.replace)for(var o=0;o<r.replace.length;o++){var a=r.replace[o];i.push({name:a,original:e[a]}),n.replace(e,a);}return n._extended={object:e,methods:i},n}}]),t}(),yc=function(){function t(){fe(this,t),this._subscribers={"*":[],add:[],remove:[],update:[]},this.subscribe=t.prototype.on,this.unsubscribe=t.prototype.off;}return ve(t,[{key:"_trigger",value:function(t,e,r){var n,i;if("*"===t)throw new Error("Cannot trigger event *");lo(n=ea(i=[]).call(i,Ko(this._subscribers[t]),Ko(this._subscribers["*"]))).call(n,(function(n){n(t,e,null!=r?r:null);}));}},{key:"on",value:function(t,e){"function"==typeof e&&this._subscribers[t].push(e);}},{key:"off",value:function(t,e){var r;this._subscribers[t]=Gt(r=this._subscribers[t]).call(r,(function(t){return t!==e}));}}]),t}(),gc=(Xs("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),Qs),C.Set);function mc(t,e){var r;if(void 0===ra||null==zn(t)){if(Xo(t)||(r=function(t,e){var r;if(!t)return;if("string"==typeof t)return bc(t,e);var n=$o(r=Object.prototype.toString.call(t)).call(r,8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Bn(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return bc(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,i=function(){};return {s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return {s:function(){r=Fn(t);},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,o=t;},f:function(){try{a||null==r.return||r.return();}finally{if(u)throw o}}}}function bc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}var _c=function(){function t(e){fe(this,t),this._pairs=e;}return ve(t,[{key:ls,value:fs.mark((function t(){var e,r,n,i,o;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e=mc(this._pairs),t.prev=1,e.s();case 3:if((r=e.n()).done){t.next=9;break}return n=qo(r.value,2),i=n[0],o=n[1],t.next=7,[i,o];case 7:t.next=3;break;case 9:t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),e.e(t.t0);case 14:return t.prev=14,e.f(),t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[1,11,14,17]])}))},{key:"entries",value:fs.mark((function t(){var e,r,n,i,o;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e=mc(this._pairs),t.prev=1,e.s();case 3:if((r=e.n()).done){t.next=9;break}return n=qo(r.value,2),i=n[0],o=n[1],t.next=7,[i,o];case 7:t.next=3;break;case 9:t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),e.e(t.t0);case 14:return t.prev=14,e.f(),t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[1,11,14,17]])}))},{key:"keys",value:fs.mark((function t(){var e,r,n,i;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e=mc(this._pairs),t.prev=1,e.s();case 3:if((r=e.n()).done){t.next=9;break}return n=qo(r.value,1),i=n[0],t.next=7,i;case 7:t.next=3;break;case 9:t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),e.e(t.t0);case 14:return t.prev=14,e.f(),t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[1,11,14,17]])}))},{key:"values",value:fs.mark((function t(){var e,r,n,i;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:e=mc(this._pairs),t.prev=1,e.s();case 3:if((r=e.n()).done){t.next=9;break}return n=qo(r.value,2),i=n[1],t.next=7,i;case 7:t.next=3;break;case 9:t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),e.e(t.t0);case 14:return t.prev=14,e.f(),t.finish(14);case 17:case"end":return t.stop()}}),t,this,[[1,11,14,17]])}))},{key:"toIdArray",value:function(){var t;return qt(t=Ko(this._pairs)).call(t,(function(t){return t[0]}))}},{key:"toItemArray",value:function(){var t;return qt(t=Ko(this._pairs)).call(t,(function(t){return t[1]}))}},{key:"toEntryArray",value:function(){return Ko(this._pairs)}},{key:"toObjectMap",value:function(){var t,e=li(null),r=mc(this._pairs);try{for(r.s();!(t=r.n()).done;){var n=qo(t.value,2),i=n[0],o=n[1];e[i]=o;}}catch(t){r.e(t);}finally{r.f();}return e}},{key:"toMap",value:function(){return new Bs(this._pairs)}},{key:"toIdSet",value:function(){return new gc(this.toIdArray())}},{key:"toItemSet",value:function(){return new gc(this.toItemArray())}},{key:"cache",value:function(){return new t(Ko(this._pairs))}},{key:"distinct",value:function(t){var e,r=new gc,n=mc(this._pairs);try{for(n.s();!(e=n.n()).done;){var i=qo(e.value,2),o=i[0],a=i[1];r.add(t(a,o));}}catch(t){n.e(t);}finally{n.f();}return r}},{key:"filter",value:function(e){var r=this._pairs;return new t(pi({},ls,fs.mark((function t(){var n,i,o,a,u;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:n=mc(r),t.prev=1,n.s();case 3:if((i=n.n()).done){t.next=10;break}if(o=qo(i.value,2),a=o[0],u=o[1],!e(u,a)){t.next=8;break}return t.next=8,[a,u];case 8:t.next=3;break;case 10:t.next=15;break;case 12:t.prev=12,t.t0=t.catch(1),n.e(t.t0);case 15:return t.prev=15,n.f(),t.finish(15);case 18:case"end":return t.stop()}}),t,null,[[1,12,15,18]])}))))}},{key:"forEach",value:function(t){var e,r=mc(this._pairs);try{for(r.s();!(e=r.n()).done;){var n=qo(e.value,2),i=n[0];t(n[1],i);}}catch(t){r.e(t);}finally{r.f();}}},{key:"map",value:function(e){var r=this._pairs;return new t(pi({},ls,fs.mark((function t(){var n,i,o,a,u;return fs.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:n=mc(r),t.prev=1,n.s();case 3:if((i=n.n()).done){t.next=9;break}return o=qo(i.value,2),a=o[0],u=o[1],t.next=7,[a,e(u,a)];case 7:t.next=3;break;case 9:t.next=14;break;case 11:t.prev=11,t.t0=t.catch(1),n.e(t.t0);case 14:return t.prev=14,n.f(),t.finish(14);case 17:case"end":return t.stop()}}),t,null,[[1,11,14,17]])}))))}},{key:"max",value:function(t){var e=Fn(this._pairs),r=e.next();if(r.done)return null;for(var n=r.value[1],i=t(r.value[1],r.value[0]);!(r=e.next()).done;){var o=qo(r.value,2),a=o[0],u=o[1],s=t(u,a);s>i&&(i=s,n=u);}return n}},{key:"min",value:function(t){var e=Fn(this._pairs),r=e.next();if(r.done)return null;for(var n=r.value[1],i=t(r.value[1],r.value[0]);!(r=e.next()).done;){var o=qo(r.value,2),a=o[0],u=o[1],s=t(u,a);s<i&&(i=s,n=u);}return n}},{key:"reduce",value:function(t,e){var r,n=mc(this._pairs);try{for(n.s();!(r=n.n()).done;){var i=qo(r.value,2),o=i[0];e=t(e,i[1],o);}}catch(t){n.e(t);}finally{n.f();}return e}},{key:"sort",value:function(e){var r=this;return new t(pi({},ls,(function(){var t;return Fn(Os(t=Ko(r._pairs)).call(t,(function(t,r){var n=qo(t,2),i=n[0],o=n[1],a=qo(r,2),u=a[0],s=a[1];return e(o,s,i,u)})))})))}}]),t}();function wc(t,e){var r=Uo(t);if(on){var n=on(t);e&&(n=Gt(n).call(n,(function(e){return ze(t,e).enumerable}))),r.push.apply(r,n);}return r}function Ec(t){for(var e=1;e<arguments.length;e++){var r,n=null!=arguments[e]?arguments[e]:{};if(e%2)lo(r=wc(Object(n),!0)).call(r,(function(e){pi(t,e,n[e]);}));else if(Re)je(t,Re(n));else {var i;lo(i=wc(Object(n))).call(i,(function(e){ge(t,e,ze(n,e));}));}}return t}function Oc(t,e){var r;if(void 0===ra||null==zn(t)){if(Xo(t)||(r=function(t,e){var r;if(!t)return;if("string"==typeof t)return Tc(t,e);var n=$o(r=Object.prototype.toString.call(t)).call(r,8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Bn(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Tc(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,i=function(){};return {s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return {s:function(){r=Fn(t);},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,o=t;},f:function(){try{a||null==r.return||r.return();}finally{if(u)throw o}}}}function Tc(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function Sc(t){var e=function(){if("undefined"==typeof Reflect||!os)return !1;if(os.sham)return !1;if("function"==typeof Proxy)return !0;try{return Date.prototype.toString.call(os(Date,[],(function(){}))),!0}catch(t){return !1}}();return function(){var r,n=ac(t);if(e){var i=ac(this).constructor;r=os(n,arguments,i);}else r=n.apply(this,arguments);return ic(this,r)}}var xc=function(t){ec(r,t);var e=Sc(r);function r(t,n){var i;return fe(this,r),(i=e.call(this))._queue=null,t&&!Xo(t)&&(n=t,t=[]),i._options=n||{},i._data=new Bs,i.length=0,i._idProp=i._options.fieldId||"id",t&&t.length&&i.add(t),i.setOptions(n),i}return ve(r,[{key:"setOptions",value:function(t){t&&void 0!==t.queue&&(!1===t.queue?this._queue&&(this._queue.destroy(),this._queue=null):(this._queue||(this._queue=dc.extend(this,{replace:["add","update","remove"]})),t.queue&&"object"===Go(t.queue)&&this._queue.setOptions(t.queue)));}},{key:"add",value:function(t,e){var r,n=this,i=[];if(Xo(t)){var o=qt(t).call(t,(function(t){return t[n._idProp]}));if(Ls(o).call(o,(function(t){return n._data.has(t)})))throw new Error("A duplicate id was found in the parameter array.");for(var a=0,u=t.length;a<u;a++)r=this._addItem(t[a]),i.push(r);}else {if(!t||"object"!==Go(t))throw new Error("Unknown dataType");r=this._addItem(t),i.push(r);}return i.length&&this._trigger("add",{items:i},e),i}},{key:"update",value:function(t,e){var r=this,n=[],i=[],o=[],a=[],u=this._idProp,s=function(t){var e=t[u];if(null!=e&&r._data.has(e)){var s=t,c=Xi({},r._data.get(e)),f=r._updateItem(s);i.push(f),a.push(s),o.push(c);}else {var l=r._addItem(t);n.push(l);}};if(Xo(t))for(var c=0,f=t.length;c<f;c++)t[c]&&"object"===Go(t[c])?s(t[c]):console.warn("Ignoring input item, which is not an object at index "+c);else {if(!t||"object"!==Go(t))throw new Error("Unknown dataType");s(t);}if(n.length&&this._trigger("add",{items:n},e),i.length){var l={items:i,oldData:o,data:a};this._trigger("update",l,e);}return ea(n).call(n,i)}},{key:"updateOnly",value:function(t,e){var r,n=this;Xo(t)||(t=[t]);var i=qt(r=qt(t).call(t,(function(t){var e=n._data.get(t[n._idProp]);if(null==e)throw new Error("Updating non-existent items is not allowed.");return {oldData:e,update:t}}))).call(r,(function(t){var e=t.oldData,r=t.update,i=e[n._idProp],o=function(t){for(var e,r=arguments.length,n=new Array(r>1?r-1:0),i=1;i<r;i++)n[i-1]=arguments[i];return Ju.apply(void 0,ea(e=[{},t]).call(e,n))}(e,r);return n._data.set(i,o),{id:i,oldData:e,updatedData:o}}));if(i.length){var o={items:qt(i).call(i,(function(t){return t.id})),oldData:qt(i).call(i,(function(t){return t.oldData})),data:qt(i).call(i,(function(t){return t.updatedData}))};return this._trigger("update",o,e),o.items}return []}},{key:"get",value:function(t,e){var r=void 0,n=void 0,i=void 0;vc(t)?(r=t,i=e):Xo(t)?(n=t,i=e):i=t;var o,a=i&&"Object"===i.returnType?"Object":"Array",u=i&&Gt(i),s=[],c=void 0,f=void 0,l=void 0;if(null!=r)(c=this._data.get(r))&&u&&!u(c)&&(c=void 0);else if(null!=n)for(var h=0,p=n.length;h<p;h++)null==(c=this._data.get(n[h]))||u&&!u(c)||s.push(c);else for(var v,d=0,y=(f=Ko(ks(v=this._data).call(v))).length;d<y;d++)l=f[d],null==(c=this._data.get(l))||u&&!u(c)||s.push(c);if(i&&i.order&&null==r&&this._sort(s,i.order),i&&i.fields){var g=i.fields;if(null!=r&&null!=c)c=this._filterFields(c,g);else for(var m=0,b=s.length;m<b;m++)s[m]=this._filterFields(s[m],g);}if("Object"==a){for(var _={},w=0,E=s.length;w<E;w++){var O=s[w];_[O[this._idProp]]=O;}return _}return null!=r?null!==(o=c)&&void 0!==o?o:null:s}},{key:"getIds",value:function(t){var e=this._data,r=t&&Gt(t),n=t&&t.order,i=Ko(ks(e).call(e)),o=[];if(r)if(n){for(var a=[],u=0,s=i.length;u<s;u++){var c=i[u],f=this._data.get(c);null!=f&&r(f)&&a.push(f);}this._sort(a,n);for(var l=0,h=a.length;l<h;l++)o.push(a[l][this._idProp]);}else for(var p=0,v=i.length;p<v;p++){var d=i[p],y=this._data.get(d);null!=y&&r(y)&&o.push(y[this._idProp]);}else if(n){for(var g=[],m=0,b=i.length;m<b;m++){var _=i[m];g.push(e.get(_));}this._sort(g,n);for(var w=0,E=g.length;w<E;w++)o.push(g[w][this._idProp]);}else for(var O=0,T=i.length;O<T;O++){var S=i[O],x=e.get(S);null!=x&&o.push(x[this._idProp]);}return o}},{key:"getDataSet",value:function(){return this}},{key:"forEach",value:function(t,e){var r=e&&Gt(e),n=this._data,i=Ko(ks(n).call(n));if(e&&e.order)for(var o=this.get(e),a=0,u=o.length;a<u;a++){var s=o[a];t(s,s[this._idProp]);}else for(var c=0,f=i.length;c<f;c++){var l=i[c],h=this._data.get(l);null==h||r&&!r(h)||t(h,l);}}},{key:"map",value:function(t,e){for(var r=e&&Gt(e),n=[],i=this._data,o=Ko(ks(i).call(i)),a=0,u=o.length;a<u;a++){var s=o[a],c=this._data.get(s);null==c||r&&!r(c)||n.push(t(c,s));}return e&&e.order&&this._sort(n,e.order),n}},{key:"_filterFields",value:function(t,e){var r;return t?re(r=Xo(e)?e:Uo(e)).call(r,(function(e,r){return e[r]=t[r],e}),{}):t}},{key:"_sort",value:function(t,e){if("string"==typeof e){var r=e;Os(t).call(t,(function(t,e){var n=t[r],i=e[r];return n>i?1:n<i?-1:0}));}else {if("function"!=typeof e)throw new TypeError("Order must be a function or a string");Os(t).call(t,e);}}},{key:"remove",value:function(t,e){for(var r=[],n=[],i=Xo(t)?t:[t],o=0,a=i.length;o<a;o++){var u=this._remove(i[o]);if(u){var s=u[this._idProp];null!=s&&(r.push(s),n.push(u));}}return r.length&&this._trigger("remove",{items:r,oldData:n},e),r}},{key:"_remove",value:function(t){var e;if(vc(t)?e=t:t&&"object"===Go(t)&&(e=t[this._idProp]),null!=e&&this._data.has(e)){var r=this._data.get(e)||null;return this._data.delete(e),--this.length,r}return null}},{key:"clear",value:function(t){for(var e,r=Ko(ks(e=this._data).call(e)),n=[],i=0,o=r.length;i<o;i++)n.push(this._data.get(r[i]));return this._data.clear(),this.length=0,this._trigger("remove",{items:r,oldData:n},t),r}},{key:"max",value:function(t){var e,r,n=null,i=null,o=Oc(ds(e=this._data).call(e));try{for(o.s();!(r=o.n()).done;){var a=r.value,u=a[t];"number"==typeof u&&(null==i||u>i)&&(n=a,i=u);}}catch(t){o.e(t);}finally{o.f();}return n||null}},{key:"min",value:function(t){var e,r,n=null,i=null,o=Oc(ds(e=this._data).call(e));try{for(o.s();!(r=o.n()).done;){var a=r.value,u=a[t];"number"==typeof u&&(null==i||u<i)&&(n=a,i=u);}}catch(t){o.e(t);}finally{o.f();}return n||null}},{key:"distinct",value:function(t){for(var e=this._data,r=Ko(ks(e).call(e)),n=[],i=0,o=0,a=r.length;o<a;o++){for(var u=r[o],s=e.get(u)[t],c=!1,f=0;f<i;f++)if(n[f]==s){c=!0;break}c||void 0===s||(n[i]=s,i++);}return n}},{key:"_addItem",value:function(t){var e=function(t,e){return null==t[e]&&(t[e]=pc()),t}(t,this._idProp),r=e[this._idProp];if(this._data.has(r))throw new Error("Cannot add item: item with id "+r+" already exists");return this._data.set(r,e),++this.length,r}},{key:"_updateItem",value:function(t){var e=t[this._idProp];if(null==e)throw new Error("Cannot update item: item has no id (item: "+si(t)+")");var r=this._data.get(e);if(!r)throw new Error("Cannot update item: no item with id "+e+" found");return this._data.set(e,Ec(Ec({},r),t)),e}},{key:"stream",value:function(t){if(t){var e=this._data;return new _c(pi({},ls,fs.mark((function r(){var n,i,o,a;return fs.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:n=Oc(t),r.prev=1,n.s();case 3:if((i=n.n()).done){r.next=11;break}if(o=i.value,null==(a=e.get(o))){r.next=9;break}return r.next=9,[o,a];case 9:r.next=3;break;case 11:r.next=16;break;case 13:r.prev=13,r.t0=r.catch(1),n.e(r.t0);case 16:return r.prev=16,n.f(),r.finish(16);case 19:case"end":return r.stop()}}),r,null,[[1,13,16,19]])}))))}var r;return new _c(pi({},ls,ce(r=cs(this._data)).call(r,this._data)))}},{key:"idProp",get:function(){return this._idProp}}]),r}(yc);function kc(t,e){var r;if(void 0===ra||null==zn(t)){if(Xo(t)||(r=function(t,e){var r;if(!t)return;if("string"==typeof t)return Ac(t,e);var n=$o(r=Object.prototype.toString.call(t)).call(r,8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Bn(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return Ac(t,e)}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0,i=function(){};return {s:i,n:function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}},e:function(t){throw t},f:i}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return {s:function(){r=Fn(t);},n:function(){var t=r.next();return a=t.done,t},e:function(t){u=!0,o=t;},f:function(){try{a||null==r.return||r.return();}finally{if(u)throw o}}}}function Ac(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}function jc(t){var e=function(){if("undefined"==typeof Reflect||!os)return !1;if(os.sham)return !1;if("function"==typeof Proxy)return !0;try{return Date.prototype.toString.call(os(Date,[],(function(){}))),!0}catch(t){return !1}}();return function(){var r,n=ac(t);if(e){var i=ac(this).constructor;r=os(n,arguments,i);}else r=n.apply(this,arguments);return ic(this,r)}}var Ic=function(t){ec(r,t);var e=jc(r);function r(t,n){var i,o;return fe(this,r),(o=e.call(this)).length=0,o._ids=new gc,o._options=n||{},o._listener=ce(i=o._onEvent).call(i,rc(o)),o.setData(t),o}return ve(r,[{key:"setData",value:function(t){if(this._data){this._data.off&&this._data.off("*",this._listener);var e=this._data.getIds({filter:Gt(this._options)}),r=this._data.get(e);this._ids.clear(),this.length=0,this._trigger("remove",{items:e,oldData:r});}if(null!=t){this._data=t;for(var n=this._data.getIds({filter:Gt(this._options)}),i=0,o=n.length;i<o;i++){var a=n[i];this._ids.add(a);}this.length=n.length,this._trigger("add",{items:n});}else this._data=new xc;this._data.on&&this._data.on("*",this._listener);}},{key:"refresh",value:function(){for(var t=this._data.getIds({filter:Gt(this._options)}),e=Ko(this._ids),r={},n=[],i=[],o=[],a=0,u=t.length;a<u;a++){var s=t[a];r[s]=!0,this._ids.has(s)||(n.push(s),this._ids.add(s));}for(var c=0,f=e.length;c<f;c++){var l=e[c],h=this._data.get(l);null==h?console.error("If you see this, report it please."):r[l]||(i.push(l),o.push(h),this._ids.delete(l));}this.length+=n.length-i.length,n.length&&this._trigger("add",{items:n}),i.length&&this._trigger("remove",{items:i,oldData:o});}},{key:"get",value:function(t,e){if(null==this._data)return null;var r,n=null;vc(t)||Xo(t)?(n=t,r=e):r=t;var i=Xi({},this._options,r),o=Gt(this._options),a=r&&Gt(r);return o&&a&&(i.filter=function(t){return o(t)&&a(t)}),null==n?this._data.get(i):this._data.get(n,i)}},{key:"getIds",value:function(t){if(this._data.length){var e,r=Gt(this._options),n=null!=t?Gt(t):null;return e=n?r?function(t){return r(t)&&n(t)}:n:r,this._data.getIds({filter:e,order:t&&t.order})}return []}},{key:"forEach",value:function(t,e){if(this._data){var r,n,i=Gt(this._options),o=e&&Gt(e);n=o?i?function(t){return i(t)&&o(t)}:o:i,lo(r=this._data).call(r,t,{filter:n,order:e&&e.order});}}},{key:"map",value:function(t,e){if(this._data){var r,n,i=Gt(this._options),o=e&&Gt(e);return n=o?i?function(t){return i(t)&&o(t)}:o:i,qt(r=this._data).call(r,t,{filter:n,order:e&&e.order})}return []}},{key:"getDataSet",value:function(){return this._data.getDataSet()}},{key:"stream",value:function(t){var e;return this._data.stream(t||pi({},ls,ce(e=ks(this._ids)).call(e,this._ids)))}},{key:"dispose",value:function(){var t;null!==(t=this._data)&&void 0!==t&&t.off&&this._data.off("*",this._listener);var e,n="This data view has already been disposed of.",i={get:function(){throw new Error(n)},set:function(){throw new Error(n)},configurable:!1},o=kc(Ho(r.prototype));try{for(o.s();!(e=o.n()).done;){var a=e.value;ge(this,a,i);}}catch(t){o.e(t);}finally{o.f();}}},{key:"_onEvent",value:function(t,e,r){if(e&&e.items&&this._data){var n=e.items,i=[],o=[],a=[],u=[],s=[],c=[];switch(t){case"add":for(var f=0,l=n.length;f<l;f++){var h=n[f];this.get(h)&&(this._ids.add(h),i.push(h));}break;case"update":for(var p=0,v=n.length;p<v;p++){var d=n[p];this.get(d)?this._ids.has(d)?(o.push(d),s.push(e.data[p]),u.push(e.oldData[p])):(this._ids.add(d),i.push(d)):this._ids.has(d)&&(this._ids.delete(d),a.push(d),c.push(e.oldData[p]));}break;case"remove":for(var y=0,g=n.length;y<g;y++){var m=n[y];this._ids.has(m)&&(this._ids.delete(m),a.push(m),c.push(e.oldData[y]));}}this.length+=i.length-a.length,i.length&&this._trigger("add",{items:i},r),o.length&&this._trigger("update",{items:o,oldData:u,data:s},r),a.length&&this._trigger("remove",{items:a,oldData:c},r);}}},{key:"idProp",get:function(){return this.getDataSet().idProp}}]),r}(yc);function Pc(t,e){return "object"===Go(e)&&null!==e&&t===e.idProp&&"function"==typeof e.add&&"function"==typeof e.clear&&"function"==typeof e.distinct&&"function"==typeof lo(e)&&"function"==typeof e.get&&"function"==typeof e.getDataSet&&"function"==typeof e.getIds&&"number"==typeof e.length&&"function"==typeof qt(e)&&"function"==typeof e.max&&"function"==typeof e.min&&"function"==typeof e.off&&"function"==typeof e.on&&"function"==typeof e.remove&&"function"==typeof e.setOptions&&"function"==typeof e.stream&&"function"==typeof e.update&&"function"==typeof e.updateOnly}t.DELETE=$u,t.DataSet=xc,t.DataStream=_c,t.DataView=Ic,t.Queue=dc,t.createNewDataPipeFrom=function(t){return new ye(t)},t.isDataSetLike=Pc,t.isDataViewLike=function(t,e){return "object"===Go(e)&&null!==e&&t===e.idProp&&"function"==typeof lo(e)&&"function"==typeof e.get&&"function"==typeof e.getDataSet&&"function"==typeof e.getIds&&"number"==typeof e.length&&"function"==typeof qt(e)&&"function"==typeof e.off&&"function"==typeof e.on&&"function"==typeof e.stream&&Pc(t,e.getDataSet())},Object.defineProperty(t,"__esModule",{value:!0});})); }); var e=[],t=[];function n(n,r){if(n&&"undefined"!=typeof document){var a,s=!0===r.prepend?"prepend":"append",d=!0===r.singleTag,i="string"==typeof r.container?document.querySelector(r.container):document.getElementsByTagName("head")[0];if(d){var u=e.indexOf(i);-1===u&&(u=e.push(i)-1,t[u]={}),a=t[u]&&t[u][s]?t[u][s]:t[u][s]=c();}else a=c();65279===n.charCodeAt(0)&&(n=n.substring(1)),a.styleSheet?a.styleSheet.cssText+=n:a.appendChild(document.createTextNode(n));}function c(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),r.attributes)for(var t=Object.keys(r.attributes),n=0;n<t.length;n++)e.setAttribute(t[n],r.attributes[t[n]]);var a="prepend"===s?"afterbegin":"beforeend";return i.insertAdjacentElement(a,e),e}} var css$1 = ".vis-time-axis {\n position: relative;\n overflow: hidden;\n}\n\n.vis-time-axis.vis-foreground {\n top: 0;\n left: 0;\n width: 100%;\n}\n\n.vis-time-axis.vis-background {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.vis-time-axis .vis-text {\n position: absolute;\n color: #4d4d4d;\n padding: 3px;\n overflow: hidden;\n box-sizing: border-box;\n\n white-space: nowrap;\n}\n\n.vis-time-axis .vis-text.vis-measure {\n position: absolute;\n padding-left: 0;\n padding-right: 0;\n margin-left: 0;\n margin-right: 0;\n visibility: hidden;\n}\n\n.vis-time-axis .vis-grid.vis-vertical {\n position: absolute;\n border-left: 1px solid;\n}\n\n.vis-time-axis .vis-grid.vis-vertical-rtl {\n position: absolute;\n border-right: 1px solid;\n}\n\n.vis-time-axis .vis-grid.vis-minor {\n border-color: #e5e5e5;\n}\n\n.vis-time-axis .vis-grid.vis-major {\n border-color: #bfbfbf;\n}\n\n.vis .overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n /* Must be displayed above for example selected Timeline items */\n z-index: 10;\n}\n\n.vis-active {\n box-shadow: 0 0 10px #86d5f8;\n}\n\n.vis-custom-time {\n background-color: #6E94FF;\n width: 2px;\n cursor: move;\n z-index: 1;\n}\n\n.vis-custom-time > .vis-custom-time-marker {\n background-color: inherit;\n color: white;\n font-size: 12px;\n white-space: nowrap;\n padding: 3px 5px;\n top: 0px;\n cursor: initial;\n z-index: inherit;\n}\n.vis-timeline {\n /*\n -webkit-transition: height .4s ease-in-out;\n transition: height .4s ease-in-out;\n */\n}\n\n.vis-panel {\n /*\n -webkit-transition: height .4s ease-in-out, top .4s ease-in-out;\n transition: height .4s ease-in-out, top .4s ease-in-out;\n */\n}\n\n.vis-axis {\n /*\n -webkit-transition: top .4s ease-in-out;\n transition: top .4s ease-in-out;\n */\n}\n\n/* TODO: get animation working nicely\n\n.vis-item {\n -webkit-transition: top .4s ease-in-out;\n transition: top .4s ease-in-out;\n}\n\n.vis-item.line {\n -webkit-transition: height .4s ease-in-out, top .4s ease-in-out;\n transition: height .4s ease-in-out, top .4s ease-in-out;\n}\n/**/\n.vis-current-time {\n background-color: #FF7F6E;\n width: 2px;\n z-index: 1;\n pointer-events: none;\n}\n\n.vis-rolling-mode-btn {\n height: 40px;\n width: 40px;\n position: absolute;\n top: 7px;\n right: 20px;\n border-radius: 50%;\n font-size: 28px;\n cursor: pointer;\n opacity: 0.8;\n color: white;\n font-weight: bold;\n text-align: center;\n background: #3876c2;\n}\n.vis-rolling-mode-btn:before {\n content: \"\\26F6\";\n}\n\n.vis-rolling-mode-btn:hover {\n opacity: 1;\n}\n.vis-panel {\n position: absolute;\n\n padding: 0;\n margin: 0;\n\n box-sizing: border-box;\n}\n\n.vis-panel.vis-center,\n.vis-panel.vis-left,\n.vis-panel.vis-right,\n.vis-panel.vis-top,\n.vis-panel.vis-bottom {\n border: 1px #bfbfbf;\n}\n\n.vis-panel.vis-center,\n.vis-panel.vis-left,\n.vis-panel.vis-right {\n border-top-style: solid;\n border-bottom-style: solid;\n overflow: hidden;\n}\n\n.vis-left.vis-panel.vis-vertical-scroll, .vis-right.vis-panel.vis-vertical-scroll {\n height: 100%;\n overflow-x: hidden;\n overflow-y: scroll;\n} \n\n.vis-left.vis-panel.vis-vertical-scroll {\n direction: rtl;\n}\n\n.vis-left.vis-panel.vis-vertical-scroll .vis-content {\n direction: ltr;\n}\n\n.vis-right.vis-panel.vis-vertical-scroll {\n direction: ltr;\n}\n\n.vis-right.vis-panel.vis-vertical-scroll .vis-content {\n direction: rtl;\n}\n\n.vis-panel.vis-center,\n.vis-panel.vis-top,\n.vis-panel.vis-bottom {\n border-left-style: solid;\n border-right-style: solid;\n}\n\n.vis-background {\n overflow: hidden;\n}\n\n.vis-panel > .vis-content {\n position: relative;\n}\n\n.vis-panel .vis-shadow {\n position: absolute;\n width: 100%;\n height: 1px;\n box-shadow: 0 0 10px rgba(0,0,0,0.8);\n /* TODO: find a nice way to ensure vis-shadows are drawn on top of items\n z-index: 1;\n */\n}\n\n.vis-panel .vis-shadow.vis-top {\n top: -1px;\n left: 0;\n}\n\n.vis-panel .vis-shadow.vis-bottom {\n bottom: -1px;\n left: 0;\n}\n.vis-graph-group0 {\n fill:#4f81bd;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #4f81bd;\n}\n\n.vis-graph-group1 {\n fill:#f79646;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #f79646;\n}\n\n.vis-graph-group2 {\n fill: #8c51cf;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #8c51cf;\n}\n\n.vis-graph-group3 {\n fill: #75c841;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #75c841;\n}\n\n.vis-graph-group4 {\n fill: #ff0100;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #ff0100;\n}\n\n.vis-graph-group5 {\n fill: #37d8e6;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #37d8e6;\n}\n\n.vis-graph-group6 {\n fill: #042662;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #042662;\n}\n\n.vis-graph-group7 {\n fill:#00ff26;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #00ff26;\n}\n\n.vis-graph-group8 {\n fill:#ff00ff;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #ff00ff;\n}\n\n.vis-graph-group9 {\n fill: #8f3938;\n fill-opacity:0;\n stroke-width:2px;\n stroke: #8f3938;\n}\n\n.vis-timeline .vis-fill {\n fill-opacity:0.1;\n stroke: none;\n}\n\n\n.vis-timeline .vis-bar {\n fill-opacity:0.5;\n stroke-width:1px;\n}\n\n.vis-timeline .vis-point {\n stroke-width:2px;\n fill-opacity:1.0;\n}\n\n\n.vis-timeline .vis-legend-background {\n stroke-width:1px;\n fill-opacity:0.9;\n fill: #ffffff;\n stroke: #c2c2c2;\n}\n\n\n.vis-timeline .vis-outline {\n stroke-width:1px;\n fill-opacity:1;\n fill: #ffffff;\n stroke: #e5e5e5;\n}\n\n.vis-timeline .vis-icon-fill {\n fill-opacity:0.3;\n stroke: none;\n}\n\n\n.vis-timeline {\n position: relative;\n border: 1px solid #bfbfbf;\n overflow: hidden;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n}\n\n.vis-loading-screen {\n width: 100%;\n height: 100%;\n position: absolute;\n top: 0;\n left: 0;\n}\n/* override some bootstrap styles screwing up the timelines css */\n\n.vis [class*=\"span\"] {\n min-height: 0;\n width: auto;\n}\n\n\n.vis-item {\n position: absolute;\n color: #1A1A1A;\n border-color: #97B0F8;\n border-width: 1px;\n background-color: #D5DDF6;\n display: inline-block;\n z-index: 1;\n /*overflow: hidden;*/\n}\n\n.vis-item.vis-selected {\n border-color: #FFC200;\n background-color: #FFF785;\n\n /* z-index must be higher than the z-index of custom time bar and current time bar */\n z-index: 2;\n}\n\n.vis-editable.vis-selected {\n cursor: move;\n}\n\n.vis-item.vis-point.vis-selected {\n background-color: #FFF785;\n}\n\n.vis-item.vis-box {\n text-align: center;\n border-style: solid;\n border-radius: 2px;\n}\n\n.vis-item.vis-point {\n background: none;\n}\n\n.vis-item.vis-dot {\n position: absolute;\n padding: 0;\n border-width: 4px;\n border-style: solid;\n border-radius: 4px;\n}\n\n.vis-item.vis-range {\n border-style: solid;\n border-radius: 2px;\n box-sizing: border-box;\n}\n\n.vis-item.vis-background {\n border: none;\n background-color: rgba(213, 221, 246, 0.4);\n box-sizing: border-box;\n padding: 0;\n margin: 0;\n}\n\n.vis-item .vis-item-overflow {\n position: relative;\n width: 100%;\n height: 100%;\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n.vis-item-visible-frame {\n white-space: nowrap;\n}\n\n.vis-item.vis-range .vis-item-content {\n position: relative;\n display: inline-block;\n}\n\n.vis-item.vis-background .vis-item-content {\n position: absolute;\n display: inline-block;\n}\n\n.vis-item.vis-line {\n padding: 0;\n position: absolute;\n width: 0;\n border-left-width: 1px;\n border-left-style: solid;\n}\n\n.vis-item .vis-item-content {\n white-space: nowrap;\n box-sizing: border-box;\n padding: 5px;\n}\n\n.vis-item .vis-onUpdateTime-tooltip {\n position: absolute;\n background: #4f81bd;\n color: white;\n width: 200px;\n text-align: center;\n white-space: nowrap;\n padding: 5px;\n border-radius: 1px;\n transition: 0.4s;\n -o-transition: 0.4s;\n -moz-transition: 0.4s;\n -webkit-transition: 0.4s;\n}\n\n.vis-item .vis-delete, .vis-item .vis-delete-rtl {\n position: absolute;\n top: 0px;\n width: 24px;\n height: 24px;\n box-sizing: border-box;\n padding: 0px 5px;\n cursor: pointer;\n\n -webkit-transition: background 0.2s linear;\n -moz-transition: background 0.2s linear;\n -ms-transition: background 0.2s linear;\n -o-transition: background 0.2s linear;\n transition: background 0.2s linear;\n}\n\n.vis-item .vis-delete {\n right: -24px;\n}\n\n.vis-item .vis-delete-rtl {\n left: -24px;\n}\n\n.vis-item .vis-delete:after, .vis-item .vis-delete-rtl:after {\n content: \"\\00D7\"; /* MULTIPLICATION SIGN */\n color: red;\n font-family: arial, sans-serif;\n font-size: 22px;\n font-weight: bold;\n\n -webkit-transition: color 0.2s linear;\n -moz-transition: color 0.2s linear;\n -ms-transition: color 0.2s linear;\n -o-transition: color 0.2s linear;\n transition: color 0.2s linear;\n}\n\n.vis-item .vis-delete:hover, .vis-item .vis-delete-rtl:hover {\n background: red;\n}\n\n.vis-item .vis-delete:hover:after, .vis-item .vis-delete-rtl:hover:after {\n color: white;\n}\n\n.vis-item .vis-drag-center {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0px;\n cursor: move;\n}\n\n.vis-item.vis-range .vis-drag-left {\n position: absolute;\n width: 24px;\n max-width: 20%;\n min-width: 2px;\n height: 100%;\n top: 0;\n left: -4px;\n\n cursor: w-resize;\n}\n\n.vis-item.vis-range .vis-drag-right {\n position: absolute;\n width: 24px;\n max-width: 20%;\n min-width: 2px;\n height: 100%;\n top: 0;\n right: -4px;\n\n cursor: e-resize;\n}\n\n.vis-range.vis-item.vis-readonly .vis-drag-left,\n.vis-range.vis-item.vis-readonly .vis-drag-right {\n cursor: auto;\n}\n\n.vis-item.vis-cluster {\n vertical-align: center;\n text-align: center;\n border-style: solid;\n border-radius: 2px;\n}\n\n.vis-item.vis-cluster-line {\n padding: 0;\n position: absolute;\n width: 0;\n border-left-width: 1px;\n border-left-style: solid;\n}\n\n.vis-item.vis-cluster-dot {\n position: absolute;\n padding: 0;\n border-width: 4px;\n border-style: solid;\n border-radius: 4px;\n}\ndiv.vis-tooltip {\n position: absolute;\n visibility: hidden;\n padding: 5px;\n white-space: nowrap;\n\n font-family: verdana;\n font-size:14px;\n color:#000000;\n background-color: #f5f4ed;\n\n -moz-border-radius: 3px;\n -webkit-border-radius: 3px;\n border-radius: 3px;\n border: 1px solid #808074;\n\n box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2);\n pointer-events: none;\n\n z-index: 5;\n}\n\n\n.vis-itemset {\n position: relative;\n padding: 0;\n margin: 0;\n\n box-sizing: border-box;\n}\n\n.vis-itemset .vis-background,\n.vis-itemset .vis-foreground {\n position: absolute;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n.vis-axis {\n position: absolute;\n width: 100%;\n height: 0;\n left: 0;\n z-index: 1;\n}\n\n.vis-foreground .vis-group {\n position: relative;\n box-sizing: border-box;\n border-bottom: 1px solid #bfbfbf;\n}\n\n.vis-foreground .vis-group:last-child {\n border-bottom: none;\n}\n\n.vis-nesting-group {\n cursor: pointer;\n}\n\n.vis-label.vis-nested-group.vis-group-level-unknown-but-gte1 {\n background: #f5f5f5;\n}\n.vis-label.vis-nested-group.vis-group-level-0 {\n background-color: #ffffff;\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-0 .vis-inner {\n padding-left: 0;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-0 .vis-inner {\n padding-right: 0;\n}\n.vis-label.vis-nested-group.vis-group-level-1 {\n background-color: rgba(0, 0, 0, 0.05);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-1 .vis-inner {\n padding-left: 15px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-1 .vis-inner {\n padding-right: 15px;\n}\n.vis-label.vis-nested-group.vis-group-level-2 {\n background-color: rgba(0, 0, 0, 0.1);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-2 .vis-inner {\n padding-left: 30px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-2 .vis-inner {\n padding-right: 30px;\n}\n.vis-label.vis-nested-group.vis-group-level-3 {\n background-color: rgba(0, 0, 0, 0.15);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-3 .vis-inner {\n padding-left: 45px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-3 .vis-inner {\n padding-right: 45px;\n}\n.vis-label.vis-nested-group.vis-group-level-4 {\n background-color: rgba(0, 0, 0, 0.2);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-4 .vis-inner {\n padding-left: 60px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-4 .vis-inner {\n padding-right: 60px;\n}\n.vis-label.vis-nested-group.vis-group-level-5 {\n background-color: rgba(0, 0, 0, 0.25);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-5 .vis-inner {\n padding-left: 75px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-5 .vis-inner {\n padding-right: 75px;\n}\n.vis-label.vis-nested-group.vis-group-level-6 {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-6 .vis-inner {\n padding-left: 90px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-6 .vis-inner {\n padding-right: 90px;\n}\n.vis-label.vis-nested-group.vis-group-level-7 {\n background-color: rgba(0, 0, 0, 0.35);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-7 .vis-inner {\n padding-left: 105px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-7 .vis-inner {\n padding-right: 105px;\n}\n.vis-label.vis-nested-group.vis-group-level-8 {\n background-color: rgba(0, 0, 0, 0.4);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-8 .vis-inner {\n padding-left: 120px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-8 .vis-inner {\n padding-right: 120px;\n}\n.vis-label.vis-nested-group.vis-group-level-9 {\n background-color: rgba(0, 0, 0, 0.45);\n}\n.vis-ltr .vis-label.vis-nested-group.vis-group-level-9 .vis-inner {\n padding-left: 135px;\n}\n.vis-rtl .vis-label.vis-nested-group.vis-group-level-9 .vis-inner {\n padding-right: 135px;\n}\n/* default takes over beginning with level-10 (thats why we add .vis-nested-group\n to the selectors above, to have higher specifity than these rules for the defaults) */\n.vis-label.vis-nested-group {\n background-color: rgba(0, 0, 0, 0.5);\n}\n.vis-ltr .vis-label.vis-nested-group .vis-inner {\n padding-left: 150px;\n}\n.vis-rtl .vis-label.vis-nested-group .vis-inner {\n padding-right: 150px;\n}\n\n.vis-group-level-unknown-but-gte1 {\n border: 1px solid red;\n}\n\n/* expanded/collapsed indicators */\n.vis-label.vis-nesting-group:before,\n.vis-label.vis-nesting-group:before {\n display: inline-block;\n width: 15px;\n}\n.vis-label.vis-nesting-group.expanded:before {\n content: \"\\25BC\";\n}\n.vis-label.vis-nesting-group.collapsed:before {\n content: \"\\25B6\";\n}\n.vis-rtl .vis-label.vis-nesting-group.collapsed:before {\n content: \"\\25C0\";\n}\n/* compensate missing expanded/collapsed indicator, but only at levels > 0 */\n.vis-ltr .vis-label:not(.vis-nesting-group):not(.vis-group-level-0) {\n padding-left: 15px;\n}\n.vis-rtl .vis-label:not(.vis-nesting-group):not(.vis-group-level-0) {\n padding-right: 15px;\n}\n\n.vis-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: 10;\n}\n\n.vis-labelset {\n position: relative;\n\n overflow: hidden;\n\n box-sizing: border-box;\n}\n\n.vis-labelset .vis-label {\n position: relative;\n left: 0;\n top: 0;\n width: 100%;\n color: #4d4d4d;\n\n box-sizing: border-box;\n}\n\n.vis-labelset .vis-label {\n border-bottom: 1px solid #bfbfbf;\n}\n\n.vis-labelset .vis-label.draggable {\n cursor: pointer;\n}\n\n.vis-group-is-dragging {\n background: rgba(0, 0, 0, .1);\n}\n\n.vis-labelset .vis-label:last-child {\n border-bottom: none;\n}\n\n.vis-labelset .vis-label .vis-inner {\n display: inline-block;\n padding: 5px;\n}\n\n.vis-labelset .vis-label .vis-inner.vis-hidden {\n padding: 0;\n}\n\ndiv.vis-configuration {\n position:relative;\n display:block;\n float:left;\n font-size:12px;\n}\n\ndiv.vis-configuration-wrapper {\n display:block;\n width:700px;\n}\n\ndiv.vis-configuration-wrapper::after {\n clear: both;\n content: \"\";\n display: block;\n}\n\ndiv.vis-configuration.vis-config-option-container{\n display:block;\n width:495px;\n background-color: #ffffff;\n border:2px solid #f7f8fa;\n border-radius:4px;\n margin-top:20px;\n left:10px;\n padding-left:5px;\n}\n\ndiv.vis-configuration.vis-config-button{\n display:block;\n width:495px;\n height:25px;\n vertical-align: middle;\n line-height:25px;\n background-color: #f7f8fa;\n border:2px solid #ceced0;\n border-radius:4px;\n margin-top:20px;\n left:10px;\n padding-left:5px;\n cursor: pointer;\n margin-bottom:30px;\n}\n\ndiv.vis-configuration.vis-config-button.hover{\n background-color: #4588e6;\n border:2px solid #214373;\n color:#ffffff;\n}\n\ndiv.vis-configuration.vis-config-item{\n display:block;\n float:left;\n width:495px;\n height:25px;\n vertical-align: middle;\n line-height:25px;\n}\n\n\ndiv.vis-configuration.vis-config-item.vis-config-s2{\n left:10px;\n background-color: #f7f8fa;\n padding-left:5px;\n border-radius:3px;\n}\ndiv.vis-configuration.vis-config-item.vis-config-s3{\n left:20px;\n background-color: #e4e9f0;\n padding-left:5px;\n border-radius:3px;\n}\ndiv.vis-configuration.vis-config-item.vis-config-s4{\n left:30px;\n background-color: #cfd8e6;\n padding-left:5px;\n border-radius:3px;\n}\n\ndiv.vis-configuration.vis-config-header{\n font-size:18px;\n font-weight: bold;\n}\n\ndiv.vis-configuration.vis-config-label{\n width:120px;\n height:25px;\n line-height: 25px;\n}\n\ndiv.vis-configuration.vis-config-label.vis-config-s3{\n width:110px;\n}\ndiv.vis-configuration.vis-config-label.vis-config-s4{\n width:100px;\n}\n\ndiv.vis-configuration.vis-config-colorBlock{\n top:1px;\n width:30px;\n height:19px;\n border:1px solid #444444;\n border-radius:2px;\n padding:0px;\n margin:0px;\n cursor:pointer;\n}\n\ninput.vis-configuration.vis-config-checkbox {\n left:-5px;\n}\n\n\ninput.vis-configuration.vis-config-rangeinput{\n position:relative;\n top:-5px;\n width:60px;\n /*height:13px;*/\n padding:1px;\n margin:0;\n pointer-events:none;\n}\n\ninput.vis-configuration.vis-config-range{\n /*removes default webkit styles*/\n -webkit-appearance: none;\n\n /*fix for FF unable to apply focus style bug */\n border: 0px solid white;\n background-color:rgba(0,0,0,0);\n\n /*required for proper track sizing in FF*/\n width: 300px;\n height:20px;\n}\ninput.vis-configuration.vis-config-range::-webkit-slider-runnable-track {\n width: 300px;\n height: 5px;\n background: #dedede; /* Old browsers */\n background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */\n background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */\n background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */\n background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */\n background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */\n filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */\n\n border: 1px solid #999999;\n box-shadow: #aaaaaa 0px 0px 3px 0px;\n border-radius: 3px;\n}\ninput.vis-configuration.vis-config-range::-webkit-slider-thumb {\n -webkit-appearance: none;\n border: 1px solid #14334b;\n height: 17px;\n width: 17px;\n border-radius: 50%;\n background: #3876c2; /* Old browsers */\n background: -moz-linear-gradient(top, #3876c2 0%, #385380 100%); /* FF3.6+ */\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#3876c2), color-stop(100%,#385380)); /* Chrome,Safari4+ */\n background: -webkit-linear-gradient(top, #3876c2 0%,#385380 100%); /* Chrome10+,Safari5.1+ */\n background: -o-linear-gradient(top, #3876c2 0%,#385380 100%); /* Opera 11.10+ */\n background: -ms-linear-gradient(top, #3876c2 0%,#385380 100%); /* IE10+ */\n background: linear-gradient(to bottom, #3876c2 0%,#385380 100%); /* W3C */\n filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#3876c2', endColorstr='#385380',GradientType=0 ); /* IE6-9 */\n box-shadow: #111927 0px 0px 1px 0px;\n margin-top: -7px;\n}\ninput.vis-configuration.vis-config-range:focus {\n outline: none;\n}\ninput.vis-configuration.vis-config-range:focus::-webkit-slider-runnable-track {\n background: #9d9d9d; /* Old browsers */\n background: -moz-linear-gradient(top, #9d9d9d 0%, #c8c8c8 99%); /* FF3.6+ */\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#9d9d9d), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */\n background: -webkit-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */\n background: -o-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* Opera 11.10+ */\n background: -ms-linear-gradient(top, #9d9d9d 0%,#c8c8c8 99%); /* IE10+ */\n background: linear-gradient(to bottom, #9d9d9d 0%,#c8c8c8 99%); /* W3C */\n filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9d9d9d', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */\n}\n\ninput.vis-configuration.vis-config-range::-moz-range-track {\n width: 300px;\n height: 10px;\n background: #dedede; /* Old browsers */\n background: -moz-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* FF3.6+ */\n background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#dedede), color-stop(99%,#c8c8c8)); /* Chrome,Safari4+ */\n background: -webkit-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* Chrome10+,Safari5.1+ */\n background: -o-linear-gradient(top, #dedede 0%, #c8c8c8 99%); /* Opera 11.10+ */\n background: -ms-linear-gradient(top, #dedede 0%,#c8c8c8 99%); /* IE10+ */\n background: linear-gradient(to bottom, #dedede 0%,#c8c8c8 99%); /* W3C */\n filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#dedede', endColorstr='#c8c8c8',GradientType=0 ); /* IE6-9 */\n\n border: 1px solid #999999;\n box-shadow: #aaaaaa 0px 0px 3px 0px;\n border-radius: 3px;\n}\ninput.vis-configuration.vis-config-range::-moz-range-thumb {\n border: none;\n height: 16px;\n width: 16px;\n\n border-radius: 50%;\n background: #385380;\n}\n\n/*hide the outline behind the border*/\ninput.vis-configuration.vis-config-range:-moz-focusring{\n outline: 1px solid white;\n outline-offset: -1px;\n}\n\ninput.vis-configuration.vis-config-range::-ms-track {\n width: 300px;\n height: 5px;\n\n /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */\n background: transparent;\n\n /*leave room for the larger thumb to overflow with a transparent border */\n border-color: transparent;\n border-width: 6px 0;\n\n /*remove default tick marks*/\n color: transparent;\n}\ninput.vis-configuration.vis-config-range::-ms-fill-lower {\n background: #777;\n border-radius: 10px;\n}\ninput.vis-configuration.vis-config-range::-ms-fill-upper {\n background: #ddd;\n border-radius: 10px;\n}\ninput.vis-configuration.vis-config-range::-ms-thumb {\n border: none;\n height: 16px;\n width: 16px;\n border-radius: 50%;\n background: #385380;\n}\ninput.vis-configuration.vis-config-range:focus::-ms-fill-lower {\n background: #888;\n}\ninput.vis-configuration.vis-config-range:focus::-ms-fill-upper {\n background: #ccc;\n}\n\n.vis-configuration-popup {\n position: absolute;\n background: rgba(57, 76, 89, 0.85);\n border: 2px solid #f2faff;\n line-height:30px;\n height:30px;\n width:150px;\n text-align:center;\n color: #ffffff;\n font-size:14px;\n border-radius:4px;\n -webkit-transition: opacity 0.3s ease-in-out;\n -moz-transition: opacity 0.3s ease-in-out;\n transition: opacity 0.3s ease-in-out;\n}\n.vis-configuration-popup:after, .vis-configuration-popup:before {\n left: 100%;\n top: 50%;\n border: solid transparent;\n content: \" \";\n height: 0;\n width: 0;\n position: absolute;\n pointer-events: none;\n}\n\n.vis-configuration-popup:after {\n border-color: rgba(136, 183, 213, 0);\n border-left-color: rgba(57, 76, 89, 0.85);\n border-width: 8px;\n margin-top: -8px;\n}\n.vis-configuration-popup:before {\n border-color: rgba(194, 225, 245, 0);\n border-left-color: #f2faff;\n border-width: 12px;\n margin-top: -12px;\n}\n\n.vis-panel.vis-background.vis-horizontal .vis-grid.vis-horizontal {\n position: absolute;\n width: 100%;\n height: 0;\n border-bottom: 1px solid;\n}\n\n.vis-panel.vis-background.vis-horizontal .vis-grid.vis-minor {\n border-color: #e5e5e5;\n}\n\n.vis-panel.vis-background.vis-horizontal .vis-grid.vis-major {\n border-color: #bfbfbf;\n}\n\n\n.vis-data-axis .vis-y-axis.vis-major {\n width: 100%;\n position: absolute;\n color: #4d4d4d;\n white-space: nowrap;\n}\n\n.vis-data-axis .vis-y-axis.vis-major.vis-measure {\n padding: 0;\n margin: 0;\n border: 0;\n visibility: hidden;\n width: auto;\n}\n\n\n.vis-data-axis .vis-y-axis.vis-minor {\n position: absolute;\n width: 100%;\n color: #bebebe;\n white-space: nowrap;\n}\n\n.vis-data-axis .vis-y-axis.vis-minor.vis-measure {\n padding: 0;\n margin: 0;\n border: 0;\n visibility: hidden;\n width: auto;\n}\n\n.vis-data-axis .vis-y-axis.vis-title {\n position: absolute;\n color: #4d4d4d;\n white-space: nowrap;\n bottom: 20px;\n text-align: center;\n}\n\n.vis-data-axis .vis-y-axis.vis-title.vis-measure {\n padding: 0;\n margin: 0;\n visibility: hidden;\n width: auto;\n}\n\n.vis-data-axis .vis-y-axis.vis-title.vis-left {\n bottom: 0;\n -webkit-transform-origin: left top;\n -moz-transform-origin: left top;\n -ms-transform-origin: left top;\n -o-transform-origin: left top;\n transform-origin: left bottom;\n -webkit-transform: rotate(-90deg);\n -moz-transform: rotate(-90deg);\n -ms-transform: rotate(-90deg);\n -o-transform: rotate(-90deg);\n transform: rotate(-90deg);\n}\n\n.vis-data-axis .vis-y-axis.vis-title.vis-right {\n bottom: 0;\n -webkit-transform-origin: right bottom;\n -moz-transform-origin: right bottom;\n -ms-transform-origin: right bottom;\n -o-transform-origin: right bottom;\n transform-origin: right bottom;\n -webkit-transform: rotate(90deg);\n -moz-transform: rotate(90deg);\n -ms-transform: rotate(90deg);\n -o-transform: rotate(90deg);\n transform: rotate(90deg);\n}\n\n.vis-legend {\n background-color: rgba(247, 252, 255, 0.65);\n padding: 5px;\n border: 1px solid #b3b3b3;\n box-shadow: 2px 2px 10px rgba(154, 154, 154, 0.55);\n}\n\n.vis-legend-text {\n /*font-size: 10px;*/\n white-space: nowrap;\n display: inline-block\n}"; n(css$1,{}); function parseTag$2(tag, tagList) { tag = tag.trim(); // Skip empty tags if (tag.length === 0) { return; } // Parse all subtags out of the given tag. // I.e., #hello/i/am would yield [#hello/i/am, #hello/i, #hello]. */ tagList.push(tag); while (tag.contains("/")) { tag = tag.substring(0, tag.lastIndexOf("/")); tagList.push(tag); } } function FilterMDFiles(file, tagList, metadataCache) { if (!tagList || tagList.length === 0) { return true; } let tags = obsidian.getAllTags(metadataCache.getFileCache(file)).map(e => e.slice(1, e.length)); if (tags && tags.length > 0) { let filetags = []; tags.forEach(tag => parseTag$2(tag, filetags)); return tagList.every(val => { return filetags.indexOf(val) >= 0; }); } return false; } /** * Create date of passed string * @date - string date in the format YYYY-MM-DD-HH */ function createDate(date) { var _a, _b, _c, _d; let dateComp = date.split(','); // cannot simply replace '-' as need to support negative years return new Date(+((_a = dateComp[0]) !== null && _a !== void 0 ? _a : 0), +((_b = dateComp[1]) !== null && _b !== void 0 ? _b : 0), +((_c = dateComp[2]) !== null && _c !== void 0 ? _c : 0), +((_d = dateComp[3]) !== null && _d !== void 0 ? _d : 0)); } /** * Return URL for specified image path * @param path - image path */ function getImgUrl(vaultAdaptor, path) { if (!path) { return null; } let regex = new RegExp('^https:\/\/'); if (path.match(regex)) { return path; } return vaultAdaptor.getResourcePath(path); } class TimelineProcessor { insertTimelineIntoCurrentNote(sourceView, settings, vaultFiles, fileCache, appVault) { return __awaiter(this, void 0, void 0, function* () { let editor = sourceView.sourceMode.cmEditor; if (editor) { const source = editor.getValue(); let match = RENDER_TIMELINE.exec(source); if (match) { let tagList = match[1]; let div = document.createElement('div'); let rendered = document.createElement('div'); rendered.addClass('timeline-rendered'); rendered.setText(new Date().toString()); div.appendChild(document.createComment(`TIMELINE BEGIN tags='${match[1]}'`)); yield this.run(tagList, div, settings, vaultFiles, fileCache, appVault, false); div.appendChild(rendered); div.appendChild(document.createComment('TIMELINE END')); editor.setValue(source.replace(match[0], div.innerHTML)); } } }); } ; run(source, el, settings, vaultFiles, fileCache, appVault, visTimeline) { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { let args = { tags: '', divHeight: 400, startDate: '-1000', endDate: '3000', minDate: '-3000', maxDate: '3000' }; // read arguments if (visTimeline) { source.split('\n').map(e => { var _a; e = e.trim(); if (e) { let param = e.split('='); if (param[1]) { args[param[0]] = (_a = param[1]) === null || _a === void 0 ? void 0 : _a.trim(); } } }); } else { let lines = source.trim(); // Parse the tags to search for the proper files args.tags = lines; } let tagList = []; args.tags.split(";").forEach(tag => parseTag$2(tag, tagList)); tagList.push(settings.timelineTag); // Filter all markdown files to only those containing the tag list let fileList = vaultFiles.filter(file => FilterMDFiles(file, tagList, fileCache)); if (!fileList) { // if no files valid for timeline return; } // Keep only the files that have the time info let timeline = document.createElement('div'); timeline.setAttribute('class', 'timeline'); let timelineNotes = []; let timelineDates = []; for (let file of fileList) { // Create a DOM Parser const domparser = new DOMParser(); const doc = domparser.parseFromString(yield appVault.read(file), 'text/html'); let timelineData = doc.getElementsByClassName('ob-timelines'); for (let event of timelineData) { if (!(event instanceof HTMLElement)) { continue; } let noteId; // check if a valid date is specified if (event.dataset.date[0] == '-') { // if it is a negative year noteId = +event.dataset.date.substring(1, event.dataset.date.length).split('-').join('') * -1; } else { noteId = +event.dataset.date.split('-').join(''); } if (!Number.isInteger(noteId)) { continue; } // if not title is specified use note name let noteTitle = (_a = event.dataset.title) !== null && _a !== void 0 ? _a : file.name; let noteClass = (_b = event.dataset.class) !== null && _b !== void 0 ? _b : ""; let notePath = '/' + file.path; let type = (_c = event.dataset.type) !== null && _c !== void 0 ? _c : ""; let endDate = (_d = event.dataset.end) !== null && _d !== void 0 ? _d : null; if (!timelineNotes[noteId]) { timelineNotes[noteId] = []; timelineNotes[noteId][0] = { date: event.dataset.date, title: noteTitle, img: getImgUrl(appVault.adapter, event.dataset.img), innerHTML: event.innerHTML, path: notePath, class: noteClass, type: type, endDate: endDate }; timelineDates.push(noteId); } else { // if note_id already present append to it timelineNotes[noteId][timelineNotes[noteId].length] = { date: event.dataset.date, title: noteTitle, img: getImgUrl(appVault.adapter, event.dataset.img), innerHTML: event.innerHTML, path: notePath, class: noteClass, type: type, endDate: endDate }; } } } // Sort events based on setting if (settings.sortDirection) { // default is ascending timelineDates = timelineDates.sort((d1, d2) => d1 - d2); } else { // else it is descending timelineDates = timelineDates.sort((d1, d2) => d2 - d1); } if (!visTimeline) { let eventCount = 0; // Build the timeline html element for (let date of timelineDates) { let noteContainer = timeline.createDiv({ cls: 'timeline-container' }); let noteHeader = noteContainer.createEl('h2', { text: timelineNotes[date][0].date.replace(/-0*$/g, '').replace(/-0*$/g, '').replace(/-0*$/g, '') }); let eventContainer = noteContainer.createDiv({ cls: 'timeline-event-list', attr: { 'style': 'display: block' } }); noteHeader.addEventListener('click', event => { if (eventContainer.style.getPropertyValue('display') === 'none') { eventContainer.style.setProperty('display', 'block'); return; } eventContainer.style.setProperty('display', 'none'); }); if (eventCount % 2 == 0) { // if its even add it to the left noteContainer.addClass('timeline-left'); } else { // else add it to the right noteContainer.addClass('timeline-right'); noteHeader.setAttribute('style', 'text-align: right;'); } if (!timelineNotes[date]) { continue; } for (let eventAtDate of timelineNotes[date]) { let noteCard = eventContainer.createDiv({ cls: 'timeline-card' }); // add an image only if available if (eventAtDate.img) { noteCard.createDiv({ cls: 'thumb', attr: { style: `background-image: url(${eventAtDate.img});` } }); } if (eventAtDate.class) { noteCard.addClass(eventAtDate.class); } noteCard.createEl('article').createEl('h3').createEl('a', { cls: 'internal-link', attr: { href: `${eventAtDate.path}` }, text: eventAtDate.title }); noteCard.createEl('p', { text: eventAtDate.innerHTML }); } eventCount++; } // Replace the selected tags with the timeline html el.appendChild(timeline); return; } // Create a DataSet let items = new visData_min.DataSet([]); timelineDates.forEach(date => { // add all events at this date Object.values(timelineNotes[date]).forEach(event => { var _a, _b, _c, _d; // Create Event Card let noteCard = document.createElement('div'); noteCard.className = 'timeline-card'; // add an image only if available if (event.img) { noteCard.createDiv({ cls: 'thumb', attr: { style: `background-image: url(${event.img});` } }); } if (event.class) { noteCard.addClass(event.class); } noteCard.createEl('article').createEl('h3').createEl('a', { cls: 'internal-link', attr: { href: `${event.path}` }, text: event.title }); noteCard.createEl('p', { text: event.innerHTML }); let startDate = (_a = event.date) === null || _a === void 0 ? void 0 : _a.replace(/(.*)-\d*$/g, '$1'); let start, end; if (startDate[0] == '-') { // handle negative year let startComp = startDate.substring(1, startDate.length).split('-'); start = new Date(+`-${startComp[0]}`, +startComp[1], +startComp[2]); } else { start = new Date(startDate); } let endDate = (_b = event.endDate) === null || _b === void 0 ? void 0 : _b.replace(/(.*)-\d*$/g, '$1'); if (endDate && endDate[0] == '-') { // handle negative year let endComp = endDate.substring(1, endDate.length).split('-'); end = new Date(+`-${endComp[0]}`, +endComp[1], +endComp[2]); } else { end = new Date(endDate); } if (start.toString() === 'Invalid Date') { return; } if ((event.type === "range" || event.type === "background") && end.toString() === 'Invalid Date') { return; } // Add Event data items.add({ id: items.length + 1, content: (_c = event.title) !== null && _c !== void 0 ? _c : '', title: noteCard.outerHTML, start: start, className: (_d = event.class) !== null && _d !== void 0 ? _d : '', type: event.type, end: end !== null && end !== void 0 ? end : null }); }); }); // Configuration for the Timeline let options = { minHeight: +args.divHeight, showCurrentTime: false, showTooltips: false, template: function (item) { let eventContainer = document.createElement('div'); eventContainer.setText(item.content); let eventCard = eventContainer.createDiv(); eventCard.outerHTML = item.title; eventContainer.addEventListener('click', event => { let el = eventContainer.getElementsByClassName('timeline-card')[0]; el.style.setProperty('display', 'block'); el.style.setProperty('top', `-${el.clientHeight + 10}px`); }); return eventContainer; }, start: createDate(args.startDate), end: createDate(args.endDate), min: createDate(args.minDate), max: createDate(args.maxDate) }; // Create a Timeline timeline.setAttribute('class', 'timeline-vis'); new Timeline(timeline, items, options); // Replace the selected tags with the timeline html el.appendChild(timeline); }); } } class TimelinesPlugin extends obsidian.Plugin { onload() { return __awaiter(this, void 0, void 0, function* () { // Load message yield this.loadSettings(); console.log('Loaded Timelines Plugin'); // Register timeline block renderer this.registerMarkdownCodeBlockProcessor('timeline', (source, el, ctx) => __awaiter(this, void 0, void 0, function* () { const proc = new TimelineProcessor(); yield proc.run(source, el, this.settings, this.app.vault.getMarkdownFiles(), this.app.metadataCache, this.app.vault, false); })); // Register vis-timeline block renderer this.registerMarkdownCodeBlockProcessor('timeline-vis', (source, el, ctx) => __awaiter(this, void 0, void 0, function* () { const proc = new TimelineProcessor(); yield proc.run(source, el, this.settings, this.app.vault.getMarkdownFiles(), this.app.metadataCache, this.app.vault, true); })); this.addCommand({ id: "render-timeline", name: "Render Timeline", callback: () => __awaiter(this, void 0, void 0, function* () { const proc = new TimelineProcessor(); let view = this.app.workspace.getActiveViewOfType(obsidian.MarkdownView); if (view) { yield proc.insertTimelineIntoCurrentNote(view, this.settings, this.app.vault.getMarkdownFiles(), this.app.metadataCache, this.app.vault); } }) }); this.addSettingTab(new TimelinesSettingTab(this.app, this)); }); } onunload() { console.log('unloading plugin'); } loadSettings() { return __awaiter(this, void 0, void 0, function* () { this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); }); } saveSettings() { return __awaiter(this, void 0, void 0, function* () { yield this.saveData(this.settings); }); } } module.exports = TimelinesPlugin; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jb25zdGFudHMudHMiLCJzcmMvc2V0dGluZ3MudHMiLCJub2RlX21vZHVsZXMvbW9tZW50L21vbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb21wb25lbnQtZW1pdHRlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9AZWdqcy9oYW1tZXJqcy9kaXN0L2hhbW1lci5lc20uanMiLCJub2RlX21vZHVsZXMvdmlzLXV0aWwvZXNuZXh0L2VzbS92aXMtdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3Qvcm5nLmpzIiwibm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9ieXRlc1RvVXVpZC5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvdjEuanMiLCJub2RlX21vZHVsZXMvdXVpZC9kaXN0L3YzNS5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvbWQ1LmpzIiwibm9kZV9tb2R1bGVzL3V1aWQvZGlzdC92My5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvdjQuanMiLCJub2RlX21vZHVsZXMvdXVpZC9kaXN0L3NoYTEuanMiLCJub2RlX21vZHVsZXMvdXVpZC9kaXN0L3Y1LmpzIiwibm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy92aXMtZGF0YS9lc25leHQvZXNtL3Zpcy1kYXRhLmpzIiwibm9kZV9tb2R1bGVzL2Nzc2ZpbHRlci9saWIvZGVmYXVsdC5qcyIsIm5vZGVfbW9kdWxlcy9jc3NmaWx0ZXIvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY3NzZmlsdGVyL2xpYi9wYXJzZXIuanMiLCJub2RlX21vZHVsZXMvY3NzZmlsdGVyL2xpYi9jc3MuanMiLCJub2RlX21vZHVsZXMvY3NzZmlsdGVyL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy94c3MvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMveHNzL2xpYi9kZWZhdWx0LmpzIiwibm9kZV9tb2R1bGVzL3hzcy9saWIvcGFyc2VyLmpzIiwibm9kZV9tb2R1bGVzL3hzcy9saWIveHNzLmpzIiwibm9kZV9tb2R1bGVzL3hzcy9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcGFnYXRpbmctaGFtbWVyanMvcHJvcGFnYXRpbmcuanMiLCJub2RlX21vZHVsZXMva2V5Y2hhcm0vc3JjL2tleWNoYXJtLmpzIiwibm9kZV9tb2R1bGVzL3Zpcy10aW1lbGluZS9lc25leHQvZXNtL3Zpcy10aW1lbGluZS1ncmFwaDJkLmpzIiwibm9kZV9tb2R1bGVzL3Zpcy1kYXRhL3BlZXIvdW1kL3Zpcy1kYXRhLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy9yb2xsdXAtcGx1Z2luLXN0eWxlcy9kaXN0L3J1bnRpbWUvaW5qZWN0LWNzcy5qcyIsInNyYy91dGlscy50cyIsInNyYy9ibG9jay50cyIsInNyYy9tYWluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKSB7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xyXG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XHJcbiAgICB9KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcclxuICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tKSB7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBmcm9tLmxlbmd0aCwgaiA9IHRvLmxlbmd0aDsgaSA8IGlsOyBpKyssIGorKylcclxuICAgICAgICB0b1tqXSA9IGZyb21baV07XHJcbiAgICByZXR1cm4gdG87XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBnZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImF0dGVtcHRlZCB0byBzZXQgcHJpdmF0ZSBmaWVsZCBvbiBub24taW5zdGFuY2VcIik7XHJcbiAgICB9XHJcbiAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG59XHJcbiIsImltcG9ydCB0eXBlIHsgVGltZWxpbmVzU2V0dGluZ3MgfSBmcm9tICcuL3R5cGVzJ1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9TRVRUSU5HUzogVGltZWxpbmVzU2V0dGluZ3MgPSB7XG4gICAgdGltZWxpbmVUYWc6ICd0aW1lbGluZScsXG4gICAgc29ydERpcmVjdGlvbjogdHJ1ZVxufVxuXG5leHBvcnQgY29uc3QgUkVOREVSX1RJTUVMSU5FOiBSZWdFeHAgPSAvPCEtLVRJTUVMSU5FIEJFR0lOIHRhZ3M9WydcIl0oW15cIl0qPylbJ1wiXS0tPiguKikrPzwhLS1USU1FTElORSBFTkQtLT4vaW07XG4iLCJpbXBvcnQgeyBBcHAsIFBsdWdpblNldHRpbmdUYWIsIFNldHRpbmcgfSBmcm9tICdvYnNpZGlhbidcbmltcG9ydCBUaW1lbGluZXNQbHVnaW4gZnJvbSAnLi9tYWluJ1xuXG5leHBvcnQgY2xhc3MgVGltZWxpbmVzU2V0dGluZ1RhYiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuXHRwbHVnaW46IFRpbWVsaW5lc1BsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBUaW1lbGluZXNQbHVnaW4pIHtcblx0XHRzdXBlcihhcHAsIHBsdWdpbik7XG5cdFx0dGhpcy5wbHVnaW4gPSBwbHVnaW47XG5cdH1cblxuXHRkaXNwbGF5KCk6IHZvaWQge1xuXHRcdGxldCB7IGNvbnRhaW5lckVsIH0gPSB0aGlzO1xuXG5cdFx0Y29udGFpbmVyRWwuZW1wdHkoKTtcblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdPYnNpZGlhbiBUaW1lbGluZXMgU2V0dGluZ3MnIH0pO1xuXG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZSgnRGVmYXVsdCB0aW1lbGluZSB0YWcnKVxuXHRcdFx0LnNldERlc2MoXCJUYWcgdG8gc3BlY2lmeSB3aGljaCBub3RlcyB0byBpbmNsdWRlIGluIGNyZWF0ZWQgdGltZWxpbmVzIGUuZy4gdGltZWxpbmUgZm9yICN0aW1lbGluZSB0YWdcIilcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIodGhpcy5wbHVnaW4uc2V0dGluZ3MudGltZWxpbmVUYWcpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy50aW1lbGluZVRhZyA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KSk7XG5cblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0Nocm9ub2xvZ2ljYWwgRGlyZWN0aW9uJylcblx0XHRcdC5zZXREZXNjKCdEZWZhdWx0OiBPTEQgLT4gTkVXLiBUdXJuIHRoaXMgc2V0dGluZyBvZmY6IE5FVyAtPiBPTEQnKVxuXHRcdFx0LmFkZFRvZ2dsZSgodG9nZ2xlKSA9PiB7XG5cdFx0XHRcdHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5zb3J0RGlyZWN0aW9uKTtcblx0XHRcdFx0dG9nZ2xlLm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnNvcnREaXJlY3Rpb24gPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KVxuXHR9XG59XG4iLCIvLyEgbW9tZW50LmpzXG4vLyEgdmVyc2lvbiA6IDIuMjkuMVxuLy8hIGF1dGhvcnMgOiBUaW0gV29vZCwgSXNrcmVuIENoZXJuZXYsIE1vbWVudC5qcyBjb250cmlidXRvcnNcbi8vISBsaWNlbnNlIDogTUlUXG4vLyEgbW9tZW50anMuY29tXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzKCkge1xuICAgICAgICByZXR1cm4gaG9va0NhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpcyBkb25lIHRvIHJlZ2lzdGVyIHRoZSBtZXRob2QgY2FsbGVkIHdpdGggbW9tZW50KClcbiAgICAvLyB3aXRob3V0IGNyZWF0aW5nIGNpcmN1bGFyIGRlcGVuZGVuY2llcy5cbiAgICBmdW5jdGlvbiBzZXRIb29rQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICAgICAgaG9va0NhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBcnJheShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiBBcnJheSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgQXJyYXldJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0KGlucHV0KSB7XG4gICAgICAgIC8vIElFOCB3aWxsIHRyZWF0IHVuZGVmaW5lZCBhbmQgbnVsbCBhcyBvYmplY3QgaWYgaXQgd2Fzbid0IGZvclxuICAgICAgICAvLyBpbnB1dCAhPSBudWxsXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpbnB1dCAhPSBudWxsICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBPYmplY3RdJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhc093blByb3AoYSwgYikge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsIGIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzT2JqZWN0RW1wdHkob2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcykge1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGs7XG4gICAgICAgICAgICBmb3IgKGsgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhc093blByb3Aob2JqLCBrKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT09IHZvaWQgMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc051bWJlcihpbnB1dCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RhdGUoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGlucHV0IGluc3RhbmNlb2YgRGF0ZSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFwKGFyciwgZm4pIHtcbiAgICAgICAgdmFyIHJlcyA9IFtdLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIHRydWUpLnV0YygpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmF1bHRQYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZGVlcCBjbG9uZSB0aGlzIG9iamVjdC5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVtcHR5OiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VuczogW10sXG4gICAgICAgICAgICB1bnVzZWRJbnB1dDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdzogLTIsXG4gICAgICAgICAgICBjaGFyc0xlZnRPdmVyOiAwLFxuICAgICAgICAgICAgbnVsbElucHV0OiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRFcmE6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkTW9udGg6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0OiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBpc286IGZhbHNlLFxuICAgICAgICAgICAgcGFyc2VkRGF0ZVBhcnRzOiBbXSxcbiAgICAgICAgICAgIGVyYTogbnVsbCxcbiAgICAgICAgICAgIG1lcmlkaWVtOiBudWxsLFxuICAgICAgICAgICAgcmZjMjgyMjogZmFsc2UsXG4gICAgICAgICAgICB3ZWVrZGF5TWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFBhcnNpbmdGbGFncyhtKSB7XG4gICAgICAgIGlmIChtLl9wZiA9PSBudWxsKSB7XG4gICAgICAgICAgICBtLl9wZiA9IGRlZmF1bHRQYXJzaW5nRmxhZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5fcGY7XG4gICAgfVxuXG4gICAgdmFyIHNvbWU7XG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5zb21lKSB7XG4gICAgICAgIHNvbWUgPSBBcnJheS5wcm90b3R5cGUuc29tZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzb21lID0gZnVuY3Rpb24gKGZ1bikge1xuICAgICAgICAgICAgdmFyIHQgPSBPYmplY3QodGhpcyksXG4gICAgICAgICAgICAgICAgbGVuID0gdC5sZW5ndGggPj4+IDAsXG4gICAgICAgICAgICAgICAgaTtcblxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gdCAmJiBmdW4uY2FsbCh0aGlzLCB0W2ldLCBpLCB0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkKG0pIHtcbiAgICAgICAgaWYgKG0uX2lzVmFsaWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gZ2V0UGFyc2luZ0ZsYWdzKG0pLFxuICAgICAgICAgICAgICAgIHBhcnNlZFBhcnRzID0gc29tZS5jYWxsKGZsYWdzLnBhcnNlZERhdGVQYXJ0cywgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgIWlzTmFOKG0uX2QuZ2V0VGltZSgpKSAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5vdmVyZmxvdyA8IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkRXJhICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkTW9udGggJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRXZWVrZGF5ICYmXG4gICAgICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAgICAgIWZsYWdzLm51bGxJbnB1dCAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MuaW52YWxpZEZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICghZmxhZ3MubWVyaWRpZW0gfHwgKGZsYWdzLm1lcmlkaWVtICYmIHBhcnNlZFBhcnRzKSk7XG5cbiAgICAgICAgICAgIGlmIChtLl9zdHJpY3QpIHtcbiAgICAgICAgICAgICAgICBpc05vd1ZhbGlkID1cbiAgICAgICAgICAgICAgICAgICAgaXNOb3dWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5jaGFyc0xlZnRPdmVyID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLnVudXNlZFRva2Vucy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MuYmlnSG91ciA9PT0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuID09IG51bGwgfHwgIU9iamVjdC5pc0Zyb3plbihtKSkge1xuICAgICAgICAgICAgICAgIG0uX2lzVmFsaWQgPSBpc05vd1ZhbGlkO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkKGZsYWdzKSB7XG4gICAgICAgIHZhciBtID0gY3JlYXRlVVRDKE5hTik7XG4gICAgICAgIGlmIChmbGFncyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHRlbmQoZ2V0UGFyc2luZ0ZsYWdzKG0pLCBmbGFncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MobSkudXNlckludmFsaWRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtO1xuICAgIH1cblxuICAgIC8vIFBsdWdpbnMgdGhhdCBhZGQgcHJvcGVydGllcyBzaG91bGQgYWxzbyBhZGQgdGhlIGtleSBoZXJlIChudWxsIHZhbHVlKSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJvcGVybHkgY2xvbmUgb3Vyc2VsdmVzLlxuICAgIHZhciBtb21lbnRQcm9wZXJ0aWVzID0gKGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXSksXG4gICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgLy8gTW9tZW50IHByb3RvdHlwZSBvYmplY3RcbiAgICBmdW5jdGlvbiBNb21lbnQoY29uZmlnKSB7XG4gICAgICAgIGNvcHlDb25maWcodGhpcywgY29uZmlnKTtcbiAgICAgICAgdGhpcy5fZCA9IG5ldyBEYXRlKGNvbmZpZy5fZCAhPSBudWxsID8gY29uZmlnLl9kLmdldFRpbWUoKSA6IE5hTik7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFByZXZlbnQgaW5maW5pdGUgbG9vcCBpbiBjYXNlIHVwZGF0ZU9mZnNldCBjcmVhdGVzIG5ldyBtb21lbnRcbiAgICAgICAgLy8gb2JqZWN0cy5cbiAgICAgICAgaWYgKHVwZGF0ZUluUHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9tZW50KG9iaikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgb2JqIGluc3RhbmNlb2YgTW9tZW50IHx8IChvYmogIT0gbnVsbCAmJiBvYmouX2lzQU1vbWVudE9iamVjdCAhPSBudWxsKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9PT0gZmFsc2UgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgY29uc29sZS53YXJuXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXSxcbiAgICAgICAgICAgICAgICAgICAgYXJnLFxuICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICBrZXk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcmcgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbaV0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0gJ1xcblsnICsgaSArICddICc7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChhcmd1bWVudHNbMF0sIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnICs9IGtleSArICc6ICcgKyBhcmd1bWVudHNbMF1ba2V5XSArICcsICc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNsaWNlKDAsIC0yKTsgLy8gUmVtb3ZlIHRyYWlsaW5nIGNvbW1hIGFuZCBzcGFjZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgICAgICBtc2cgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcbkFyZ3VtZW50czogJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzKS5qb2luKCcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXJyb3IoKS5zdGFja1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZmlyc3RUaW1lID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSwgZm4pO1xuICAgIH1cblxuICAgIHZhciBkZXByZWNhdGlvbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCBtc2cpIHtcbiAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIobmFtZSwgbXNnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRlcHJlY2F0aW9uc1tuYW1lXSkge1xuICAgICAgICAgICAgd2Fybihtc2cpO1xuICAgICAgICAgICAgZGVwcmVjYXRpb25zW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhvb2tzLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyA9IGZhbHNlO1xuICAgIGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAodHlwZW9mIEZ1bmN0aW9uICE9PSAndW5kZWZpbmVkJyAmJiBpbnB1dCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB8fFxuICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldChjb25maWcpIHtcbiAgICAgICAgdmFyIHByb3AsIGk7XG4gICAgICAgIGZvciAoaSBpbiBjb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNvbmZpZywgaSkpIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgaV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIC8vIExlbmllbnQgb3JkaW5hbCBwYXJzaW5nIGFjY2VwdHMganVzdCBhIG51bWJlciBpbiBhZGRpdGlvbiB0b1xuICAgICAgICAvLyBudW1iZXIgKyAocG9zc2libHkpIHN0dWZmIGNvbWluZyBmcm9tIF9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLlxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgXCJvcmRpbmFsUGFyc2VcIiBmYWxsYmFjayBpbiBuZXh0IG1ham9yIHJlbGVhc2UuXG4gICAgICAgIHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICh0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlLnNvdXJjZSB8fCB0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKSArXG4gICAgICAgICAgICAgICAgJ3wnICtcbiAgICAgICAgICAgICAgICAvXFxkezEsMn0vLnNvdXJjZVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksXG4gICAgICAgICAgICBwcm9wO1xuICAgICAgICBmb3IgKHByb3AgaW4gY2hpbGRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGNoaWxkQ29uZmlnLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJlbnRDb25maWdbcHJvcF0pICYmIGlzT2JqZWN0KGNoaWxkQ29uZmlnW3Byb3BdKSkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgcGFyZW50Q29uZmlnW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kKHJlc1twcm9wXSwgY2hpbGRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRDb25maWdbcHJvcF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXNbcHJvcF0gPSBjaGlsZENvbmZpZ1twcm9wXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVzW3Byb3BdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKHByb3AgaW4gcGFyZW50Q29uZmlnKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgaGFzT3duUHJvcChwYXJlbnRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgaXNPYmplY3QocGFyZW50Q29uZmlnW3Byb3BdKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGNoYW5nZXMgdG8gcHJvcGVydGllcyBkb24ndCBtb2RpZnkgcGFyZW50IGNvbmZpZ1xuICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGV4dGVuZCh7fSwgcmVzW3Byb3BdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIExvY2FsZShjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnNldChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGtleXM7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMpIHtcbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGtleXMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgICAgICByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheTogJ1tUb2RheSBhdF0gTFQnLFxuICAgICAgICBuZXh0RGF5OiAnW1RvbW9ycm93IGF0XSBMVCcsXG4gICAgICAgIG5leHRXZWVrOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheTogJ1tZZXN0ZXJkYXkgYXRdIExUJyxcbiAgICAgICAgbGFzdFdlZWs6ICdbTGFzdF0gZGRkZCBbYXRdIExUJyxcbiAgICAgICAgc2FtZUVsc2U6ICdMJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gY2FsZW5kYXIoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB6ZXJvRmlsbChudW1iZXIsIHRhcmdldExlbmd0aCwgZm9yY2VTaWduKSB7XG4gICAgICAgIHZhciBhYnNOdW1iZXIgPSAnJyArIE1hdGguYWJzKG51bWJlciksXG4gICAgICAgICAgICB6ZXJvc1RvRmlsbCA9IHRhcmdldExlbmd0aCAtIGFic051bWJlci5sZW5ndGgsXG4gICAgICAgICAgICBzaWduID0gbnVtYmVyID49IDA7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoc2lnbiA/IChmb3JjZVNpZ24gPyAnKycgOiAnJykgOiAnLScpICtcbiAgICAgICAgICAgIE1hdGgucG93KDEwLCBNYXRoLm1heCgwLCB6ZXJvc1RvRmlsbCkpLnRvU3RyaW5nKCkuc3Vic3RyKDEpICtcbiAgICAgICAgICAgIGFic051bWJlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KFtIaF1tbShzcyk/fE1vfE1NP00/TT98RG98REREb3xERD9EP0Q/fGRkZD9kP3xkbz98d1tvfHddP3xXW298V10/fFFvP3xOezEsNX18WVlZWVlZfFlZWVlZfFlZWVl8WVl8eXsyLDR9fHlvP3xnZyhnZ2c/KT98R0coR0dHPyk/fGV8RXxhfEF8aGg/fEhIP3xraz98bW0/fHNzP3xTezEsOX18eHxYfHp6P3xaWj98LikvZyxcbiAgICAgICAgbG9jYWxGb3JtYXR0aW5nVG9rZW5zID0gLyhcXFtbXlxcW10qXFxdKXwoXFxcXCk/KExUU3xMVHxMTD9MP0w/fGx7MSw0fSkvZyxcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zID0ge30sXG4gICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zID0ge307XG5cbiAgICAvLyB0b2tlbjogICAgJ00nXG4gICAgLy8gcGFkZGVkOiAgIFsnTU0nLCAyXVxuICAgIC8vIG9yZGluYWw6ICAnTW8nXG4gICAgLy8gY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHsgdGhpcy5tb250aCgpICsgMSB9XG4gICAgZnVuY3Rpb24gYWRkRm9ybWF0VG9rZW4odG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKFxuICAgICAgICAgICAgICAgICAgICBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICAgICAgICAgIHRva2VuXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVGb3JtYXR0aW5nVG9rZW5zKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5tYXRjaCgvXFxbW1xcc1xcU10vKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL15cXFt8XFxdJC9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1xcXFwvZywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VGb3JtYXRGdW5jdGlvbihmb3JtYXQpIHtcbiAgICAgICAgdmFyIGFycmF5ID0gZm9ybWF0Lm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJyxcbiAgICAgICAgICAgICAgICBpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0ICs9IGlzRnVuY3Rpb24oYXJyYXlbaV0pXG4gICAgICAgICAgICAgICAgICAgID8gYXJyYXlbaV0uY2FsbChtb20sIGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgOiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gZm9ybWF0IGRhdGUgdXNpbmcgbmF0aXZlIGRhdGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gZm9ybWF0TW9tZW50KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0uaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbS5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm1hdCA9IGV4cGFuZEZvcm1hdChmb3JtYXQsIG0ubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gPVxuICAgICAgICAgICAgZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2YXIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKFxuICAgICAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2VucyxcbiAgICAgICAgICAgICAgICByZXBsYWNlTG9uZ0RhdGVGb3JtYXRUb2tlbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2NhbEZvcm1hdHRpbmdUb2tlbnMubGFzdEluZGV4ID0gMDtcbiAgICAgICAgICAgIGkgLT0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb25nRGF0ZUZvcm1hdCA9IHtcbiAgICAgICAgTFRTOiAnaDptbTpzcyBBJyxcbiAgICAgICAgTFQ6ICdoOm1tIEEnLFxuICAgICAgICBMOiAnTU0vREQvWVlZWScsXG4gICAgICAgIExMOiAnTU1NTSBELCBZWVlZJyxcbiAgICAgICAgTExMOiAnTU1NTSBELCBZWVlZIGg6bW0gQScsXG4gICAgICAgIExMTEw6ICdkZGRkLCBNTU1NIEQsIFlZWVkgaDptbSBBJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9uZ0RhdGVGb3JtYXQoa2V5KSB7XG4gICAgICAgIHZhciBmb3JtYXQgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldLFxuICAgICAgICAgICAgZm9ybWF0VXBwZXIgPSB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXkudG9VcHBlckNhc2UoKV07XG5cbiAgICAgICAgaWYgKGZvcm1hdCB8fCAhZm9ybWF0VXBwZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldID0gZm9ybWF0VXBwZXJcbiAgICAgICAgICAgIC5tYXRjaChmb3JtYXR0aW5nVG9rZW5zKVxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAodG9rKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTU1NJyB8fFxuICAgICAgICAgICAgICAgICAgICB0b2sgPT09ICdNTScgfHxcbiAgICAgICAgICAgICAgICAgICAgdG9rID09PSAnREQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHRvayA9PT0gJ2RkZGQnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2suc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0b2s7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9sb25nRGF0ZUZvcm1hdFtrZXldO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0SW52YWxpZERhdGUgPSAnSW52YWxpZCBkYXRlJztcblxuICAgIGZ1bmN0aW9uIGludmFsaWREYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJyxcbiAgICAgICAgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbChudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29yZGluYWwucmVwbGFjZSgnJWQnLCBudW1iZXIpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0UmVsYXRpdmVUaW1lID0ge1xuICAgICAgICBmdXR1cmU6ICdpbiAlcycsXG4gICAgICAgIHBhc3Q6ICclcyBhZ28nLFxuICAgICAgICBzOiAnYSBmZXcgc2Vjb25kcycsXG4gICAgICAgIHNzOiAnJWQgc2Vjb25kcycsXG4gICAgICAgIG06ICdhIG1pbnV0ZScsXG4gICAgICAgIG1tOiAnJWQgbWludXRlcycsXG4gICAgICAgIGg6ICdhbiBob3VyJyxcbiAgICAgICAgaGg6ICclZCBob3VycycsXG4gICAgICAgIGQ6ICdhIGRheScsXG4gICAgICAgIGRkOiAnJWQgZGF5cycsXG4gICAgICAgIHc6ICdhIHdlZWsnLFxuICAgICAgICB3dzogJyVkIHdlZWtzJyxcbiAgICAgICAgTTogJ2EgbW9udGgnLFxuICAgICAgICBNTTogJyVkIG1vbnRocycsXG4gICAgICAgIHk6ICdhIHllYXInLFxuICAgICAgICB5eTogJyVkIHllYXJzJyxcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2YXIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG91dHB1dClcbiAgICAgICAgICAgID8gb3V0cHV0KG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSlcbiAgICAgICAgICAgIDogb3V0cHV0LnJlcGxhY2UoLyVkL2ksIG51bWJlcik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFzdEZ1dHVyZShkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyh1bml0LCBzaG9ydGhhbmQpIHtcbiAgICAgICAgdmFyIGxvd2VyQ2FzZSA9IHVuaXQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgYWxpYXNlc1tsb3dlckNhc2VdID0gYWxpYXNlc1tsb3dlckNhc2UgKyAncyddID0gYWxpYXNlc1tzaG9ydGhhbmRdID0gdW5pdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVVbml0cyh1bml0cykge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBub3JtYWxpemVPYmplY3RVbml0cyhpbnB1dE9iamVjdCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZElucHV0ID0ge30sXG4gICAgICAgICAgICBub3JtYWxpemVkUHJvcCxcbiAgICAgICAgICAgIHByb3A7XG5cbiAgICAgICAgZm9yIChwcm9wIGluIGlucHV0T2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcChpbnB1dE9iamVjdCwgcHJvcCkpIHtcbiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvcCA9IG5vcm1hbGl6ZVVuaXRzKHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXRbbm9ybWFsaXplZFByb3BdID0gaW5wdXRPYmplY3RbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRJbnB1dDtcbiAgICB9XG5cbiAgICB2YXIgcHJpb3JpdGllcyA9IHt9O1xuXG4gICAgZnVuY3Rpb24gYWRkVW5pdFByaW9yaXR5KHVuaXQsIHByaW9yaXR5KSB7XG4gICAgICAgIHByaW9yaXRpZXNbdW5pdF0gPSBwcmlvcml0eTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzT2JqKSB7XG4gICAgICAgIHZhciB1bml0cyA9IFtdLFxuICAgICAgICAgICAgdTtcbiAgICAgICAgZm9yICh1IGluIHVuaXRzT2JqKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcCh1bml0c09iaiwgdSkpIHtcbiAgICAgICAgICAgICAgICB1bml0cy5wdXNoKHsgdW5pdDogdSwgcHJpb3JpdHk6IHByaW9yaXRpZXNbdV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTGVhcFllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gKHllYXIgJSA0ID09PSAwICYmIHllYXIgJSAxMDAgIT09IDApIHx8IHllYXIgJSA0MDAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzRmxvb3IobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICAvLyAtMCAtPiAwXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcikgfHwgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0ludChhcmd1bWVudEZvckNvZXJjaW9uKSB7XG4gICAgICAgIHZhciBjb2VyY2VkTnVtYmVyID0gK2FyZ3VtZW50Rm9yQ29lcmNpb24sXG4gICAgICAgICAgICB2YWx1ZSA9IDA7XG5cbiAgICAgICAgaWYgKGNvZXJjZWROdW1iZXIgIT09IDAgJiYgaXNGaW5pdGUoY29lcmNlZE51bWJlcikpIHtcbiAgICAgICAgICAgIHZhbHVlID0gYWJzRmxvb3IoY29lcmNlZE51bWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUdldFNldCh1bml0LCBrZWVwVGltZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNldCQxKHRoaXMsIHVuaXQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywga2VlcFRpbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsIHVuaXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKClcbiAgICAgICAgICAgID8gbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKClcbiAgICAgICAgICAgIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCQxKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHVuaXQgPT09ICdGdWxsWWVhcicgJiZcbiAgICAgICAgICAgICAgICBpc0xlYXBZZWFyKG1vbS55ZWFyKCkpICYmXG4gICAgICAgICAgICAgICAgbW9tLm1vbnRoKCkgPT09IDEgJiZcbiAgICAgICAgICAgICAgICBtb20uZGF0ZSgpID09PSAyOVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB0b0ludCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgbW9tLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb20uX2RbJ3NldCcgKyAobW9tLl9pc1VUQyA/ICdVVEMnIDogJycpICsgdW5pdF0odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc3RyaW5nR2V0KHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzW3VuaXRzXSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0cmluZ1NldCh1bml0cywgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB1bml0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplT2JqZWN0VW5pdHModW5pdHMpO1xuICAgICAgICAgICAgdmFyIHByaW9yaXRpemVkID0gZ2V0UHJpb3JpdGl6ZWRVbml0cyh1bml0cyksXG4gICAgICAgICAgICAgICAgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmlvcml0aXplZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXNbcHJpb3JpdGl6ZWRbaV0udW5pdF0odW5pdHNbcHJpb3JpdGl6ZWRbaV0udW5pdF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbih0aGlzW3VuaXRzXSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1t1bml0c10odmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciBtYXRjaDEgPSAvXFxkLywgLy8gICAgICAgMCAtIDlcbiAgICAgICAgbWF0Y2gyID0gL1xcZFxcZC8sIC8vICAgICAgMDAgLSA5OVxuICAgICAgICBtYXRjaDMgPSAvXFxkezN9LywgLy8gICAgIDAwMCAtIDk5OVxuICAgICAgICBtYXRjaDQgPSAvXFxkezR9LywgLy8gICAgMDAwMCAtIDk5OTlcbiAgICAgICAgbWF0Y2g2ID0gL1srLV0/XFxkezZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzIgPSAvXFxkXFxkPy8sIC8vICAgICAgIDAgLSA5OVxuICAgICAgICBtYXRjaDN0bzQgPSAvXFxkXFxkXFxkXFxkPy8sIC8vICAgICA5OTkgLSA5OTk5XG4gICAgICAgIG1hdGNoNXRvNiA9IC9cXGRcXGRcXGRcXGRcXGRcXGQ/LywgLy8gICA5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaDF0bzMgPSAvXFxkezEsM30vLCAvLyAgICAgICAwIC0gOTk5XG4gICAgICAgIG1hdGNoMXRvNCA9IC9cXGR7MSw0fS8sIC8vICAgICAgIDAgLSA5OTk5XG4gICAgICAgIG1hdGNoMXRvNiA9IC9bKy1dP1xcZHsxLDZ9LywgLy8gLTk5OTk5OSAtIDk5OTk5OVxuICAgICAgICBtYXRjaFVuc2lnbmVkID0gL1xcZCsvLCAvLyAgICAgICAwIC0gaW5mXG4gICAgICAgIG1hdGNoU2lnbmVkID0gL1srLV0/XFxkKy8sIC8vICAgIC1pbmYgLSBpbmZcbiAgICAgICAgbWF0Y2hPZmZzZXQgPSAvWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksIC8vICswMDowMCAtMDA6MDAgKzAwMDAgLTAwMDAgb3IgWlxuICAgICAgICBtYXRjaFNob3J0T2Zmc2V0ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksIC8vICswMCAtMDAgKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgICAgIG1hdGNoVGltZXN0YW1wID0gL1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/LywgLy8gMTIzNDU2Nzg5IDEyMzQ1Njc4OS4xMjNcbiAgICAgICAgLy8gYW55IHdvcmQgKG9yIHR3bykgY2hhcmFjdGVycyBvciBudW1iZXJzIGluY2x1ZGluZyB0d28vdGhyZWUgd29yZCBtb250aCBpbiBhcmFiaWMuXG4gICAgICAgIC8vIGluY2x1ZGVzIHNjb3R0aXNoIGdhZWxpYyB0d28gd29yZCBhbmQgaHlwaGVuYXRlZCBtb250aHNcbiAgICAgICAgbWF0Y2hXb3JkID0gL1swLTldezAsMjU2fVsnYS16XFx1MDBBMC1cXHUwNUZGXFx1MDcwMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRjA3XFx1RkYxMC1cXHVGRkVGXXsxLDI1Nn18W1xcdTA2MDAtXFx1MDZGRlxcL117MSwyNTZ9KFxccyo/W1xcdTA2MDAtXFx1MDZGRl17MSwyNTZ9KXsxLDJ9L2ksXG4gICAgICAgIHJlZ2V4ZXM7XG5cbiAgICByZWdleGVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRSZWdleFRva2VuKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KVxuICAgICAgICAgICAgPyByZWdleFxuICAgICAgICAgICAgOiBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZURhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0cmljdCAmJiBzdHJpY3RSZWdleCA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHJlZ2V4ZXMsIHRva2VuKSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAodW5lc2NhcGVGb3JtYXQodG9rZW4pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZWdleGVzW3Rva2VuXShjb25maWcuX3N0cmljdCwgY29uZmlnLl9sb2NhbGUpO1xuICAgIH1cblxuICAgIC8vIENvZGUgZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NjE0OTMvaXMtdGhlcmUtYS1yZWdleHAtZXNjYXBlLWZ1bmN0aW9uLWluLWphdmFzY3JpcHRcbiAgICBmdW5jdGlvbiB1bmVzY2FwZUZvcm1hdChzKSB7XG4gICAgICAgIHJldHVybiByZWdleEVzY2FwZShcbiAgICAgICAgICAgIHNcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFxcXCcsICcnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcKFxcWyl8XFxcXChcXF0pfFxcWyhbXlxcXVxcW10qKVxcXXxcXFxcKC4pL2csIGZ1bmN0aW9uIChcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCxcbiAgICAgICAgICAgICAgICAgICAgcDEsXG4gICAgICAgICAgICAgICAgICAgIHAyLFxuICAgICAgICAgICAgICAgICAgICBwMyxcbiAgICAgICAgICAgICAgICAgICAgcDRcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAxIHx8IHAyIHx8IHAzIHx8IHA0O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVnZXhFc2NhcGUocykge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbiAgICB9XG5cbiAgICB2YXIgdG9rZW5zID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRva2VuID0gW3Rva2VuXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOdW1iZXIoY2FsbGJhY2spKSB7XG4gICAgICAgICAgICBmdW5jID0gZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2NhbGxiYWNrXSA9IHRvSW50KGlucHV0KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2VuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB0b2tlbnNbdG9rZW5baV1dID0gZnVuYztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFdlZWtQYXJzZVRva2VuKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMCxcbiAgICAgICAgTU9OVEggPSAxLFxuICAgICAgICBEQVRFID0gMixcbiAgICAgICAgSE9VUiA9IDMsXG4gICAgICAgIE1JTlVURSA9IDQsXG4gICAgICAgIFNFQ09ORCA9IDUsXG4gICAgICAgIE1JTExJU0VDT05EID0gNixcbiAgICAgICAgV0VFSyA9IDcsXG4gICAgICAgIFdFRUtEQVkgPSA4O1xuXG4gICAgZnVuY3Rpb24gbW9kKG4sIHgpIHtcbiAgICAgICAgcmV0dXJuICgobiAlIHgpICsgeCkgJSB4O1xuICAgIH1cblxuICAgIHZhciBpbmRleE9mO1xuXG4gICAgaWYgKEFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7XG4gICAgICAgIGluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpbmRleE9mID0gZnVuY3Rpb24gKG8pIHtcbiAgICAgICAgICAgIC8vIEkga25vd1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzW2ldID09PSBvKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkYXlzSW5Nb250aCh5ZWFyLCBtb250aCkge1xuICAgICAgICBpZiAoaXNOYU4oeWVhcikgfHwgaXNOYU4obW9udGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtb2RNb250aCA9IG1vZChtb250aCwgMTIpO1xuICAgICAgICB5ZWFyICs9IChtb250aCAtIG1vZE1vbnRoKSAvIDEyO1xuICAgICAgICByZXR1cm4gbW9kTW9udGggPT09IDFcbiAgICAgICAgICAgID8gaXNMZWFwWWVhcih5ZWFyKVxuICAgICAgICAgICAgICAgID8gMjlcbiAgICAgICAgICAgICAgICA6IDI4XG4gICAgICAgICAgICA6IDMxIC0gKChtb2RNb250aCAlIDcpICUgMik7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ00nLCBbJ01NJywgMl0sICdNbycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9udGgoKSArIDE7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU1NJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubW9udGhzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ21vbnRoJywgJ00nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21vbnRoJywgOCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdNJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdNTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1Nob3J0UmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NTU0nLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLm1vbnRoc1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNJywgJ01NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbTU9OVEhdID0gdG9JbnQoaW5wdXQpIC0gMTtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydNTU0nLCAnTU1NTSddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtb250aCA9IGNvbmZpZy5fbG9jYWxlLm1vbnRoc1BhcnNlKGlucHV0LCB0b2tlbiwgY29uZmlnLl9zdHJpY3QpO1xuICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZmluZCBhIG1vbnRoIG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZC5cbiAgICAgICAgaWYgKG1vbnRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGFycmF5W01PTlRIXSA9IG1vbnRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZE1vbnRoID0gaW5wdXQ7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIHZhciBkZWZhdWx0TG9jYWxlTW9udGhzID0gJ0phbnVhcnlfRmVicnVhcnlfTWFyY2hfQXByaWxfTWF5X0p1bmVfSnVseV9BdWd1c3RfU2VwdGVtYmVyX09jdG9iZXJfTm92ZW1iZXJfRGVjZW1iZXInLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCA9ICdKYW5fRmViX01hcl9BcHJfTWF5X0p1bl9KdWxfQXVnX1NlcF9PY3RfTm92X0RlYycuc3BsaXQoXG4gICAgICAgICAgICAnXydcbiAgICAgICAgKSxcbiAgICAgICAgTU9OVEhTX0lOX0ZPUk1BVCA9IC9EW29EXT8oXFxbW15cXFtcXF1dKlxcXXxcXHMpK01NTU0/LyxcbiAgICAgICAgZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXggPSBtYXRjaFdvcmQsXG4gICAgICAgIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRocyhtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHMpXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9tb250aHNcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocylcbiAgICAgICAgICAgID8gdGhpcy5fbW9udGhzW20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzW1xuICAgICAgICAgICAgICAgICAgKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdClcbiAgICAgICAgICAgICAgICAgICAgICA/ICdmb3JtYXQnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnc3RhbmRhbG9uZSdcbiAgICAgICAgICAgICAgXVttLm1vbnRoKCldO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0KG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRoc1Nob3J0KVxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1Nob3J0WydzdGFuZGFsb25lJ107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzQXJyYXkodGhpcy5fbW9udGhzU2hvcnQpXG4gICAgICAgICAgICA/IHRoaXMuX21vbnRoc1Nob3J0W20ubW9udGgoKV1cbiAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRbXG4gICAgICAgICAgICAgICAgICBNT05USFNfSU5fRk9STUFULnRlc3QoZm9ybWF0KSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF1bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVTdHJpY3RQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSBtb250aE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0aGlzLl9tb250aHNQYXJzZSkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdXNlZFxuICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gdGhpcy5tb250aHNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZShtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlU3RyaWN0UGFyc2UuY2FsbCh0aGlzLCBtb250aE5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGFkZCBzb3J0aW5nXG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXJcbiAgICAgICAgLy8gc2VlIHNvcnRpbmcgaW4gY29tcHV0ZU1vbnRoc1BhcnNlXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgaV0pO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy5tb250aHNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdHJpY3QgJiYgIXRoaXMuX21vbnRoc1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLm1vbnRocyhtb20sICcnKSArICd8XicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU1NJyAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdNTU0nICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXS50ZXN0KG1vbnRoTmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX21vbnRoc1BhcnNlW2ldLnRlc3QobW9udGhOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gc2V0TW9udGgobW9tLCB2YWx1ZSkge1xuICAgICAgICB2YXIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgc2V0TW9udGgodGhpcywgdmFsdWUpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0KHRoaXMsICdNb250aCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF5c0luTW9udGgoKSB7XG4gICAgICAgIHJldHVybiBkYXlzSW5Nb250aCh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTaG9ydFJlZ2V4ID0gZGVmYXVsdE1vbnRoc1Nob3J0UmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fbW9udGhzU2hvcnRSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoc1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl9tb250aHNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19tb250aHNSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZU1vbnRoc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IGRlZmF1bHRNb250aHNSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fbW9udGhzU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlKCkge1xuICAgICAgICBmdW5jdGlvbiBjbXBMZW5SZXYoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIHNob3J0UGllY2VzLnB1c2godGhpcy5tb250aHNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRocyhtb20sICcnKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgbW9udGggKG9yIGFiYnIpIGlzIGEgcHJlZml4IG9mIGFub3RoZXIgaXRcbiAgICAgICAgLy8gd2lsbCBtYXRjaCB0aGUgbG9uZ2VyIHBpZWNlLlxuICAgICAgICBzaG9ydFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGxvbmdQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBtaXhlZFBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykge1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShtaXhlZFBpZWNlc1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9tb250aHNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgbG9uZ1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAnXignICsgc2hvcnRQaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyB6ZXJvRmlsbCh5LCA0KSA6ICcrJyArIHk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZJywgNF0sIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsIDVdLCAwLCAneWVhcicpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWVlZJywgNiwgdHJ1ZV0sIDAsICd5ZWFyJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3llYXInLCAneScpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd5ZWFyJywgMSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdZJywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVknLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVlZJywgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ1lZWVlZJywgJ1lZWVlZWSddLCBZRUFSKTtcbiAgICBhZGRQYXJzZVRva2VuKCdZWVlZJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtZRUFSXSA9XG4gICAgICAgICAgICBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgaG9va3MucGFyc2VUd29EaWdpdFllYXIgPSBmdW5jdGlvbiAoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRvSW50KGlucHV0KSArICh0b0ludChpbnB1dCkgPiA2OCA/IDE5MDAgOiAyMDAwKTtcbiAgICB9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFllYXIgPSBtYWtlR2V0U2V0KCdGdWxsWWVhcicsIHRydWUpO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNMZWFwWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZURhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpIHtcbiAgICAgICAgLy8gY2FuJ3QganVzdCBhcHBseSgpIHRvIGNyZWF0ZSBhIGRhdGU6XG4gICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8xODEzNDhcbiAgICAgICAgdmFyIGRhdGU7XG4gICAgICAgIC8vIHRoZSBkYXRlIGNvbnN0cnVjdG9yIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSArIDQwMCwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICAgICAgaWYgKGlzRmluaXRlKGRhdGUuZ2V0RnVsbFllYXIoKSkpIHtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHksIG0sIGQsIGgsIE0sIHMsIG1zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVUQ0RhdGUoeSkge1xuICAgICAgICB2YXIgZGF0ZSwgYXJncztcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGFyZ3NbMF0gPSB5ICsgNDAwO1xuICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDLmFwcGx5KG51bGwsIGFyZ3MpKTtcbiAgICAgICAgICAgIGlmIChpc0Zpbml0ZShkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpKSB7XG4gICAgICAgICAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcih5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmd1bWVudHMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cblxuICAgIC8vIHN0YXJ0LW9mLWZpcnN0LXdlZWsgLSBzdGFydC1vZi15ZWFyXG4gICAgZnVuY3Rpb24gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciAvLyBmaXJzdC13ZWVrIGRheSAtLSB3aGljaCBqYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayAoNCBmb3IgaXNvLCAxIGZvciBvdGhlcilcbiAgICAgICAgICAgIGZ3ZCA9IDcgKyBkb3cgLSBkb3ksXG4gICAgICAgICAgICAvLyBmaXJzdC13ZWVrIGRheSBsb2NhbCB3ZWVrZGF5IC0tIHdoaWNoIGxvY2FsIHdlZWtkYXkgaXMgZndkXG4gICAgICAgICAgICBmd2RsdyA9ICg3ICsgY3JlYXRlVVRDRGF0ZSh5ZWFyLCAwLCBmd2QpLmdldFVUQ0RheSgpIC0gZG93KSAlIDc7XG5cbiAgICAgICAgcmV0dXJuIC1md2RsdyArIGZ3ZCAtIDE7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZSNDYWxjdWxhdGluZ19hX2RhdGVfZ2l2ZW5fdGhlX3llYXIuMkNfd2Vla19udW1iZXJfYW5kX3dlZWtkYXlcbiAgICBmdW5jdGlvbiBkYXlPZlllYXJGcm9tV2Vla3MoeWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIGxvY2FsV2Vla2RheSA9ICg3ICsgd2Vla2RheSAtIGRvdykgJSA3LFxuICAgICAgICAgICAgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSksXG4gICAgICAgICAgICBkYXlPZlllYXIgPSAxICsgNyAqICh3ZWVrIC0gMSkgKyBsb2NhbFdlZWtkYXkgKyB3ZWVrT2Zmc2V0LFxuICAgICAgICAgICAgcmVzWWVhcixcbiAgICAgICAgICAgIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrT2ZZZWFyKG1vbSwgZG93LCBkb3kpIHtcbiAgICAgICAgdmFyIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQobW9tLnllYXIoKSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgd2VlayA9IE1hdGguZmxvb3IoKG1vbS5kYXlPZlllYXIoKSAtIHdlZWtPZmZzZXQgLSAxKSAvIDcpICsgMSxcbiAgICAgICAgICAgIHJlc1dlZWssXG4gICAgICAgICAgICByZXNZZWFyO1xuXG4gICAgICAgIGlmICh3ZWVrIDwgMSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgLSAxO1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgKyB3ZWVrc0luWWVhcihyZXNZZWFyLCBkb3csIGRveSk7XG4gICAgICAgIH0gZWxzZSBpZiAod2VlayA+IHdlZWtzSW5ZZWFyKG1vbS55ZWFyKCksIGRvdywgZG95KSkge1xuICAgICAgICAgICAgcmVzV2VlayA9IHdlZWsgLSB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSk7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNZZWFyID0gbW9tLnllYXIoKTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdlZWs6IHJlc1dlZWssXG4gICAgICAgICAgICB5ZWFyOiByZXNZZWFyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCd3dycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdXJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdXVycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsndycsICd3dycsICdXJywgJ1dXJ10sIGZ1bmN0aW9uIChcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIHdlZWssXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdG9rZW5cbiAgICApIHtcbiAgICAgICAgd2Vla1t0b2tlbi5zdWJzdHIoMCwgMSldID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vlayhtb20pIHtcbiAgICAgICAgcmV0dXJuIHdlZWtPZlllYXIobW9tLCB0aGlzLl93ZWVrLmRvdywgdGhpcy5fd2Vlay5kb3kpLndlZWs7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrID0ge1xuICAgICAgICBkb3c6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3k6IDYsIC8vIFRoZSB3ZWVrIHRoYXQgY29udGFpbnMgSmFuIDZ0aCBpcyB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhci5cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRmlyc3REYXlPZldlZWsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93ZWVrLmRvdztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVGaXJzdERheU9mWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsoaW5wdXQpIHtcbiAgICAgICAgdmFyIHdlZWsgPSB0aGlzLmxvY2FsZURhdGEoKS53ZWVrKHRoaXMpO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2VlayhpbnB1dCkge1xuICAgICAgICB2YXIgd2VlayA9IHdlZWtPZlllYXIodGhpcywgMSwgNCkud2VlaztcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkJywgMCwgJ2RvJywgJ2RheScpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXNNaW4odGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGRkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzKHRoaXMsIGZvcm1hdCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZScsIDAsIDAsICd3ZWVrZGF5Jyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ0UnLCAwLCAwLCAnaXNvV2Vla2RheScpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXknLCAnZCcpO1xuICAgIGFkZFVuaXRBbGlhcygnd2Vla2RheScsICdlJyk7XG4gICAgYWRkVW5pdEFsaWFzKCdpc29XZWVrZGF5JywgJ0UnKTtcblxuICAgIC8vIFBSSU9SSVRZXG4gICAgYWRkVW5pdFByaW9yaXR5KCdkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrZGF5JywgMTEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla2RheScsIDExKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2QnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0UnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2RkJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c01pblJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcbiAgICBhZGRSZWdleFRva2VuKCdkZGQnLCBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUud2Vla2RheXNSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2RkJywgJ2RkZCcsICdkZGRkJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB2YXIgd2Vla2RheSA9IGNvbmZpZy5fbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBnZXQgYSB3ZWVrZGF5IG5hbWUsIG1hcmsgdGhlIGRhdGUgYXMgaW52YWxpZFxuICAgICAgICBpZiAod2Vla2RheSAhPSBudWxsKSB7XG4gICAgICAgICAgICB3ZWVrLmQgPSB3ZWVrZGF5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZFdlZWtkYXkgPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydkJywgJ2UnLCAnRSddLCBmdW5jdGlvbiAoaW5wdXQsIHdlZWssIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgd2Vla1t0b2tlbl0gPSB0b0ludChpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc05hTihpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChpbnB1dCwgMTApO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXQgPSBsb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIGxvY2FsZSkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KSAlIDcgfHwgNztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNOYU4oaW5wdXQpID8gbnVsbCA6IGlucHV0O1xuICAgIH1cblxuICAgIC8vIExPQ0FMRVNcbiAgICBmdW5jdGlvbiBzaGlmdFdlZWtkYXlzKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KFxuICAgICAgICAgICAgJ18nXG4gICAgICAgICksXG4gICAgICAgIGRlZmF1bHRMb2NhbGVXZWVrZGF5c1Nob3J0ID0gJ1N1bl9Nb25fVHVlX1dlZF9UaHVfRnJpX1NhdCcuc3BsaXQoJ18nKSxcbiAgICAgICAgZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluID0gJ1N1X01vX1R1X1dlX1RoX0ZyX1NhJy5zcGxpdCgnXycpLFxuICAgICAgICBkZWZhdWx0V2Vla2RheXNSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZCxcbiAgICAgICAgZGVmYXVsdFdlZWtkYXlzTWluUmVnZXggPSBtYXRjaFdvcmQ7XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5cyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIHdlZWtkYXlzID0gaXNBcnJheSh0aGlzLl93ZWVrZGF5cylcbiAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNcbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNbXG4gICAgICAgICAgICAgICAgICBtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpXG4gICAgICAgICAgICAgICAgICAgICAgPyAnZm9ybWF0J1xuICAgICAgICAgICAgICAgICAgICAgIDogJ3N0YW5kYWxvbmUnXG4gICAgICAgICAgICAgIF07XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHdlZWtkYXlzW20uZGF5KCldXG4gICAgICAgICAgICA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWtkYXlzU2hvcnQobSkge1xuICAgICAgICByZXR1cm4gbSA9PT0gdHJ1ZVxuICAgICAgICAgICAgPyBzaGlmdFdlZWtkYXlzKHRoaXMuX3dlZWtkYXlzU2hvcnQsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRbbS5kYXkoKV1cbiAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbihtKSB7XG4gICAgICAgIHJldHVybiBtID09PSB0cnVlXG4gICAgICAgICAgICA/IHNoaWZ0V2Vla2RheXModGhpcy5fd2Vla2RheXNNaW4sIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiBtXG4gICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldXG4gICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZVN0cmljdFBhcnNlJDEod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgaWksXG4gICAgICAgICAgICBtb20sXG4gICAgICAgICAgICBsbGMgPSB3ZWVrZGF5TmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoIXRoaXMuX3dlZWtkYXlzUGFyc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzTWluKFxuICAgICAgICAgICAgICAgICAgICBtb20sXG4gICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNTaG9ydChcbiAgICAgICAgICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICkudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIG1vbSwgcmVnZXg7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dlZWtkYXlzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlJDEuY2FsbCh0aGlzLCB3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcblxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiAhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAnXicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJyxcbiAgICAgICAgICAgICAgICAgICAgJ2knXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgJ14nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLFxuICAgICAgICAgICAgICAgICAgICAnaSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl93ZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgcmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAnXicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzKG1vbSwgJycpICtcbiAgICAgICAgICAgICAgICAgICAgJ3xeJyArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSArXG4gICAgICAgICAgICAgICAgICAgICd8XicgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHN0cmljdCAmJlxuICAgICAgICAgICAgICAgIGZvcm1hdCA9PT0gJ2RkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBzdHJpY3QgJiZcbiAgICAgICAgICAgICAgICBmb3JtYXQgPT09ICdkZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgc3RyaWN0ICYmXG4gICAgICAgICAgICAgICAgZm9ybWF0ID09PSAnZGQnICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fd2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF5ID0gdGhpcy5faXNVVEMgPyB0aGlzLl9kLmdldFVUQ0RheSgpIDogdGhpcy5fZC5nZXREYXkoKTtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlucHV0ID0gcGFyc2VXZWVrZGF5KGlucHV0LCB0aGlzLmxvY2FsZURhdGEoKSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hZGQoaW5wdXQgLSBkYXksICdkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGJlaGF2ZXMgdGhlIHNhbWUgYXMgbW9tZW50I2RheSBleGNlcHRcbiAgICAgICAgLy8gYXMgYSBnZXR0ZXIsIHJldHVybnMgNyBpbnN0ZWFkIG9mIDAgKDEtNyByYW5nZSBpbnN0ZWFkIG9mIDAtNilcbiAgICAgICAgLy8gYXMgYSBzZXR0ZXIsIHN1bmRheSBzaG91bGQgYmVsb25nIHRvIHRoZSBwcmV2aW91cyB3ZWVrLlxuXG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgd2Vla2RheSA9IHBhcnNlSXNvV2Vla2RheShpbnB1dCwgdGhpcy5sb2NhbGVEYXRhKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF5KHRoaXMuZGF5KCkgJSA3ID8gd2Vla2RheSA6IHdlZWtkYXkgLSA3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSgpIHx8IDc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdFxuICAgICAgICAgICAgICAgID8gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleFxuICAgICAgICAgICAgICAgIDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gd2Vla2RheXNNaW5SZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0KSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlV2Vla2RheXNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl93ZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNNaW5SZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggJiYgaXNTdHJpY3RcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXhcbiAgICAgICAgICAgICAgICA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb21wdXRlV2Vla2RheXNQYXJzZSgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLFxuICAgICAgICAgICAgc2hvcnRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGxvbmdQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgbW9tLFxuICAgICAgICAgICAgbWlucCxcbiAgICAgICAgICAgIHNob3J0cCxcbiAgICAgICAgICAgIGxvbmdwO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICAvLyBtYWtlIHRoZSByZWdleCBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHlcbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIG1pbnAgPSByZWdleEVzY2FwZSh0aGlzLndlZWtkYXlzTWluKG1vbSwgJycpKTtcbiAgICAgICAgICAgIHNob3J0cCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKSk7XG4gICAgICAgICAgICBsb25ncCA9IHJlZ2V4RXNjYXBlKHRoaXMud2Vla2RheXMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWluUGllY2VzLnB1c2gobWlucCk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHNob3J0cCk7XG4gICAgICAgICAgICBsb25nUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gobG9uZ3ApO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvcnRpbmcgbWFrZXMgc3VyZSBpZiBvbmUgd2Vla2RheSAob3IgYWJicikgaXMgYSBwcmVmaXggb2YgYW5vdGhlciBpdFxuICAgICAgICAvLyB3aWxsIG1hdGNoIHRoZSBsb25nZXIgcGllY2UuXG4gICAgICAgIG1pblBpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIHNob3J0UGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbG9uZ1BpZWNlcy5zb3J0KGNtcExlblJldik7XG4gICAgICAgIG1peGVkUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gbmV3IFJlZ0V4cCgnXignICsgbWl4ZWRQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSB0aGlzLl93ZWVrZGF5c1JlZ2V4O1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcblxuICAgICAgICB0aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJyxcbiAgICAgICAgICAgICdpJ1xuICAgICAgICApO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4ID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLFxuICAgICAgICAgICAgJ2knXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgZnVuY3Rpb24gaEZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGtGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgfHwgMjQ7XG4gICAgfVxuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0gnLCBbJ0hIJywgMl0sIDAsICdob3VyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ2gnLCBbJ2hoJywgMl0sIDAsIGhGb3JtYXQpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdrJywgWydraycsIDJdLCAwLCBrRm9ybWF0KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdobW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIGhGb3JtYXQuYXBwbHkodGhpcykgKyB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMik7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tc3MnLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAnJyArXG4gICAgICAgICAgICBoRm9ybWF0LmFwcGx5KHRoaXMpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLnNlY29uZHMoKSwgMilcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICcnICtcbiAgICAgICAgICAgIHRoaXMuaG91cnMoKSArXG4gICAgICAgICAgICB6ZXJvRmlsbCh0aGlzLm1pbnV0ZXMoKSwgMikgK1xuICAgICAgICAgICAgemVyb0ZpbGwodGhpcy5zZWNvbmRzKCksIDIpXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbSh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0oXG4gICAgICAgICAgICAgICAgdGhpcy5ob3VycygpLFxuICAgICAgICAgICAgICAgIHRoaXMubWludXRlcygpLFxuICAgICAgICAgICAgICAgIGxvd2VyY2FzZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0oaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9tZXJpZGllbVBhcnNlO1xuICAgIH1cblxuICAgIGFkZFJlZ2V4VG9rZW4oJ2EnLCBtYXRjaE1lcmlkaWVtKTtcbiAgICBhZGRSZWdleFRva2VuKCdBJywgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaCcsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignaycsIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQsXG4gICAgICAgICAgICBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0LFxuICAgICAgICAgICAgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTShpbnB1dCkge1xuICAgICAgICAvLyBJRTggUXVpcmtzIE1vZGUgJiBJRTcgU3RhbmRhcmRzIE1vZGUgZG8gbm90IGFsbG93IGFjY2Vzc2luZyBzdHJpbmdzIGxpa2UgYXJyYXlzXG4gICAgICAgIC8vIFVzaW5nIGNoYXJBdCBzaG91bGQgYmUgbW9yZSBjb21wYXRpYmxlLlxuICAgICAgICByZXR1cm4gKGlucHV0ICsgJycpLnRvTG93ZXJDYXNlKCkuY2hhckF0KDApID09PSAncCc7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2ksXG4gICAgICAgIC8vIFNldHRpbmcgdGhlIGhvdXIgc2hvdWxkIGtlZXAgdGhlIHRpbWUsIGJlY2F1c2UgdGhlIHVzZXIgZXhwbGljaXRseVxuICAgICAgICAvLyBzcGVjaWZpZWQgd2hpY2ggaG91ciB0aGV5IHdhbnQuIFNvIHRyeWluZyB0byBtYWludGFpbiB0aGUgc2FtZSBob3VyIChpblxuICAgICAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAgICAgLy8gdGhpcyBydWxlLlxuICAgICAgICBnZXRTZXRIb3VyID0gbWFrZUdldFNldCgnSG91cnMnLCB0cnVlKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZU1lcmlkaWVtKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBiYXNlQ29uZmlnID0ge1xuICAgICAgICBjYWxlbmRhcjogZGVmYXVsdENhbGVuZGFyLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdDogZGVmYXVsdExvbmdEYXRlRm9ybWF0LFxuICAgICAgICBpbnZhbGlkRGF0ZTogZGVmYXVsdEludmFsaWREYXRlLFxuICAgICAgICBvcmRpbmFsOiBkZWZhdWx0T3JkaW5hbCxcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UsXG4gICAgICAgIHJlbGF0aXZlVGltZTogZGVmYXVsdFJlbGF0aXZlVGltZSxcblxuICAgICAgICBtb250aHM6IGRlZmF1bHRMb2NhbGVNb250aHMsXG4gICAgICAgIG1vbnRoc1Nob3J0OiBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQsXG5cbiAgICAgICAgd2VlazogZGVmYXVsdExvY2FsZVdlZWssXG5cbiAgICAgICAgd2Vla2RheXM6IGRlZmF1bHRMb2NhbGVXZWVrZGF5cyxcbiAgICAgICAgd2Vla2RheXNNaW46IGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbixcbiAgICAgICAgd2Vla2RheXNTaG9ydDogZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQsXG5cbiAgICAgICAgbWVyaWRpZW1QYXJzZTogZGVmYXVsdExvY2FsZU1lcmlkaWVtUGFyc2UsXG4gICAgfTtcblxuICAgIC8vIGludGVybmFsIHN0b3JhZ2UgZm9yIGxvY2FsZSBjb25maWcgZmlsZXNcbiAgICB2YXIgbG9jYWxlcyA9IHt9LFxuICAgICAgICBsb2NhbGVGYW1pbGllcyA9IHt9LFxuICAgICAgICBnbG9iYWxMb2NhbGU7XG5cbiAgICBmdW5jdGlvbiBjb21tb25QcmVmaXgoYXJyMSwgYXJyMikge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIG1pbmwgPSBNYXRoLm1pbihhcnIxLmxlbmd0aCwgYXJyMi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWlubDsgaSArPSAxKSB7XG4gICAgICAgICAgICBpZiAoYXJyMVtpXSAhPT0gYXJyMltpXSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW5sO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2FsZShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGtleSA/IGtleS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ18nLCAnLScpIDoga2V5O1xuICAgIH1cblxuICAgIC8vIHBpY2sgdGhlIGxvY2FsZSBmcm9tIHRoZSBhcnJheVxuICAgIC8vIHRyeSBbJ2VuLWF1JywgJ2VuLWdiJ10gYXMgJ2VuLWF1JywgJ2VuLWdiJywgJ2VuJywgYXMgaW4gbW92ZSB0aHJvdWdoIHRoZSBsaXN0IHRyeWluZyBlYWNoXG4gICAgLy8gc3Vic3RyaW5nIGZyb20gbW9zdCBzcGVjaWZpYyB0byBsZWFzdCwgYnV0IG1vdmUgdG8gdGhlIG5leHQgYXJyYXkgaXRlbSBpZiBpdCdzIGEgbW9yZSBzcGVjaWZpYyB2YXJpYW50IHRoYW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgIGZ1bmN0aW9uIGNob29zZUxvY2FsZShuYW1lcykge1xuICAgICAgICB2YXIgaSA9IDAsXG4gICAgICAgICAgICBqLFxuICAgICAgICAgICAgbmV4dCxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIHNwbGl0O1xuXG4gICAgICAgIHdoaWxlIChpIDwgbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBzcGxpdCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpXSkuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGogPSBzcGxpdC5sZW5ndGg7XG4gICAgICAgICAgICBuZXh0ID0gbm9ybWFsaXplTG9jYWxlKG5hbWVzW2kgKyAxXSk7XG4gICAgICAgICAgICBuZXh0ID0gbmV4dCA/IG5leHQuc3BsaXQoJy0nKSA6IG51bGw7XG4gICAgICAgICAgICB3aGlsZSAoaiA+IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKHNwbGl0LnNsaWNlKDAsIGopLmpvaW4oJy0nKSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG5leHQgJiZcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5sZW5ndGggPj0gaiAmJlxuICAgICAgICAgICAgICAgICAgICBjb21tb25QcmVmaXgoc3BsaXQsIG5leHQpID49IGogLSAxXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgYXJyYXkgaXRlbSBpcyBiZXR0ZXIgdGhhbiBhIHNoYWxsb3dlciBzdWJzdHJpbmcgb2YgdGhpcyBvbmVcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvYWRMb2NhbGUobmFtZSkge1xuICAgICAgICB2YXIgb2xkTG9jYWxlID0gbnVsbCxcbiAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlO1xuICAgICAgICAvLyBUT0RPOiBGaW5kIGEgYmV0dGVyIHdheSB0byByZWdpc3RlciBhbmQgbG9hZCBhbGwgdGhlIGxvY2FsZXMgaW4gTm9kZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBtb2R1bGUgJiZcbiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzXG4gICAgICAgICkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvbGRMb2NhbGUgPSBnbG9iYWxMb2NhbGUuX2FiYnI7XG4gICAgICAgICAgICAgICAgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBhcyBub3QgZm91bmQgdG8gYXZvaWQgcmVwZWF0aW5nIGV4cGVuc2l2ZSBmaWxlIHJlcXVpcmUgY2FsbCBjYXVzaW5nIGhpZ2ggQ1BVXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gZmluZCBlbi1VUywgZW5fVVMsIGVuLXVzIGZvciBldmVyeSBmb3JtYXQgY2FsbFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBudWxsOyAvLyBudWxsIG1lYW5zIG5vdCBmb3VuZFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUoa2V5LCB2YWx1ZXMpIHtcbiAgICAgICAgdmFyIGRhdGE7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVmaW5lTG9jYWxlKGtleSwgdmFsdWVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBtb21lbnQuZHVyYXRpb24uX2xvY2FsZSA9IG1vbWVudC5fbG9jYWxlID0gZGF0YTtcbiAgICAgICAgICAgICAgICBnbG9iYWxMb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgICAgICdMb2NhbGUgJyArIGtleSArICcgbm90IGZvdW5kLiBEaWQgeW91IGZvcmdldCB0byBsb2FkIGl0PydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlZmluZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIGxvY2FsZSxcbiAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShcbiAgICAgICAgICAgICAgICAgICAgJ2RlZmluZUxvY2FsZU92ZXJyaWRlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NhbGVzW25hbWVdID0gbmV3IExvY2FsZShtZXJnZUNvbmZpZ3MocGFyZW50Q29uZmlnLCBjb25maWcpKTtcblxuICAgICAgICAgICAgaWYgKGxvY2FsZUZhbWlsaWVzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbbmFtZV0uZm9yRWFjaChmdW5jdGlvbiAoeCkge1xuICAgICAgICAgICAgICAgICAgICBkZWZpbmVMb2NhbGUoeC5uYW1lLCB4LmNvbmZpZyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGJhY2t3YXJkcyBjb21wYXQgZm9yIG5vdzogYWxzbyBzZXQgdGhlIGxvY2FsZVxuICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIHNldCB0aGUgbG9jYWxlIEFGVEVSIGFsbCBjaGlsZCBsb2NhbGVzIGhhdmUgYmVlblxuICAgICAgICAgICAgLy8gY3JlYXRlZCwgc28gd2Ugd29uJ3QgZW5kIHVwIHdpdGggdGhlIGNoaWxkIGxvY2FsZSBzZXQuXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nXG4gICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXBkYXRlTG9jYWxlKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBsb2NhbGUsXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlLFxuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG5cbiAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdICE9IG51bGwgJiYgbG9jYWxlc1tuYW1lXS5wYXJlbnRMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBleGlzdGluZyBjaGlsZCBsb2NhbGUgaW4tcGxhY2UgdG8gYXZvaWQgbWVtb3J5LWxlYWtzXG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXS5zZXQobWVyZ2VDb25maWdzKGxvY2FsZXNbbmFtZV0uX2NvbmZpZywgY29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE1FUkdFXG4gICAgICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodG1wTG9jYWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50Q29uZmlnID0gdG1wTG9jYWxlLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgaWYgKHRtcExvY2FsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZUxvY2FsZSBpcyBjYWxsZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZVxuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgYWJiciBzbyBpdCB3aWxsIGhhdmUgYSBuYW1lIChnZXR0ZXJzIHJldHVyblxuICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQgb3RoZXJ3aXNlKS5cbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbGUgPSBuZXcgTG9jYWxlKGNvbmZpZyk7XG4gICAgICAgICAgICAgICAgbG9jYWxlLnBhcmVudExvY2FsZSA9IGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09IGdldFNldEdsb2JhbExvY2FsZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIGxvY2FsZTtcblxuICAgICAgICBpZiAoa2V5ICYmIGtleS5fbG9jYWxlICYmIGtleS5fbG9jYWxlLl9hYmJyKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXkuX2xvY2FsZS5fYWJicjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2xvYmFsTG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0FycmF5KGtleSkpIHtcbiAgICAgICAgICAgIC8vc2hvcnQtY2lyY3VpdCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgIGxvY2FsZSA9IGxvYWRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5ID0gW2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2hvb3NlTG9jYWxlKGtleSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdExvY2FsZXMoKSB7XG4gICAgICAgIHJldHVybiBrZXlzKGxvY2FsZXMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrT3ZlcmZsb3cobSkge1xuICAgICAgICB2YXIgb3ZlcmZsb3csXG4gICAgICAgICAgICBhID0gbS5fYTtcblxuICAgICAgICBpZiAoYSAmJiBnZXRQYXJzaW5nRmxhZ3MobSkub3ZlcmZsb3cgPT09IC0yKSB7XG4gICAgICAgICAgICBvdmVyZmxvdyA9XG4gICAgICAgICAgICAgICAgYVtNT05USF0gPCAwIHx8IGFbTU9OVEhdID4gMTFcbiAgICAgICAgICAgICAgICAgICAgPyBNT05USFxuICAgICAgICAgICAgICAgICAgICA6IGFbREFURV0gPCAxIHx8IGFbREFURV0gPiBkYXlzSW5Nb250aChhW1lFQVJdLCBhW01PTlRIXSlcbiAgICAgICAgICAgICAgICAgICAgPyBEQVRFXG4gICAgICAgICAgICAgICAgICAgIDogYVtIT1VSXSA8IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICBhW0hPVVJdID4gMjQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAoYVtIT1VSXSA9PT0gMjQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGFbTUlOVVRFXSAhPT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtTRUNPTkRdICE9PSAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW01JTExJU0VDT05EXSAhPT0gMCkpXG4gICAgICAgICAgICAgICAgICAgID8gSE9VUlxuICAgICAgICAgICAgICAgICAgICA6IGFbTUlOVVRFXSA8IDAgfHwgYVtNSU5VVEVdID4gNTlcbiAgICAgICAgICAgICAgICAgICAgPyBNSU5VVEVcbiAgICAgICAgICAgICAgICAgICAgOiBhW1NFQ09ORF0gPCAwIHx8IGFbU0VDT05EXSA+IDU5XG4gICAgICAgICAgICAgICAgICAgID8gU0VDT05EXG4gICAgICAgICAgICAgICAgICAgIDogYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5XG4gICAgICAgICAgICAgICAgICAgID8gTUlMTElTRUNPTkRcbiAgICAgICAgICAgICAgICAgICAgOiAtMTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dEYXlPZlllYXIgJiZcbiAgICAgICAgICAgICAgICAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gREFURTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla3MgJiYgb3ZlcmZsb3cgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSBXRUVLO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldFBhcnNpbmdGbGFncyhtKS5fb3ZlcmZsb3dXZWVrZGF5ICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFS0RBWTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLm92ZXJmbG93ID0gb3ZlcmZsb3c7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBpc28gODYwMSByZWdleFxuICAgIC8vIDAwMDAtMDAtMDAgMDAwMC1XMDAgb3IgMDAwMC1XMDAtMCArIFQgKyAwMCBvciAwMDowMCBvciAwMDowMDowMCBvciAwMDowMDowMC4wMDAgKyArMDA6MDAgb3IgKzAwMDAgb3IgKzAwKVxuICAgIHZhciBleHRlbmRlZElzb1JlZ2V4ID0gL15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoWystXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sXG4gICAgICAgIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkfCkpKD86KFR8ICkoXFxkXFxkKD86XFxkXFxkKD86XFxkXFxkKD86Wy4sXVxcZCspPyk/KT8pKFsrLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLFxuICAgICAgICB0elJlZ2V4ID0gL1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLFxuICAgICAgICBpc29EYXRlcyA9IFtcbiAgICAgICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICAgICAgWydZWVlZLU1NLUREJywgL1xcZHs0fS1cXGRcXGQtXFxkXFxkL10sXG4gICAgICAgICAgICBbJ0dHR0ctW1ddV1ctRScsIC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxcbiAgICAgICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWS1EREQnLCAvXFxkezR9LVxcZHszfS9dLFxuICAgICAgICAgICAgWydZWVlZLU1NJywgL1xcZHs0fS1cXGRcXGQvLCBmYWxzZV0sXG4gICAgICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NREQnLCAvXFxkezh9L10sXG4gICAgICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICAgICAgWydHR0dHW1ddV1cnLCAvXFxkezR9V1xcZHsyfS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWURERCcsIC9cXGR7N30vXSxcbiAgICAgICAgICAgIFsnWVlZWU1NJywgL1xcZHs2fS8sIGZhbHNlXSxcbiAgICAgICAgICAgIFsnWVlZWScsIC9cXGR7NH0vLCBmYWxzZV0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGlzbyB0aW1lIGZvcm1hdHMgYW5kIHJlZ2V4ZXNcbiAgICAgICAgaXNvVGltZXMgPSBbXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLlNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGRcXC5cXGQrL10sXG4gICAgICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICAgICAgWydISDptbTpzcycsIC9cXGRcXGQ6XFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICAgICAgWydISDptbScsIC9cXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzLFNTU1MnLCAvXFxkXFxkXFxkXFxkXFxkXFxkLFxcZCsvXSxcbiAgICAgICAgICAgIFsnSEhtbXNzJywgL1xcZFxcZFxcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICAgICAgWydISCcsIC9cXGRcXGQvXSxcbiAgICAgICAgXSxcbiAgICAgICAgYXNwTmV0SnNvblJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2ksXG4gICAgICAgIC8vIFJGQyAyODIyIHJlZ2V4OiBGb3IgZGV0YWlscyBzZWUgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzI4MjIjc2VjdGlvbi0zLjNcbiAgICAgICAgcmZjMjgyMiA9IC9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC8sXG4gICAgICAgIG9ic09mZnNldHMgPSB7XG4gICAgICAgICAgICBVVDogMCxcbiAgICAgICAgICAgIEdNVDogMCxcbiAgICAgICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgICAgIEVTVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENEVDogLTUgKiA2MCxcbiAgICAgICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1EVDogLTYgKiA2MCxcbiAgICAgICAgICAgIE1TVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgICAgIFBTVDogLTggKiA2MCxcbiAgICAgICAgfTtcblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlTTyhjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgc3RyaW5nID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgbWF0Y2ggPSBleHRlbmRlZElzb1JlZ2V4LmV4ZWMoc3RyaW5nKSB8fCBiYXNpY0lzb1JlZ2V4LmV4ZWMoc3RyaW5nKSxcbiAgICAgICAgICAgIGFsbG93VGltZSxcbiAgICAgICAgICAgIGRhdGVGb3JtYXQsXG4gICAgICAgICAgICB0aW1lRm9ybWF0LFxuICAgICAgICAgICAgdHpGb3JtYXQ7XG5cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pc28gPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGkgPSAwLCBsID0gaXNvRGF0ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb0RhdGVzW2ldWzFdLmV4ZWMobWF0Y2hbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGVGb3JtYXQgPSBpc29EYXRlc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dUaW1lID0gaXNvRGF0ZXNbaV1bMl0gIT09IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG1hdGNoWzNdKSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb1RpbWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNvVGltZXNbaV1bMV0uZXhlYyhtYXRjaFszXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoWzJdIHNob3VsZCBiZSAnVCcgb3Igc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVGb3JtYXQgPSAobWF0Y2hbMl0gfHwgJyAnKSArIGlzb1RpbWVzW2ldWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRpbWVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYWxsb3dUaW1lICYmIHRpbWVGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFs0XSkge1xuICAgICAgICAgICAgICAgIGlmICh0elJlZ2V4LmV4ZWMobWF0Y2hbNF0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHR6Rm9ybWF0ID0gJ1onO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnLl9mID0gZGF0ZUZvcm1hdCArICh0aW1lRm9ybWF0IHx8ICcnKSArICh0ekZvcm1hdCB8fCAnJyk7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgIHllYXJTdHIsXG4gICAgICAgIG1vbnRoU3RyLFxuICAgICAgICBkYXlTdHIsXG4gICAgICAgIGhvdXJTdHIsXG4gICAgICAgIG1pbnV0ZVN0cixcbiAgICAgICAgc2Vjb25kU3RyXG4gICAgKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXG4gICAgICAgICAgICB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSxcbiAgICAgICAgICAgIGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydC5pbmRleE9mKG1vbnRoU3RyKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGRheVN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQoaG91clN0ciwgMTApLFxuICAgICAgICAgICAgcGFyc2VJbnQobWludXRlU3RyLCAxMCksXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gc1xuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKFteKV0qXFwpfFtcXG5cXHRdL2csICcgJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXFxzXFxzKykvZywgJyAnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15cXHNcXHMqLywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzXFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2hlY2tXZWVrZGF5KHdlZWtkYXlTdHIsIHBhcnNlZElucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKHdlZWtkYXlTdHIpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFJlcGxhY2UgdGhlIHZhbmlsbGEgSlMgRGF0ZSBvYmplY3Qgd2l0aCBhbiBpbmRlcGVuZGVudCBkYXktb2Ytd2VlayBjaGVjay5cbiAgICAgICAgICAgIHZhciB3ZWVrZGF5UHJvdmlkZWQgPSBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydC5pbmRleE9mKHdlZWtkYXlTdHIpLFxuICAgICAgICAgICAgICAgIHdlZWtkYXlBY3R1YWwgPSBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkSW5wdXRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZElucHV0WzFdLFxuICAgICAgICAgICAgICAgICAgICBwYXJzZWRJbnB1dFsyXVxuICAgICAgICAgICAgICAgICkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2FsY3VsYXRlT2Zmc2V0KG9ic09mZnNldCwgbWlsaXRhcnlPZmZzZXQsIG51bU9mZnNldCkge1xuICAgICAgICBpZiAob2JzT2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gb2JzT2Zmc2V0c1tvYnNPZmZzZXRdO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbGl0YXJ5T2Zmc2V0KSB7XG4gICAgICAgICAgICAvLyB0aGUgb25seSBhbGxvd2VkIG1pbGl0YXJ5IHR6IGlzIFpcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGhtID0gcGFyc2VJbnQobnVtT2Zmc2V0LCAxMCksXG4gICAgICAgICAgICAgICAgbSA9IGhtICUgMTAwLFxuICAgICAgICAgICAgICAgIGggPSAoaG0gLSBtKSAvIDEwMDtcbiAgICAgICAgICAgIHJldHVybiBoICogNjAgKyBtO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBhbmQgdGltZSBmcm9tIHJlZiAyODIyIGZvcm1hdFxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2ggPSByZmMyODIyLmV4ZWMocHJlcHJvY2Vzc1JGQzI4MjIoY29uZmlnLl9pKSksXG4gICAgICAgICAgICBwYXJzZWRBcnJheTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICBwYXJzZWRBcnJheSA9IGV4dHJhY3RGcm9tUkZDMjgyMlN0cmluZ3MoXG4gICAgICAgICAgICAgICAgbWF0Y2hbNF0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbM10sXG4gICAgICAgICAgICAgICAgbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNV0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbNl0sXG4gICAgICAgICAgICAgICAgbWF0Y2hbN11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIWNoZWNrV2Vla2RheShtYXRjaFsxXSwgcGFyc2VkQXJyYXksIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IHBhcnNlZEFycmF5O1xuICAgICAgICAgICAgY29uZmlnLl90em0gPSBjYWxjdWxhdGVPZmZzZXQobWF0Y2hbOF0sIG1hdGNoWzldLCBtYXRjaFsxMF0pO1xuXG4gICAgICAgICAgICBjb25maWcuX2QgPSBjcmVhdGVVVENEYXRlLmFwcGx5KG51bGwsIGNvbmZpZy5fYSk7XG4gICAgICAgICAgICBjb25maWcuX2Quc2V0VVRDTWludXRlcyhjb25maWcuX2QuZ2V0VVRDTWludXRlcygpIC0gY29uZmlnLl90em0pO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5yZmMyODIyID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0ZSBmcm9tIDEpIEFTUC5ORVQsIDIpIElTTywgMykgUkZDIDI4MjIgZm9ybWF0cywgb3IgNCkgb3B0aW9uYWwgZmFsbGJhY2sgaWYgcGFyc2luZyBpc24ndCBzdHJpY3RcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tU3RyaW5nKGNvbmZpZykge1xuICAgICAgICB2YXIgbWF0Y2hlZCA9IGFzcE5ldEpzb25SZWdleC5leGVjKGNvbmZpZy5faSk7XG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9zdHJpY3QpIHtcbiAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmluYWwgYXR0ZW1wdCwgdXNlIElucHV0IEZhbGxiYWNrXG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2sgPSBkZXByZWNhdGUoXG4gICAgICAgICd2YWx1ZSBwcm92aWRlZCBpcyBub3QgaW4gYSByZWNvZ25pemVkIFJGQzI4MjIgb3IgSVNPIGZvcm1hdC4gbW9tZW50IGNvbnN0cnVjdGlvbiBmYWxscyBiYWNrIHRvIGpzIERhdGUoKSwgJyArXG4gICAgICAgICAgICAnd2hpY2ggaXMgbm90IHJlbGlhYmxlIGFjcm9zcyBhbGwgYnJvd3NlcnMgYW5kIHZlcnNpb25zLiBOb24gUkZDMjgyMi9JU08gZGF0ZSBmb3JtYXRzIGFyZSAnICtcbiAgICAgICAgICAgICdkaXNjb3VyYWdlZC4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgdGhlIGZpcnN0IGRlZmluZWQgb2YgdHdvIG9yIHRocmVlIGFyZ3VtZW50cy5cbiAgICBmdW5jdGlvbiBkZWZhdWx0cyhhLCBiLCBjKSB7XG4gICAgICAgIGlmIChhICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGN1cnJlbnREYXRlQXJyYXkoY29uZmlnKSB7XG4gICAgICAgIC8vIGhvb2tzIGlzIGFjdHVhbGx5IHRoZSBleHBvcnRlZCBtb21lbnQgb2JqZWN0XG4gICAgICAgIHZhciBub3dWYWx1ZSA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIG5vd1ZhbHVlLmdldFVUQ0Z1bGxZZWFyKCksXG4gICAgICAgICAgICAgICAgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSxcbiAgICAgICAgICAgICAgICBub3dWYWx1ZS5nZXRVVENEYXRlKCksXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0RnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0TW9udGgoKSwgbm93VmFsdWUuZ2V0RGF0ZSgpXTtcbiAgICB9XG5cbiAgICAvLyBjb252ZXJ0IGFuIGFycmF5IHRvIGEgZGF0ZS5cbiAgICAvLyB0aGUgYXJyYXkgc2hvdWxkIG1pcnJvciB0aGUgcGFyYW1ldGVycyBiZWxvd1xuICAgIC8vIG5vdGU6IGFsbCB2YWx1ZXMgcGFzdCB0aGUgeWVhciBhcmUgb3B0aW9uYWwgYW5kIHdpbGwgZGVmYXVsdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxuICAgIC8vIFt5ZWFyLCBtb250aCwgZGF5ICwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kXVxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21BcnJheShjb25maWcpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgaW5wdXQgPSBbXSxcbiAgICAgICAgICAgIGN1cnJlbnREYXRlLFxuICAgICAgICAgICAgZXhwZWN0ZWRXZWVrZGF5LFxuICAgICAgICAgICAgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8XG4gICAgICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd0RheU9mWWVhciA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGUgPSBjcmVhdGVVVENEYXRlKHllYXJUb1VzZSwgMCwgY29uZmlnLl9kYXlPZlllYXIpO1xuICAgICAgICAgICAgY29uZmlnLl9hW01PTlRIXSA9IGRhdGUuZ2V0VVRDTW9udGgoKTtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtEQVRFXSA9IGRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IGRhdGUuXG4gICAgICAgIC8vICogaWYgbm8geWVhciwgbW9udGgsIGRheSBvZiBtb250aCBhcmUgZ2l2ZW4sIGRlZmF1bHQgdG8gdG9kYXlcbiAgICAgICAgLy8gKiBpZiBkYXkgb2YgbW9udGggaXMgZ2l2ZW4sIGRlZmF1bHQgbW9udGggYW5kIHllYXJcbiAgICAgICAgLy8gKiBpZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBvbmx5IHllYXJcbiAgICAgICAgLy8gKiBpZiB5ZWFyIGlzIGdpdmVuLCBkb24ndCBkZWZhdWx0IGFueXRoaW5nXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGNvbmZpZy5fYVtpXSA9PSBudWxsOyArK2kpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID0gY3VycmVudERhdGVbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBaZXJvIG91dCB3aGF0ZXZlciB3YXMgbm90IGRlZmF1bHRlZCwgaW5jbHVkaW5nIHRpbWVcbiAgICAgICAgZm9yICg7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtpXSA9IGlucHV0W2ldID1cbiAgICAgICAgICAgICAgICBjb25maWcuX2FbaV0gPT0gbnVsbCA/IChpID09PSAyID8gMSA6IDApIDogY29uZmlnLl9hW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgZm9yIDI0OjAwOjAwLjAwMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICBjb25maWcuX2FbTUlOVVRFXSA9PT0gMCAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW1NFQ09ORF0gPT09IDAgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25maWcuX25leHREYXkgPSB0cnVlO1xuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZy5fZCA9IChjb25maWcuX3VzZVVUQyA/IGNyZWF0ZVVUQ0RhdGUgOiBjcmVhdGVEYXRlKS5hcHBseShcbiAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICBpbnB1dFxuICAgICAgICApO1xuICAgICAgICBleHBlY3RlZFdlZWtkYXkgPSBjb25maWcuX3VzZVVUQ1xuICAgICAgICAgICAgPyBjb25maWcuX2QuZ2V0VVRDRGF5KClcbiAgICAgICAgICAgIDogY29uZmlnLl9kLmdldERheSgpO1xuXG4gICAgICAgIC8vIEFwcGx5IHRpbWV6b25lIG9mZnNldCBmcm9tIGlucHV0LiBUaGUgYWN0dWFsIHV0Y09mZnNldCBjYW4gYmUgY2hhbmdlZFxuICAgICAgICAvLyB3aXRoIHBhcnNlWm9uZS5cbiAgICAgICAgaWYgKGNvbmZpZy5fdHptICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZC5zZXRVVENNaW51dGVzKGNvbmZpZy5fZC5nZXRVVENNaW51dGVzKCkgLSBjb25maWcuX3R6bSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAyNDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGZvciBtaXNtYXRjaGluZyBkYXkgb2Ygd2Vla1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX3cgJiZcbiAgICAgICAgICAgIHR5cGVvZiBjb25maWcuX3cuZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fdy5kICE9PSBleHBlY3RlZFdlZWtkYXlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2YXIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3csIGN1cldlZWs7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyhcbiAgICAgICAgICAgICAgICB3LkdHLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtZRUFSXSxcbiAgICAgICAgICAgICAgICB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIDEsIDQpLnllYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgY3VyV2VlayA9IHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgZG93LCBkb3kpO1xuXG4gICAgICAgICAgICB3ZWVrWWVhciA9IGRlZmF1bHRzKHcuZ2csIGNvbmZpZy5fYVtZRUFSXSwgY3VyV2Vlay55ZWFyKTtcblxuICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjdXJyZW50IHdlZWsuXG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody53LCBjdXJXZWVrLndlZWspO1xuXG4gICAgICAgICAgICBpZiAody5kICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyB3ZWVrZGF5IC0tIGxvdyBkYXkgbnVtYmVycyBhcmUgY29uc2lkZXJlZCBuZXh0IHdlZWtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gdy5kO1xuICAgICAgICAgICAgICAgIGlmICh3ZWVrZGF5IDwgMCB8fCB3ZWVrZGF5ID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAody5lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBsb2NhbCB3ZWVrZGF5IC0tIGNvdW50aW5nIHN0YXJ0cyBmcm9tIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZSArIGRvdztcbiAgICAgICAgICAgICAgICBpZiAody5lIDwgMCB8fCB3LmUgPiA2KSB7XG4gICAgICAgICAgICAgICAgICAgIHdlZWtkYXlPdmVyZmxvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGJlZ2lubmluZyBvZiB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IGRvdztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAod2VlayA8IDEgfHwgd2VlayA+IHdlZWtzSW5ZZWFyKHdlZWtZZWFyLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh3ZWVrZGF5T3ZlcmZsb3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93V2Vla2RheSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gZGF5T2ZZZWFyRnJvbVdlZWtzKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgICAgICBjb25maWcuX2FbWUVBUl0gPSB0ZW1wLnllYXI7XG4gICAgICAgICAgICBjb25maWcuX2RheU9mWWVhciA9IHRlbXAuZGF5T2ZZZWFyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIElTTyBzdGFuZGFyZFxuICAgIGhvb2tzLklTT184NjAxID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBjb25zdGFudCB0aGF0IHJlZmVycyB0byB0aGUgUkZDIDI4MjIgZm9ybVxuICAgIGhvb2tzLlJGQ18yODIyID0gZnVuY3Rpb24gKCkge307XG5cbiAgICAvLyBkYXRlIGZyb20gc3RyaW5nIGFuZCBmb3JtYXQgc3RyaW5nXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpIHtcbiAgICAgICAgLy8gVE9ETzogTW92ZSB0aGlzIHRvIGFub3RoZXIgcGFydCBvZiB0aGUgY3JlYXRpb24gZmxvdyB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcHNcbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuSVNPXzg2MDEpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JU08oY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLl9mID09PSBob29rcy5SRkNfMjgyMikge1xuICAgICAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25maWcuX2EgPSBbXTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZW1wdHkgPSB0cnVlO1xuXG4gICAgICAgIC8vIFRoaXMgYXJyYXkgaXMgdXNlZCB0byBtYWtlIGEgRGF0ZSwgZWl0aGVyIHdpdGggYG5ldyBEYXRlYCBvciBgRGF0ZS5VVENgXG4gICAgICAgIHZhciBzdHJpbmcgPSAnJyArIGNvbmZpZy5faSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBwYXJzZWRJbnB1dCxcbiAgICAgICAgICAgIHRva2VucyxcbiAgICAgICAgICAgIHRva2VuLFxuICAgICAgICAgICAgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMCxcbiAgICAgICAgICAgIGVyYTtcblxuICAgICAgICB0b2tlbnMgPVxuICAgICAgICAgICAgZXhwYW5kRm9ybWF0KGNvbmZpZy5fZiwgY29uZmlnLl9sb2NhbGUpLm1hdGNoKGZvcm1hdHRpbmdUb2tlbnMpIHx8IFtdO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2VuID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgcGFyc2VkSW5wdXQgPSAoc3RyaW5nLm1hdGNoKGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSkgfHxcbiAgICAgICAgICAgICAgICBbXSlbMF07XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKFxuICAgICAgICAgICAgICAgICAgICBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkgKyBwYXJzZWRJbnB1dC5sZW5ndGhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGggKz0gcGFyc2VkSW5wdXQubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZG9uJ3QgcGFyc2UgaWYgaXQncyBub3QgYSBrbm93biB0b2tlblxuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW3Rva2VuXSkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5lbXB0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIHBhcnNlZElucHV0LCBjb25maWcpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuX3N0cmljdCAmJiAhcGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhZGQgcmVtYWluaW5nIHVucGFyc2VkIGlucHV0IGxlbmd0aCB0byB0aGUgc3RyaW5nXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmNoYXJzTGVmdE92ZXIgPVxuICAgICAgICAgICAgc3RyaW5nTGVuZ3RoIC0gdG90YWxQYXJzZWRJbnB1dExlbmd0aDtcbiAgICAgICAgaWYgKHN0cmluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRJbnB1dC5wdXNoKHN0cmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbGVhciBfMTJoIGZsYWcgaWYgaG91ciBpcyA8PSAxMlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPD0gMTIgJiZcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPT09IHRydWUgJiZcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucGFyc2VkRGF0ZVBhcnRzID0gY29uZmlnLl9hLnNsaWNlKDApO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5tZXJpZGllbSA9IGNvbmZpZy5fbWVyaWRpZW07XG4gICAgICAgIC8vIGhhbmRsZSBtZXJpZGllbVxuICAgICAgICBjb25maWcuX2FbSE9VUl0gPSBtZXJpZGllbUZpeFdyYXAoXG4gICAgICAgICAgICBjb25maWcuX2xvY2FsZSxcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSxcbiAgICAgICAgICAgIGNvbmZpZy5fbWVyaWRpZW1cbiAgICAgICAgKTtcblxuICAgICAgICAvLyBoYW5kbGUgZXJhXG4gICAgICAgIGVyYSA9IGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVyYTtcbiAgICAgICAgaWYgKGVyYSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gY29uZmlnLl9sb2NhbGUuZXJhc0NvbnZlcnRZZWFyKGVyYSwgY29uZmlnLl9hW1lFQVJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWVyaWRpZW1GaXhXcmFwKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2YXIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG4gICAgICAgICAgICBzY29yZVRvQmVhdCxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBjdXJyZW50U2NvcmUsXG4gICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kLFxuICAgICAgICAgICAgYmVzdEZvcm1hdElzVmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy5fZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBpZiAoaXNWYWxpZCh0ZW1wQ29uZmlnKSkge1xuICAgICAgICAgICAgICAgIHZhbGlkRm9ybWF0Rm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbnkgaW5wdXQgdGhhdCB3YXMgbm90IHBhcnNlZCBhZGQgYSBwZW5hbHR5IGZvciB0aGF0IGZvcm1hdFxuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5jaGFyc0xlZnRPdmVyO1xuXG4gICAgICAgICAgICAvL29yIHRva2Vuc1xuICAgICAgICAgICAgY3VycmVudFNjb3JlICs9IGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS51bnVzZWRUb2tlbnMubGVuZ3RoICogMTA7XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyh0ZW1wQ29uZmlnKS5zY29yZSA9IGN1cnJlbnRTY29yZTtcblxuICAgICAgICAgICAgaWYgKCFiZXN0Rm9ybWF0SXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPT0gbnVsbCB8fFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2NvcmUgPCBzY29yZVRvQmVhdCB8fFxuICAgICAgICAgICAgICAgICAgICB2YWxpZEZvcm1hdEZvdW5kXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkRm9ybWF0Rm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRJc1ZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3JlVG9CZWF0ID0gY3VycmVudFNjb3JlO1xuICAgICAgICAgICAgICAgICAgICBiZXN0TW9tZW50ID0gdGVtcENvbmZpZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKSxcbiAgICAgICAgICAgIGRheU9yRGF0ZSA9IGkuZGF5ID09PSB1bmRlZmluZWQgPyBpLmRhdGUgOiBpLmRheTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFxuICAgICAgICAgICAgW2kueWVhciwgaS5tb250aCwgZGF5T3JEYXRlLCBpLmhvdXIsIGkubWludXRlLCBpLnNlY29uZCwgaS5taWxsaXNlY29uZF0sXG4gICAgICAgICAgICBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnKGNvbmZpZykge1xuICAgICAgICB2YXIgcmVzID0gbmV3IE1vbWVudChjaGVja092ZXJmbG93KHByZXBhcmVDb25maWcoY29uZmlnKSkpO1xuICAgICAgICBpZiAocmVzLl9uZXh0RGF5KSB7XG4gICAgICAgICAgICAvLyBBZGRpbmcgaXMgc21hcnQgZW5vdWdoIGFyb3VuZCBEU1RcbiAgICAgICAgICAgIHJlcy5hZGQoMSwgJ2QnKTtcbiAgICAgICAgICAgIHJlcy5fbmV4dERheSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcGFyZUNvbmZpZyhjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pLFxuICAgICAgICAgICAgZm9ybWF0ID0gY29uZmlnLl9mO1xuXG4gICAgICAgIGNvbmZpZy5fbG9jYWxlID0gY29uZmlnLl9sb2NhbGUgfHwgZ2V0TG9jYWxlKGNvbmZpZy5fbCk7XG5cbiAgICAgICAgaWYgKGlucHV0ID09PSBudWxsIHx8IChmb3JtYXQgPT09IHVuZGVmaW5lZCAmJiBpbnB1dCA9PT0gJycpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCh7IG51bGxJbnB1dDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnRnJvbUlucHV0KGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzVmFsaWQoY29uZmlnKSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbUlucHV0KGNvbmZpZykge1xuICAgICAgICB2YXIgaW5wdXQgPSBjb25maWcuX2k7XG4gICAgICAgIGlmIChpc1VuZGVmaW5lZChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKGhvb2tzLm5vdygpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dC52YWx1ZU9mKCkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmcoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9hID0gbWFwKGlucHV0LnNsaWNlKDApLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihpbnB1dCkpIHtcbiAgICAgICAgICAgIC8vIGZyb20gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShpbnB1dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayhjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGUsIHN0cmljdCwgaXNVVEMpIHtcbiAgICAgICAgdmFyIGMgPSB7fTtcblxuICAgICAgICBpZiAoZm9ybWF0ID09PSB0cnVlIHx8IGZvcm1hdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0cmljdCA9IGZvcm1hdDtcbiAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gbG9jYWxlO1xuICAgICAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGlzT2JqZWN0KGlucHV0KSAmJiBpc09iamVjdEVtcHR5KGlucHV0KSkgfHxcbiAgICAgICAgICAgIChpc0FycmF5KGlucHV0KSAmJiBpbnB1dC5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaW5wdXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gb2JqZWN0IGNvbnN0cnVjdGlvbiBtdXN0IGJlIGRvbmUgdGhpcyB3YXkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L2lzc3Vlcy8xNDIzXG4gICAgICAgIGMuX2lzQU1vbWVudE9iamVjdCA9IHRydWU7XG4gICAgICAgIGMuX3VzZVVUQyA9IGMuX2lzVVRDID0gaXNVVEM7XG4gICAgICAgIGMuX2wgPSBsb2NhbGU7XG4gICAgICAgIGMuX2kgPSBpbnB1dDtcbiAgICAgICAgYy5fZiA9IGZvcm1hdDtcbiAgICAgICAgYy5fc3RyaWN0ID0gc3RyaWN0O1xuXG4gICAgICAgIHJldHVybiBjcmVhdGVGcm9tQ29uZmlnKGMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZU1pbiA9IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICdtb21lbnQoKS5taW4gaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5tYXggaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICAgIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAgICAgICAgICdtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4LycsXG4gICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA+IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUludmFsaWQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAvLyBQaWNrIGEgbW9tZW50IG0gZnJvbSBtb21lbnRzIHNvIHRoYXQgbVtmbl0ob3RoZXIpIGlzIHRydWUgZm9yIGFsbFxuICAgIC8vIG90aGVyLiBUaGlzIHJlbGllcyBvbiB0aGUgZnVuY3Rpb24gZm4gdG8gYmUgdHJhbnNpdGl2ZS5cbiAgICAvL1xuICAgIC8vIG1vbWVudHMgc2hvdWxkIGVpdGhlciBiZSBhbiBhcnJheSBvZiBtb21lbnQgb2JqZWN0cyBvciBhbiBhcnJheSwgd2hvc2VcbiAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzLlxuICAgIGZ1bmN0aW9uIHBpY2tCeShmbiwgbW9tZW50cykge1xuICAgICAgICB2YXIgcmVzLCBpO1xuICAgICAgICBpZiAobW9tZW50cy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShtb21lbnRzWzBdKSkge1xuICAgICAgICAgICAgbW9tZW50cyA9IG1vbWVudHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtb21lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzID0gbW9tZW50c1swXTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG1vbWVudHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghbW9tZW50c1tpXS5pc1ZhbGlkKCkgfHwgbW9tZW50c1tpXVtmbl0ocmVzKSkge1xuICAgICAgICAgICAgICAgIHJlcyA9IG1vbWVudHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBVc2UgW10uc29ydCBpbnN0ZWFkP1xuICAgIGZ1bmN0aW9uIG1pbigpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXgoKSB7XG4gICAgICAgIHZhciBhcmdzID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xuXG4gICAgICAgIHJldHVybiBwaWNrQnkoJ2lzQWZ0ZXInLCBhcmdzKTtcbiAgICB9XG5cbiAgICB2YXIgbm93ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gRGF0ZS5ub3cgPyBEYXRlLm5vdygpIDogK25ldyBEYXRlKCk7XG4gICAgfTtcblxuICAgIHZhciBvcmRlcmluZyA9IFtcbiAgICAgICAgJ3llYXInLFxuICAgICAgICAncXVhcnRlcicsXG4gICAgICAgICdtb250aCcsXG4gICAgICAgICd3ZWVrJyxcbiAgICAgICAgJ2RheScsXG4gICAgICAgICdob3VyJyxcbiAgICAgICAgJ21pbnV0ZScsXG4gICAgICAgICdzZWNvbmQnLFxuICAgICAgICAnbWlsbGlzZWNvbmQnLFxuICAgIF07XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uVmFsaWQobSkge1xuICAgICAgICB2YXIga2V5LFxuICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSBmYWxzZSxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoa2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBoYXNPd25Qcm9wKG0sIGtleSkgJiZcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBpbmRleE9mLmNhbGwob3JkZXJpbmcsIGtleSkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIChtW2tleV0gPT0gbnVsbCB8fCAhaXNOYU4obVtrZXldKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChtW29yZGVyaW5nW2ldXSkge1xuICAgICAgICAgICAgICAgIGlmICh1bml0SGFzRGVjaW1hbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG9ubHkgYWxsb3cgbm9uLWludGVnZXJzIGZvciBzbWFsbGVzdCB1bml0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1bb3JkZXJpbmdbaV1dKSAhPT0gdG9JbnQobVtvcmRlcmluZ1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXRIYXNEZWNpbWFsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1ZhbGlkJDEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1ZhbGlkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUludmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKE5hTik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gRHVyYXRpb24oZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9XG4gICAgICAgICAgICArbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHNlY29uZHMgKiAxZTMgKyAvLyAxMDAwXG4gICAgICAgICAgICBtaW51dGVzICogNmU0ICsgLy8gMTAwMCAqIDYwXG4gICAgICAgICAgICBob3VycyAqIDEwMDAgKiA2MCAqIDYwOyAvL3VzaW5nIDEwMDAgKiA2MCAqIDYwIGluc3RlYWQgb2YgMzZlNSB0byBhdm9pZCBmbG9hdGluZyBwb2ludCByb3VuZGluZyBlcnJvcnMgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzI5NzhcbiAgICAgICAgLy8gQmVjYXVzZSBvZiBkYXRlQWRkUmVtb3ZlIHRyZWF0cyAyNCBob3VycyBhcyBkaWZmZXJlbnQgZnJvbSBhXG4gICAgICAgIC8vIGRheSB3aGVuIHdvcmtpbmcgYXJvdW5kIERTVCwgd2UgbmVlZCB0byBzdG9yZSB0aGVtIHNlcGFyYXRlbHlcbiAgICAgICAgdGhpcy5fZGF5cyA9ICtkYXlzICsgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICsgcXVhcnRlcnMgKiAzICsgeWVhcnMgKiAxMjtcblxuICAgICAgICB0aGlzLl9kYXRhID0ge307XG5cbiAgICAgICAgdGhpcy5fbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG5cbiAgICAgICAgdGhpcy5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kKG51bWJlcikge1xuICAgICAgICBpZiAobnVtYmVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoLTEgKiBudW1iZXIpICogLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29tcGFyZSB0d28gYXJyYXlzLCByZXR1cm4gdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlc1xuICAgIGZ1bmN0aW9uIGNvbXBhcmVBcnJheXMoYXJyYXkxLCBhcnJheTIsIGRvbnRDb252ZXJ0KSB7XG4gICAgICAgIHZhciBsZW4gPSBNYXRoLm1pbihhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGxlbmd0aERpZmYgPSBNYXRoLmFicyhhcnJheTEubGVuZ3RoIC0gYXJyYXkyLmxlbmd0aCksXG4gICAgICAgICAgICBkaWZmcyA9IDAsXG4gICAgICAgICAgICBpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoZG9udENvbnZlcnQgJiYgYXJyYXkxW2ldICE9PSBhcnJheTJbaV0pIHx8XG4gICAgICAgICAgICAgICAgKCFkb250Q29udmVydCAmJiB0b0ludChhcnJheTFbaV0pICE9PSB0b0ludChhcnJheTJbaV0pKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCh0b2tlbiwgc2VwYXJhdG9yKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy51dGNPZmZzZXQoKSxcbiAgICAgICAgICAgICAgICBzaWduID0gJysnO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0O1xuICAgICAgICAgICAgICAgIHNpZ24gPSAnLSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHNpZ24gK1xuICAgICAgICAgICAgICAgIHplcm9GaWxsKH5+KG9mZnNldCAvIDYwKSwgMikgK1xuICAgICAgICAgICAgICAgIHNlcGFyYXRvciArXG4gICAgICAgICAgICAgICAgemVyb0ZpbGwofn5vZmZzZXQgJSA2MCwgMilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9mZnNldCgnWicsICc6Jyk7XG4gICAgb2Zmc2V0KCdaWicsICcnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1onLCBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKSxcbiAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgcGFydHMsXG4gICAgICAgICAgICBtaW51dGVzO1xuXG4gICAgICAgIGlmIChtYXRjaGVzID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNodW5rID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdIHx8IFtdO1xuICAgICAgICBwYXJ0cyA9IChjaHVuayArICcnKS5tYXRjaChjaHVua09mZnNldCkgfHwgWyctJywgMCwgMF07XG4gICAgICAgIG1pbnV0ZXMgPSArKHBhcnRzWzFdICogNjApICsgdG9JbnQocGFydHNbMl0pO1xuXG4gICAgICAgIHJldHVybiBtaW51dGVzID09PSAwID8gMCA6IHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID1cbiAgICAgICAgICAgICAgICAoaXNNb21lbnQoaW5wdXQpIHx8IGlzRGF0ZShpbnB1dClcbiAgICAgICAgICAgICAgICAgICAgPyBpbnB1dC52YWx1ZU9mKClcbiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVMb2NhbChpbnB1dCkudmFsdWVPZigpKSAtIHJlcy52YWx1ZU9mKCk7XG4gICAgICAgICAgICAvLyBVc2UgbG93LWxldmVsIGFwaSwgYmVjYXVzZSB0aGlzIGZuIGlzIGxvdy1sZXZlbCBhcGkuXG4gICAgICAgICAgICByZXMuX2Quc2V0VGltZShyZXMuX2QudmFsdWVPZigpICsgZGlmZik7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQocmVzLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsKGlucHV0KS5sb2NhbCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0ZU9mZnNldChtKSB7XG4gICAgICAgIC8vIE9uIEZpcmVmb3guMjQgRGF0ZSNnZXRUaW1lem9uZU9mZnNldCByZXR1cm5zIGEgZmxvYXRpbmcgcG9pbnQuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tb21lbnQvbW9tZW50L3B1bGwvMTg3MVxuICAgICAgICByZXR1cm4gLU1hdGgucm91bmQobS5fZC5nZXRUaW1lem9uZU9mZnNldCgpKTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0KGlucHV0LCBrZWVwTG9jYWxUaW1lLCBrZWVwTWludXRlcykge1xuICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5fb2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICBsb2NhbEFkanVzdDtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoaW5wdXQpIDwgMTYgJiYgIWtlZXBNaW51dGVzKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQgPSBpbnB1dCAqIDYwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1VUQyAmJiBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxBZGp1c3QgPSBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fb2Zmc2V0ID0gaW5wdXQ7XG4gICAgICAgICAgICB0aGlzLl9pc1VUQyA9IHRydWU7XG4gICAgICAgICAgICBpZiAobG9jYWxBZGp1c3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKGxvY2FsQWRqdXN0LCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9mZnNldCAhPT0gaW5wdXQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWtlZXBMb2NhbFRpbWUgfHwgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcykge1xuICAgICAgICAgICAgICAgICAgICBhZGRTdWJ0cmFjdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEdXJhdGlvbihpbnB1dCAtIG9mZnNldCwgJ20nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyBvZmZzZXQgOiBnZXREYXRlT2Zmc2V0KHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0Wm9uZShpbnB1dCwga2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IC1pbnB1dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQoaW5wdXQsIGtlZXBMb2NhbFRpbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAtdGhpcy51dGNPZmZzZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvVVRDKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwoa2VlcExvY2FsVGltZSkge1xuICAgICAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnRyYWN0KGdldERhdGVPZmZzZXQodGhpcyksICdtJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQoKSB7XG4gICAgICAgIGlmICh0aGlzLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodGhpcy5fdHptLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2kgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YXIgdFpvbmUgPSBvZmZzZXRGcm9tU3RyaW5nKG1hdGNoT2Zmc2V0LCB0aGlzLl9pKTtcbiAgICAgICAgICAgIGlmICh0Wm9uZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51dGNPZmZzZXQodFpvbmUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXQgPSBpbnB1dCA/IGNyZWF0ZUxvY2FsKGlucHV0KS51dGNPZmZzZXQoKSA6IDA7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLnV0Y09mZnNldCgpIC0gaW5wdXQpICUgNjAgPT09IDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDApLnV0Y09mZnNldCgpIHx8XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgpID4gdGhpcy5jbG9uZSgpLm1vbnRoKDUpLnV0Y09mZnNldCgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYyA9IHt9LFxuICAgICAgICAgICAgb3RoZXI7XG5cbiAgICAgICAgY29weUNvbmZpZyhjLCB0aGlzKTtcbiAgICAgICAgYyA9IHByZXBhcmVDb25maWcoYyk7XG5cbiAgICAgICAgaWYgKGMuX2EpIHtcbiAgICAgICAgICAgIG90aGVyID0gYy5faXNVVEMgPyBjcmVhdGVVVEMoYy5fYSkgOiBjcmVhdGVMb2NhbChjLl9hKTtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiYgY29tcGFyZUFycmF5cyhjLl9hLCBvdGhlci50b0FycmF5KCkpID4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzRFNUU2hpZnRlZCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzRFNUU2hpZnRlZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xvY2FsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0YygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5faXNVVEMgJiYgdGhpcy5fb2Zmc2V0ID09PSAwIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQVNQLk5FVCBqc29uIGRhdGUgZm9ybWF0IHJlZ2V4XG4gICAgdmFyIGFzcE5ldFJlZ2V4ID0gL14oLXxcXCspPyg/OihcXGQqKVsuIF0pPyhcXGQrKTooXFxkKykoPzo6KFxcZCspKFxcLlxcZCopPyk/JC8sXG4gICAgICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgICAgIC8vIHNvbWV3aGF0IG1vcmUgaW4gbGluZSB3aXRoIDQuNC4zLjIgMjAwNCBzcGVjLCBidXQgYWxsb3dzIGRlY2ltYWwgYW55d2hlcmVcbiAgICAgICAgLy8gYW5kIGZ1cnRoZXIgbW9kaWZpZWQgdG8gYWxsb3cgZm9yIHN0cmluZ3MgY29udGFpbmluZyBib3RoIHdlZWsgYW5kIGRheVxuICAgICAgICBpc29SZWdleCA9IC9eKC18XFwrKT9QKD86KFstK10/WzAtOSwuXSopWSk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopVyk/KD86KFstK10/WzAtOSwuXSopRCk/KD86VCg/OihbLStdP1swLTksLl0qKUgpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVMpPyk/JC87XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEdXJhdGlvbihpbnB1dCwga2V5KSB7XG4gICAgICAgIHZhciBkdXJhdGlvbiA9IGlucHV0LFxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgYWdhaW5zdCByZWdleHAgaXMgZXhwZW5zaXZlLCBkbyBpdCBvbiBkZW1hbmRcbiAgICAgICAgICAgIG1hdGNoID0gbnVsbCxcbiAgICAgICAgICAgIHNpZ24sXG4gICAgICAgICAgICByZXQsXG4gICAgICAgICAgICBkaWZmUmVzO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgbXM6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZDogaW5wdXQuX2RheXMsXG4gICAgICAgICAgICAgICAgTTogaW5wdXQuX21vbnRocyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpIHx8ICFpc05hTigraW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSAraW5wdXQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uLm1pbGxpc2Vjb25kcyA9ICtpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICgobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSBtYXRjaFsxXSA9PT0gJy0nID8gLTEgOiAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSB7XG4gICAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgICBkOiB0b0ludChtYXRjaFtEQVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIGg6IHRvSW50KG1hdGNoW0hPVVJdKSAqIHNpZ24sXG4gICAgICAgICAgICAgICAgbTogdG9JbnQobWF0Y2hbTUlOVVRFXSkgKiBzaWduLFxuICAgICAgICAgICAgICAgIHM6IHRvSW50KG1hdGNoW1NFQ09ORF0pICogc2lnbixcbiAgICAgICAgICAgICAgICBtczogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiwgLy8gdGhlIG1pbGxpc2Vjb25kIGRlY2ltYWwgcG9pbnQgaXMgaW5jbHVkZWQgaW4gdGhlIG1hdGNoXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKChtYXRjaCA9IGlzb1JlZ2V4LmV4ZWMoaW5wdXQpKSkge1xuICAgICAgICAgICAgc2lnbiA9IG1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5OiBwYXJzZUlzbyhtYXRjaFsyXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgTTogcGFyc2VJc28obWF0Y2hbM10sIHNpZ24pLFxuICAgICAgICAgICAgICAgIHc6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkOiBwYXJzZUlzbyhtYXRjaFs1XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgaDogcGFyc2VJc28obWF0Y2hbNl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIG06IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzOiBwYXJzZUlzbyhtYXRjaFs4XSwgc2lnbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrcyBmb3IgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGR1cmF0aW9uID0ge307XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgZHVyYXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAoJ2Zyb20nIGluIGR1cmF0aW9uIHx8ICd0bycgaW4gZHVyYXRpb24pXG4gICAgICAgICkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLFxuICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKGR1cmF0aW9uLnRvKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZHVyYXRpb24gPSB7fTtcbiAgICAgICAgICAgIGR1cmF0aW9uLm1zID0gZGlmZlJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICBkdXJhdGlvbi5NID0gZGlmZlJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXQgPSBuZXcgRHVyYXRpb24oZHVyYXRpb24pO1xuXG4gICAgICAgIGlmIChpc0R1cmF0aW9uKGlucHV0KSAmJiBoYXNPd25Qcm9wKGlucHV0LCAnX2xvY2FsZScpKSB7XG4gICAgICAgICAgICByZXQuX2xvY2FsZSA9IGlucHV0Ll9sb2NhbGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNEdXJhdGlvbihpbnB1dCkgJiYgaGFzT3duUHJvcChpbnB1dCwgJ19pc1ZhbGlkJykpIHtcbiAgICAgICAgICAgIHJldC5faXNWYWxpZCA9IGlucHV0Ll9pc1ZhbGlkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjcmVhdGVEdXJhdGlvbi5mbiA9IER1cmF0aW9uLnByb3RvdHlwZTtcbiAgICBjcmVhdGVEdXJhdGlvbi5pbnZhbGlkID0gY3JlYXRlSW52YWxpZCQxO1xuXG4gICAgZnVuY3Rpb24gcGFyc2VJc28oaW5wLCBzaWduKSB7XG4gICAgICAgIC8vIFdlJ2Qgbm9ybWFsbHkgdXNlIH5+aW5wIGZvciB0aGlzLCBidXQgdW5mb3J0dW5hdGVseSBpdCBhbHNvXG4gICAgICAgIC8vIGNvbnZlcnRzIGZsb2F0cyB0byBpbnRzLlxuICAgICAgICAvLyBpbnAgbWF5IGJlIHVuZGVmaW5lZCwgc28gY2FyZWZ1bCBjYWxsaW5nIHJlcGxhY2Ugb24gaXQuXG4gICAgICAgIHZhciByZXMgPSBpbnAgJiYgcGFyc2VGbG9hdChpbnAucmVwbGFjZSgnLCcsICcuJykpO1xuICAgICAgICAvLyBhcHBseSBzaWduIHdoaWxlIHdlJ3JlIGF0IGl0XG4gICAgICAgIHJldHVybiAoaXNOYU4ocmVzKSA/IDAgOiByZXMpICogc2lnbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXMgPSB7fTtcblxuICAgICAgICByZXMubW9udGhzID1cbiAgICAgICAgICAgIG90aGVyLm1vbnRoKCkgLSBiYXNlLm1vbnRoKCkgKyAob3RoZXIueWVhcigpIC0gYmFzZS55ZWFyKCkpICogMTI7XG4gICAgICAgIGlmIChiYXNlLmNsb25lKCkuYWRkKHJlcy5tb250aHMsICdNJykuaXNBZnRlcihvdGhlcikpIHtcbiAgICAgICAgICAgIC0tcmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgIHJlcy5taWxsaXNlY29uZHMgPSArb3RoZXIgLSArYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpO1xuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcztcbiAgICAgICAgaWYgKCEoYmFzZS5pc1ZhbGlkKCkgJiYgb3RoZXIuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIG90aGVyID0gY2xvbmVXaXRoT2Zmc2V0KG90aGVyLCBiYXNlKTtcbiAgICAgICAgaWYgKGJhc2UuaXNCZWZvcmUob3RoZXIpKSB7XG4gICAgICAgICAgICByZXMgPSBwb3NpdGl2ZU1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2Uob3RoZXIsIGJhc2UpO1xuICAgICAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9IC1yZXMubWlsbGlzZWNvbmRzO1xuICAgICAgICAgICAgcmVzLm1vbnRocyA9IC1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvLyBUT0RPOiByZW1vdmUgJ25hbWUnIGFyZyBhZnRlciBkZXByZWNhdGlvbiBpcyByZW1vdmVkXG4gICAgZnVuY3Rpb24gY3JlYXRlQWRkZXIoZGlyZWN0aW9uLCBuYW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBwZXJpb2QpIHtcbiAgICAgICAgICAgIHZhciBkdXIsIHRtcDtcbiAgICAgICAgICAgIC8vaW52ZXJ0IHRoZSBhcmd1bWVudHMsIGJ1dCBjb21wbGFpbiBhYm91dCBpdFxuICAgICAgICAgICAgaWYgKHBlcmlvZCAhPT0gbnVsbCAmJiAhaXNOYU4oK3BlcmlvZCkpIHtcbiAgICAgICAgICAgICAgICBkZXByZWNhdGVTaW1wbGUoXG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICdtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyhudW1iZXIsIHBlcmlvZCkuICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1NlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0bXAgPSB2YWw7XG4gICAgICAgICAgICAgICAgdmFsID0gcGVyaW9kO1xuICAgICAgICAgICAgICAgIHBlcmlvZCA9IHRtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZHVyID0gY3JlYXRlRHVyYXRpb24odmFsLCBwZXJpb2QpO1xuICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgZHVyLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkU3VidHJhY3QobW9tLCBkdXJhdGlvbiwgaXNBZGRpbmcsIHVwZGF0ZU9mZnNldCkge1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gZHVyYXRpb24uX21pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgIGRheXMgPSBhYnNSb3VuZChkdXJhdGlvbi5fZGF5cyksXG4gICAgICAgICAgICBtb250aHMgPSBhYnNSb3VuZChkdXJhdGlvbi5fbW9udGhzKTtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGVPZmZzZXQgPSB1cGRhdGVPZmZzZXQgPT0gbnVsbCA/IHRydWUgOiB1cGRhdGVPZmZzZXQ7XG5cbiAgICAgICAgaWYgKG1vbnRocykge1xuICAgICAgICAgICAgc2V0TW9udGgobW9tLCBnZXQobW9tLCAnTW9udGgnKSArIG1vbnRocyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cykge1xuICAgICAgICAgICAgc2V0JDEobW9tLCAnRGF0ZScsIGdldChtb20sICdEYXRlJykgKyBkYXlzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIG1vbS5fZC5zZXRUaW1lKG1vbS5fZC52YWx1ZU9mKCkgKyBtaWxsaXNlY29uZHMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZU9mZnNldCkge1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KG1vbSwgZGF5cyB8fCBtb250aHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGFkZCA9IGNyZWF0ZUFkZGVyKDEsICdhZGQnKSxcbiAgICAgICAgc3VidHJhY3QgPSBjcmVhdGVBZGRlcigtMSwgJ3N1YnRyYWN0Jyk7XG5cbiAgICBmdW5jdGlvbiBpc1N0cmluZyhpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZztcbiAgICB9XG5cbiAgICAvLyB0eXBlIE1vbWVudElucHV0ID0gTW9tZW50IHwgRGF0ZSB8IHN0cmluZyB8IG51bWJlciB8IChudW1iZXIgfCBzdHJpbmcpW10gfCBNb21lbnRJbnB1dE9iamVjdCB8IHZvaWQ7IC8vIG51bGwgfCB1bmRlZmluZWRcbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0KGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc01vbWVudChpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzRGF0ZShpbnB1dCkgfHxcbiAgICAgICAgICAgIGlzU3RyaW5nKGlucHV0KSB8fFxuICAgICAgICAgICAgaXNOdW1iZXIoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc051bWJlck9yU3RyaW5nQXJyYXkoaW5wdXQpIHx8XG4gICAgICAgICAgICBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB8fFxuICAgICAgICAgICAgaW5wdXQgPT09IG51bGwgfHxcbiAgICAgICAgICAgIGlucHV0ID09PSB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudElucHV0T2JqZWN0KGlucHV0KSB7XG4gICAgICAgIHZhciBvYmplY3RUZXN0ID0gaXNPYmplY3QoaW5wdXQpICYmICFpc09iamVjdEVtcHR5KGlucHV0KSxcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICAgICAneWVhcnMnLFxuICAgICAgICAgICAgICAgICd5ZWFyJyxcbiAgICAgICAgICAgICAgICAneScsXG4gICAgICAgICAgICAgICAgJ21vbnRocycsXG4gICAgICAgICAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgICAgICAgICAnTScsXG4gICAgICAgICAgICAgICAgJ2RheXMnLFxuICAgICAgICAgICAgICAgICdkYXknLFxuICAgICAgICAgICAgICAgICdkJyxcbiAgICAgICAgICAgICAgICAnZGF0ZXMnLFxuICAgICAgICAgICAgICAgICdkYXRlJyxcbiAgICAgICAgICAgICAgICAnRCcsXG4gICAgICAgICAgICAgICAgJ2hvdXJzJyxcbiAgICAgICAgICAgICAgICAnaG91cicsXG4gICAgICAgICAgICAgICAgJ2gnLFxuICAgICAgICAgICAgICAgICdtaW51dGVzJyxcbiAgICAgICAgICAgICAgICAnbWludXRlJyxcbiAgICAgICAgICAgICAgICAnbScsXG4gICAgICAgICAgICAgICAgJ3NlY29uZHMnLFxuICAgICAgICAgICAgICAgICdzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmRzJyxcbiAgICAgICAgICAgICAgICAnbWlsbGlzZWNvbmQnLFxuICAgICAgICAgICAgICAgICdtcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIHByb3BlcnR5O1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wZXJ0aWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07XG4gICAgICAgICAgICBwcm9wZXJ0eVRlc3QgPSBwcm9wZXJ0eVRlc3QgfHwgaGFzT3duUHJvcChpbnB1dCwgcHJvcGVydHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9iamVjdFRlc3QgJiYgcHJvcGVydHlUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTnVtYmVyT3JTdHJpbmdBcnJheShpbnB1dCkge1xuICAgICAgICB2YXIgYXJyYXlUZXN0ID0gaXNBcnJheShpbnB1dCksXG4gICAgICAgICAgICBkYXRhVHlwZVRlc3QgPSBmYWxzZTtcbiAgICAgICAgaWYgKGFycmF5VGVzdCkge1xuICAgICAgICAgICAgZGF0YVR5cGVUZXN0ID1cbiAgICAgICAgICAgICAgICBpbnB1dC5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc051bWJlcihpdGVtKSAmJiBpc1N0cmluZyhpbnB1dCk7XG4gICAgICAgICAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheVRlc3QgJiYgZGF0YVR5cGVUZXN0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQ2FsZW5kYXJTcGVjKGlucHV0KSB7XG4gICAgICAgIHZhciBvYmplY3RUZXN0ID0gaXNPYmplY3QoaW5wdXQpICYmICFpc09iamVjdEVtcHR5KGlucHV0KSxcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IGZhbHNlLFxuICAgICAgICAgICAgcHJvcGVydGllcyA9IFtcbiAgICAgICAgICAgICAgICAnc2FtZURheScsXG4gICAgICAgICAgICAgICAgJ25leHREYXknLFxuICAgICAgICAgICAgICAgICdsYXN0RGF5JyxcbiAgICAgICAgICAgICAgICAnbmV4dFdlZWsnLFxuICAgICAgICAgICAgICAgICdsYXN0V2VlaycsXG4gICAgICAgICAgICAgICAgJ3NhbWVFbHNlJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgcHJvcGVydHk7XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gcHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgIHByb3BlcnR5VGVzdCA9IHByb3BlcnR5VGVzdCB8fCBoYXNPd25Qcm9wKGlucHV0LCBwcm9wZXJ0eSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2JqZWN0VGVzdCAmJiBwcm9wZXJ0eVRlc3Q7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgICAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgICAgICByZXR1cm4gZGlmZiA8IC02XG4gICAgICAgICAgICA/ICdzYW1lRWxzZSdcbiAgICAgICAgICAgIDogZGlmZiA8IC0xXG4gICAgICAgICAgICA/ICdsYXN0V2VlaydcbiAgICAgICAgICAgIDogZGlmZiA8IDBcbiAgICAgICAgICAgID8gJ2xhc3REYXknXG4gICAgICAgICAgICA6IGRpZmYgPCAxXG4gICAgICAgICAgICA/ICdzYW1lRGF5J1xuICAgICAgICAgICAgOiBkaWZmIDwgMlxuICAgICAgICAgICAgPyAnbmV4dERheSdcbiAgICAgICAgICAgIDogZGlmZiA8IDdcbiAgICAgICAgICAgID8gJ25leHRXZWVrJ1xuICAgICAgICAgICAgOiAnc2FtZUVsc2UnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhbGVuZGFyJDEodGltZSwgZm9ybWF0cykge1xuICAgICAgICAvLyBTdXBwb3J0IGZvciBzaW5nbGUgcGFyYW1ldGVyLCBmb3JtYXRzIG9ubHkgb3ZlcmxvYWQgdG8gdGhlIGNhbGVuZGFyIGZ1bmN0aW9uXG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAoIWFyZ3VtZW50c1swXSkge1xuICAgICAgICAgICAgICAgIHRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNNb21lbnRJbnB1dChhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdGltZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICBmb3JtYXRzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NhbGVuZGFyU3BlYyhhcmd1bWVudHNbMF0pKSB7XG4gICAgICAgICAgICAgICAgZm9ybWF0cyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICB0aW1lID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgICAgIC8vIEdldHRpbmcgc3RhcnQtb2YtdG9kYXkgZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGxvY2FsL3V0Yy9vZmZzZXQgb3Igbm90LlxuICAgICAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICBmb3JtYXQgPSBob29rcy5jYWxlbmRhckZvcm1hdCh0aGlzLCBzb2QpIHx8ICdzYW1lRWxzZScsXG4gICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgIGZvcm1hdHMgJiZcbiAgICAgICAgICAgICAgICAoaXNGdW5jdGlvbihmb3JtYXRzW2Zvcm1hdF0pXG4gICAgICAgICAgICAgICAgICAgID8gZm9ybWF0c1tmb3JtYXRdLmNhbGwodGhpcywgbm93KVxuICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdHNbZm9ybWF0XSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KFxuICAgICAgICAgICAgb3V0cHV0IHx8IHRoaXMubG9jYWxlRGF0YSgpLmNhbGVuZGFyKGZvcm1hdCwgdGhpcywgY3JlYXRlTG9jYWwobm93KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBNb21lbnQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNBZnRlcihpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JlZm9yZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKSA8IGxvY2FsSW5wdXQudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNCZXR3ZWVuKGZyb20sIHRvLCB1bml0cywgaW5jbHVzaXZpdHkpIHtcbiAgICAgICAgdmFyIGxvY2FsRnJvbSA9IGlzTW9tZW50KGZyb20pID8gZnJvbSA6IGNyZWF0ZUxvY2FsKGZyb20pLFxuICAgICAgICAgICAgbG9jYWxUbyA9IGlzTW9tZW50KHRvKSA/IHRvIDogY3JlYXRlTG9jYWwodG8pO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbEZyb20uaXNWYWxpZCgpICYmIGxvY2FsVG8uaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGluY2x1c2l2aXR5ID0gaW5jbHVzaXZpdHkgfHwgJygpJztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVswXSA9PT0gJygnXG4gICAgICAgICAgICAgICAgPyB0aGlzLmlzQWZ0ZXIobG9jYWxGcm9tLCB1bml0cylcbiAgICAgICAgICAgICAgICA6ICF0aGlzLmlzQmVmb3JlKGxvY2FsRnJvbSwgdW5pdHMpKSAmJlxuICAgICAgICAgICAgKGluY2x1c2l2aXR5WzFdID09PSAnKSdcbiAgICAgICAgICAgICAgICA/IHRoaXMuaXNCZWZvcmUobG9jYWxUbywgdW5pdHMpXG4gICAgICAgICAgICAgICAgOiAhdGhpcy5pc0FmdGVyKGxvY2FsVG8sIHVuaXRzKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWUoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCksXG4gICAgICAgICAgICBpbnB1dE1zO1xuICAgICAgICBpZiAoISh0aGlzLmlzVmFsaWQoKSAmJiBsb2NhbElucHV0LmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKSB8fCAnbWlsbGlzZWNvbmQnO1xuICAgICAgICBpZiAodW5pdHMgPT09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlT2YoKSA9PT0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dE1zID0gbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCkgPD0gaW5wdXRNcyAmJlxuICAgICAgICAgICAgICAgIGlucHV0TXMgPD0gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckFmdGVyKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbWUoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQWZ0ZXIoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZShpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTYW1lKGlucHV0LCB1bml0cykgfHwgdGhpcy5pc0JlZm9yZShpbnB1dCwgdW5pdHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpZmYoaW5wdXQsIHVuaXRzLCBhc0Zsb2F0KSB7XG4gICAgICAgIHZhciB0aGF0LCB6b25lRGVsdGEsIG91dHB1dDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhhdCA9IGNsb25lV2l0aE9mZnNldChpbnB1dCwgdGhpcyk7XG5cbiAgICAgICAgaWYgKCF0aGF0LmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHpvbmVEZWx0YSA9ICh0aGF0LnV0Y09mZnNldCgpIC0gdGhpcy51dGNPZmZzZXQoKSkgKiA2ZTQ7XG5cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG5cbiAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMTI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICAgICAgb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDFlMztcbiAgICAgICAgICAgICAgICBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gNmU0O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyAxMDAwICogNjAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA2MDQ4ZTU7XG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQgKiA3LCBuZWdhdGUgZHN0XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZihhLCBiKSB7XG4gICAgICAgIGlmIChhLmRhdGUoKSA8IGIuZGF0ZSgpKSB7XG4gICAgICAgICAgICAvLyBlbmQtb2YtbW9udGggY2FsY3VsYXRpb25zIHdvcmsgY29ycmVjdCB3aGVuIHRoZSBzdGFydCBtb250aCBoYXMgbW9yZVxuICAgICAgICAgICAgLy8gZGF5cyB0aGFuIHRoZSBlbmQgbW9udGguXG4gICAgICAgICAgICByZXR1cm4gLW1vbnRoRGlmZihiLCBhKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2YXIgd2hvbGVNb250aERpZmYgPSAoYi55ZWFyKCkgLSBhLnllYXIoKSkgKiAxMiArIChiLm1vbnRoKCkgLSBhLm1vbnRoKCkpLFxuICAgICAgICAgICAgLy8gYiBpcyBpbiAoYW5jaG9yIC0gMSBtb250aCwgYW5jaG9yICsgMSBtb250aClcbiAgICAgICAgICAgIGFuY2hvciA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYsICdtb250aHMnKSxcbiAgICAgICAgICAgIGFuY2hvcjIsXG4gICAgICAgICAgICBhZGp1c3Q7XG5cbiAgICAgICAgaWYgKGIgLSBhbmNob3IgPCAwKSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiAtIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yIC0gYW5jaG9yMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhbmNob3IyID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiArIDEsICdtb250aHMnKTtcbiAgICAgICAgICAgIC8vIGxpbmVhciBhY3Jvc3MgdGhlIG1vbnRoXG4gICAgICAgICAgICBhZGp1c3QgPSAoYiAtIGFuY2hvcikgLyAoYW5jaG9yMiAtIGFuY2hvcik7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NoZWNrIGZvciBuZWdhdGl2ZSB6ZXJvLCByZXR1cm4gemVybyBpZiBuZWdhdGl2ZSB6ZXJvXG4gICAgICAgIHJldHVybiAtKHdob2xlTW9udGhEaWZmICsgYWRqdXN0KSB8fCAwO1xuICAgIH1cblxuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXQgPSAnWVlZWS1NTS1ERFRISDptbTpzc1onO1xuICAgIGhvb2tzLmRlZmF1bHRGb3JtYXRVdGMgPSAnWVlZWS1NTS1ERFRISDptbTpzc1taXSc7XG5cbiAgICBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5sb2NhbGUoJ2VuJykuZm9ybWF0KCdkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWicpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nKGtlZXBPZmZzZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHV0YyA9IGtlZXBPZmZzZXQgIT09IHRydWUsXG4gICAgICAgICAgICBtID0gdXRjID8gdGhpcy5jbG9uZSgpLnV0YygpIDogdGhpcztcbiAgICAgICAgaWYgKG0ueWVhcigpIDwgMCB8fCBtLnllYXIoKSA+IDk5OTkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRNb21lbnQoXG4gICAgICAgICAgICAgICAgbSxcbiAgICAgICAgICAgICAgICB1dGNcbiAgICAgICAgICAgICAgICAgICAgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJ1xuICAgICAgICAgICAgICAgICAgICA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgICAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICAgICAgICBpZiAodXRjKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpICsgdGhpcy51dGNPZmZzZXQoKSAqIDYwICogMTAwMClcbiAgICAgICAgICAgICAgICAgICAgLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1onLCBmb3JtYXRNb21lbnQobSwgJ1onKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChcbiAgICAgICAgICAgIG0sXG4gICAgICAgICAgICB1dGMgPyAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScgOiAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1onXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBtb21lbnQgdGhhdCBjYW5cbiAgICAgKiBhbHNvIGJlIGV2YWx1YXRlZCB0byBnZXQgYSBuZXcgbW9tZW50IHdoaWNoIGlzIHRoZSBzYW1lXG4gICAgICpcbiAgICAgKiBAbGluayBodHRwczovL25vZGVqcy5vcmcvZGlzdC9sYXRlc3QvZG9jcy9hcGkvdXRpbC5odG1sI3V0aWxfY3VzdG9tX2luc3BlY3RfZnVuY3Rpb25fb25fb2JqZWN0c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc3BlY3QoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnbW9tZW50LmludmFsaWQoLyogJyArIHRoaXMuX2kgKyAnICovKSc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGZ1bmMgPSAnbW9tZW50JyxcbiAgICAgICAgICAgIHpvbmUgPSAnJyxcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHllYXIsXG4gICAgICAgICAgICBkYXRldGltZSxcbiAgICAgICAgICAgIHN1ZmZpeDtcbiAgICAgICAgaWYgKCF0aGlzLmlzTG9jYWwoKSkge1xuICAgICAgICAgICAgZnVuYyA9IHRoaXMudXRjT2Zmc2V0KCkgPT09IDAgPyAnbW9tZW50LnV0YycgOiAnbW9tZW50LnBhcnNlWm9uZSc7XG4gICAgICAgICAgICB6b25lID0gJ1onO1xuICAgICAgICB9XG4gICAgICAgIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHllYXIgPSAwIDw9IHRoaXMueWVhcigpICYmIHRoaXMueWVhcigpIDw9IDk5OTkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgZGF0ZXRpbWUgPSAnLU1NLUREW1RdSEg6bW06c3MuU1NTJztcbiAgICAgICAgc3VmZml4ID0gem9uZSArICdbXCIpXSc7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KHByZWZpeCArIHllYXIgKyBkYXRldGltZSArIHN1ZmZpeCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm9ybWF0KGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpXG4gICAgICAgICAgICAgICAgPyBob29rcy5kZWZhdWx0Rm9ybWF0VXRjXG4gICAgICAgICAgICAgICAgOiBob29rcy5kZWZhdWx0Rm9ybWF0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBvdXRwdXQgPSBmb3JtYXRNb21lbnQodGhpcywgaW5wdXRTdHJpbmcpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb20odGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgKChpc01vbWVudCh0aW1lKSAmJiB0aW1lLmlzVmFsaWQoKSkgfHwgY3JlYXRlTG9jYWwodGltZSkuaXNWYWxpZCgpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7IHRvOiB0aGlzLCBmcm9tOiB0aW1lIH0pXG4gICAgICAgICAgICAgICAgLmxvY2FsZSh0aGlzLmxvY2FsZSgpKVxuICAgICAgICAgICAgICAgIC5odW1hbml6ZSghd2l0aG91dFN1ZmZpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZyb21Ob3cod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvKHRpbWUsIHdpdGhvdXRTdWZmaXgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8IGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oeyBmcm9tOiB0aGlzLCB0bzogdGltZSB9KVxuICAgICAgICAgICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgICAgICAgICAuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyh3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIC8vIElmIHBhc3NlZCBhIGxvY2FsZSBrZXksIGl0IHdpbGwgc2V0IHRoZSBsb2NhbGUgZm9yIHRoaXNcbiAgICAvLyBpbnN0YW5jZS4gIE90aGVyd2lzZSwgaXQgd2lsbCByZXR1cm4gdGhlIGxvY2FsZSBjb25maWd1cmF0aW9uXG4gICAgLy8gdmFyaWFibGVzIGZvciB0aGlzIGluc3RhbmNlLlxuICAgIGZ1bmN0aW9uIGxvY2FsZShrZXkpIHtcbiAgICAgICAgdmFyIG5ld0xvY2FsZURhdGE7XG5cbiAgICAgICAgaWYgKGtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlLl9hYmJyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3TG9jYWxlRGF0YSA9IGdldExvY2FsZShrZXkpO1xuICAgICAgICAgICAgaWYgKG5ld0xvY2FsZURhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IG5ld0xvY2FsZURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYW5nID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy4nLFxuICAgICAgICBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgdmFyIE1TX1BFUl9TRUNPTkQgPSAxMDAwLFxuICAgICAgICBNU19QRVJfTUlOVVRFID0gNjAgKiBNU19QRVJfU0VDT05ELFxuICAgICAgICBNU19QRVJfSE9VUiA9IDYwICogTVNfUEVSX01JTlVURSxcbiAgICAgICAgTVNfUEVSXzQwMF9ZRUFSUyA9ICgzNjUgKiA0MDAgKyA5NykgKiAyNCAqIE1TX1BFUl9IT1VSO1xuXG4gICAgLy8gYWN0dWFsIG1vZHVsbyAtIGhhbmRsZXMgbmVnYXRpdmUgbnVtYmVycyAoZm9yIGRhdGVzIGJlZm9yZSAxOTcwKTpcbiAgICBmdW5jdGlvbiBtb2QkMShkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgICByZXR1cm4gKChkaXZpZGVuZCAlIGRpdmlzb3IpICsgZGl2aXNvcikgJSBkaXZpc29yO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyB0aGUgZGF0ZSBjb25zdHJ1Y3RvciByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5LCBtLCBkKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1dGNTdGFydE9mRGF0ZSh5LCBtLCBkKSB7XG4gICAgICAgIC8vIERhdGUuVVRDIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5VVEMoeSArIDQwMCwgbSwgZCkgLSBNU19QRVJfNDAwX1lFQVJTO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHksIG0sIGQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RhcnRPZih1bml0cykge1xuICAgICAgICB2YXIgdGltZSwgc3RhcnRPZkRhdGU7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJyB8fCAhdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIDAsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpIC0gKHRoaXMubW9udGgoKSAlIDMpLFxuICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZSgpIC0gdGhpcy53ZWVrZGF5KClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaXNvV2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEoXG4gICAgICAgICAgICAgICAgICAgIHRpbWUgKyAodGhpcy5faXNVVEMgPyAwIDogdGhpcy51dGNPZmZzZXQoKSAqIE1TX1BFUl9NSU5VVEUpLFxuICAgICAgICAgICAgICAgICAgICBNU19QRVJfSE9VUlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9NSU5VVEUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gdGhpcy5fZC52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgdGltZSAtPSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Quc2V0VGltZSh0aW1lKTtcbiAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHRoaXMsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlbmRPZih1bml0cykge1xuICAgICAgICB2YXIgdGltZSwgc3RhcnRPZkRhdGU7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICBpZiAodW5pdHMgPT09IHVuZGVmaW5lZCB8fCB1bml0cyA9PT0gJ21pbGxpc2Vjb25kJyB8fCAhdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCkgKyAxLCAwLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID1cbiAgICAgICAgICAgICAgICAgICAgc3RhcnRPZkRhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnllYXIoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9udGgoKSAtICh0aGlzLm1vbnRoKCkgJSAzKSArIDMsXG4gICAgICAgICAgICAgICAgICAgICAgICAxXG4gICAgICAgICAgICAgICAgICAgICkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpICsgMSwgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgICAgICAgICAgdGltZSA9XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0T2ZEYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vbnRoKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpICsgN1xuICAgICAgICAgICAgICAgICAgICApIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPVxuICAgICAgICAgICAgICAgICAgICBzdGFydE9mRGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWVhcigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlKCkgLSAodGhpcy5pc29XZWVrZGF5KCkgLSAxKSArIDdcbiAgICAgICAgICAgICAgICAgICAgKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpICsgMSkgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgKz1cbiAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVIgLVxuICAgICAgICAgICAgICAgICAgICBtb2QkMShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgKyAodGhpcy5faXNVVEMgPyAwIDogdGhpcy51dGNPZmZzZXQoKSAqIE1TX1BFUl9NSU5VVEUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgTVNfUEVSX0hPVVJcbiAgICAgICAgICAgICAgICAgICAgKSAtXG4gICAgICAgICAgICAgICAgICAgIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9NSU5VVEUgLSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9TRUNPTkQgLSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVPZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2QudmFsdWVPZigpIC0gKHRoaXMuX29mZnNldCB8fCAwKSAqIDYwMDAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXgoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMudmFsdWVPZigpIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9EYXRlKCkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy52YWx1ZU9mKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIG0ueWVhcigpLFxuICAgICAgICAgICAgbS5tb250aCgpLFxuICAgICAgICAgICAgbS5kYXRlKCksXG4gICAgICAgICAgICBtLmhvdXIoKSxcbiAgICAgICAgICAgIG0ubWludXRlKCksXG4gICAgICAgICAgICBtLnNlY29uZCgpLFxuICAgICAgICAgICAgbS5taWxsaXNlY29uZCgpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvT2JqZWN0KCkge1xuICAgICAgICB2YXIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogbS55ZWFyKCksXG4gICAgICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICAgICAgaG91cnM6IG0uaG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IG0ubWlsbGlzZWNvbmRzKCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9KU09OKCkge1xuICAgICAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQyKCkge1xuICAgICAgICByZXR1cm4gaXNWYWxpZCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzaW5nRmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiBleHRlbmQoe30sIGdldFBhcnNpbmdGbGFncyh0aGlzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW52YWxpZEF0KCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLl9pLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgICAgICBpc1VUQzogdGhpcy5faXNVVEMsXG4gICAgICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBhZGRGb3JtYXRUb2tlbignTicsIDAsIDAsICdlcmFBYmJyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OJywgMCwgMCwgJ2VyYUFiYnInKTtcbiAgICBhZGRGb3JtYXRUb2tlbignTk5OTicsIDAsIDAsICdlcmFOYW1lJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ05OTk5OJywgMCwgMCwgJ2VyYU5hcnJvdycpO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3knLCAxXSwgJ3lvJywgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXknLCAyXSwgMCwgJ2VyYVllYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneScsIFsneXl5JywgM10sIDAsICdlcmFZZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oJ3knLCBbJ3l5eXknLCA0XSwgMCwgJ2VyYVllYXInKTtcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ04nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OJywgbWF0Y2hFcmFBYmJyKTtcbiAgICBhZGRSZWdleFRva2VuKCdOTk4nLCBtYXRjaEVyYUFiYnIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTk4nLCBtYXRjaEVyYU5hbWUpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ05OTk5OJywgbWF0Y2hFcmFOYXJyb3cpO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ04nLCAnTk4nLCAnTk5OJywgJ05OTk4nLCAnTk5OTk4nXSwgZnVuY3Rpb24gKFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgYXJyYXksXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdG9rZW5cbiAgICApIHtcbiAgICAgICAgdmFyIGVyYSA9IGNvbmZpZy5fbG9jYWxlLmVyYXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgaWYgKGVyYSkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuZXJhID0gZXJhO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEVyYSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRSZWdleFRva2VuKCd5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXknLCBtYXRjaFVuc2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCd5eXl5JywgbWF0Y2hVbnNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbigneW8nLCBtYXRjaEVyYVllYXJPcmRpbmFsKTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWyd5JywgJ3l5JywgJ3l5eScsICd5eXl5J10sIFlFQVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWyd5byddLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciBtYXRjaDtcbiAgICAgICAgaWYgKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KSB7XG4gICAgICAgICAgICBtYXRjaCA9IGlucHV0Lm1hdGNoKGNvbmZpZy5fbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX2xvY2FsZS5lcmFZZWFyT3JkaW5hbFBhcnNlKSB7XG4gICAgICAgICAgICBhcnJheVtZRUFSXSA9IGNvbmZpZy5fbG9jYWxlLmVyYVllYXJPcmRpbmFsUGFyc2UoaW5wdXQsIG1hdGNoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhcyhtLCBmb3JtYXQpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGF0ZSxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLl9lcmFzIHx8IGdldExvY2FsZSgnZW4nKS5fZXJhcztcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgICAgICAgICBkYXRlID0gaG9va3MoZXJhc1tpXS5zaW5jZSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0uc2luY2UgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodHlwZW9mIGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLnVudGlsID0gK0luZmluaXR5O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICAgICAgICAgIGRhdGUgPSBob29rcyhlcmFzW2ldLnVudGlsKS5zdGFydE9mKCdkYXknKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgICAgICAgIGVyYXNbaV0udW50aWwgPSBkYXRlLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVyYXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlRXJhc1BhcnNlKGVyYU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmVyYXMoKSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBhYmJyLFxuICAgICAgICAgICAgbmFycm93O1xuICAgICAgICBlcmFOYW1lID0gZXJhTmFtZS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbmFtZSA9IGVyYXNbaV0ubmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgYWJiciA9IGVyYXNbaV0uYWJici50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgbmFycm93ID0gZXJhc1tpXS5uYXJyb3cudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ04nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdOTic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ05OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWJiciA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTic6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTk5OTk4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hcnJvdyA9PT0gZXJhTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChbbmFtZSwgYWJiciwgbmFycm93XS5pbmRleE9mKGVyYU5hbWUpID49IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUVyYXNDb252ZXJ0WWVhcihlcmEsIHllYXIpIHtcbiAgICAgICAgdmFyIGRpciA9IGVyYS5zaW5jZSA8PSBlcmEudW50aWwgPyArMSA6IC0xO1xuICAgICAgICBpZiAoeWVhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaG9va3MoZXJhLnNpbmNlKS55ZWFyKCkgKyAoeWVhciAtIGVyYS5vZmZzZXQpICogZGlyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhTmFtZSgpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoZXJhc1tpXS5zaW5jZSA8PSB2YWwgJiYgdmFsIDw9IGVyYXNbaV0udW50aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJhc1tpXS5uYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRFcmFOYXJyb3coKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVyYXNbaV0udW50aWwgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnNpbmNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0ubmFycm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEVyYUFiYnIoKSB7XG4gICAgICAgIHZhciBpLFxuICAgICAgICAgICAgbCxcbiAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgIGVyYXMgPSB0aGlzLmxvY2FsZURhdGEoKS5lcmFzKCk7XG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgLy8gdHJ1bmNhdGUgdGltZVxuICAgICAgICAgICAgdmFsID0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpLnZhbHVlT2YoKTtcblxuICAgICAgICAgICAgaWYgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVyYXNbaV0uYWJicjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlcmFzW2ldLmFiYnI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXJhWWVhcigpIHtcbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZGlyLFxuICAgICAgICAgICAgdmFsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMubG9jYWxlRGF0YSgpLmVyYXMoKTtcbiAgICAgICAgZm9yIChpID0gMCwgbCA9IGVyYXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgICAgICBkaXIgPSBlcmFzW2ldLnNpbmNlIDw9IGVyYXNbaV0udW50aWwgPyArMSA6IC0xO1xuXG4gICAgICAgICAgICAvLyB0cnVuY2F0ZSB0aW1lXG4gICAgICAgICAgICB2YWwgPSB0aGlzLmNsb25lKCkuc3RhcnRPZignZGF5JykudmFsdWVPZigpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKGVyYXNbaV0uc2luY2UgPD0gdmFsICYmIHZhbCA8PSBlcmFzW2ldLnVudGlsKSB8fFxuICAgICAgICAgICAgICAgIChlcmFzW2ldLnVudGlsIDw9IHZhbCAmJiB2YWwgPD0gZXJhc1tpXS5zaW5jZSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLnllYXIoKSAtIGhvb2tzKGVyYXNbaV0uc2luY2UpLnllYXIoKSkgKiBkaXIgK1xuICAgICAgICAgICAgICAgICAgICBlcmFzW2ldLm9mZnNldFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJhc05hbWVSZWdleChpc1N0cmljdCkge1xuICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ19lcmFzTmFtZVJlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFtZVJlZ2V4IDogdGhpcy5fZXJhc1JlZ2V4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVyYXNBYmJyUmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc0FiYnJSZWdleCcpKSB7XG4gICAgICAgICAgICBjb21wdXRlRXJhc1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID8gdGhpcy5fZXJhc0FiYnJSZWdleCA6IHRoaXMuX2VyYXNSZWdleDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBlcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfZXJhc05hcnJvd1JlZ2V4JykpIHtcbiAgICAgICAgICAgIGNvbXB1dGVFcmFzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNTdHJpY3QgPyB0aGlzLl9lcmFzTmFycm93UmVnZXggOiB0aGlzLl9lcmFzUmVnZXg7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hFcmFBYmJyKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzQWJiclJlZ2V4KGlzU3RyaWN0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXRjaEVyYU5hbWUoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLmVyYXNOYW1lUmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhTmFycm93KGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5lcmFzTmFycm93UmVnZXgoaXNTdHJpY3QpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hdGNoRXJhWWVhck9yZGluYWwoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLl9lcmFZZWFyT3JkaW5hbFJlZ2V4IHx8IG1hdGNoVW5zaWduZWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZUVyYXNQYXJzZSgpIHtcbiAgICAgICAgdmFyIGFiYnJQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hbWVQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIG5hcnJvd1BpZWNlcyA9IFtdLFxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgZXJhcyA9IHRoaXMuZXJhcygpO1xuXG4gICAgICAgIGZvciAoaSA9IDAsIGwgPSBlcmFzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICAgICAgbmFtZVBpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFtZSkpO1xuICAgICAgICAgICAgYWJiclBpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0uYWJicikpO1xuICAgICAgICAgICAgbmFycm93UGllY2VzLnB1c2gocmVnZXhFc2NhcGUoZXJhc1tpXS5uYXJyb3cpKTtcblxuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChyZWdleEVzY2FwZShlcmFzW2ldLm5hbWUpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2gocmVnZXhFc2NhcGUoZXJhc1tpXS5hYmJyKSk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKHJlZ2V4RXNjYXBlKGVyYXNbaV0ubmFycm93KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9lcmFzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX2VyYXNOYW1lUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBuYW1lUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fZXJhc0FiYnJSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGFiYnJQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl9lcmFzTmFycm93UmVnZXggPSBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgJ14oJyArIG5hcnJvd1BpZWNlcy5qb2luKCd8JykgKyAnKScsXG4gICAgICAgICAgICAnaSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ2dnJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vla1llYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnR0cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1llYXJGb3JtYXRUb2tlbih0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignZ2dnZ2cnLCAnd2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHJywgJ2lzb1dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHR0cnLCAnaXNvV2Vla1llYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnd2Vla1llYXInLCAnZ2cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtZZWFyJywgJ0dHJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrWWVhcicsIDEpO1xuICAgIGFkZFVuaXRQcmlvcml0eSgnaXNvV2Vla1llYXInLCAxKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0cnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsIG1hdGNoU2lnbmVkKTtcbiAgICBhZGRSZWdleFRva2VuKCdHRycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHJywgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHR0cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCBtYXRjaDF0bzYsIG1hdGNoNik7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2dnZ2cnLCAnZ2dnZ2cnLCAnR0dHRycsICdHR0dHRyddLCBmdW5jdGlvbiAoXG4gICAgICAgIGlucHV0LFxuICAgICAgICB3ZWVrLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIHRva2VuXG4gICAgKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2cnLCAnR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB0aGlzLndlZWsoKSxcbiAgICAgICAgICAgIHRoaXMud2Vla2RheSgpLFxuICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG95XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2Vla1llYXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGdldFNldFdlZWtZZWFySGVscGVyLmNhbGwoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICB0aGlzLmlzb1dlZWsoKSxcbiAgICAgICAgICAgIHRoaXMuaXNvV2Vla2RheSgpLFxuICAgICAgICAgICAgMSxcbiAgICAgICAgICAgIDRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luWWVhcigpIHtcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCAxLCA0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRJU09XZWVrc0luSVNPV2Vla1llYXIoKSB7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLmlzb1dlZWtZZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMueWVhcigpLCB3ZWVrSW5mby5kb3csIHdlZWtJbmZvLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0V2Vla3NJbldlZWtZZWFyKCkge1xuICAgICAgICB2YXIgd2Vla0luZm8gPSB0aGlzLmxvY2FsZURhdGEoKS5fd2VlaztcbiAgICAgICAgcmV0dXJuIHdlZWtzSW5ZZWFyKHRoaXMud2Vla1llYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgd2Vla3NUYXJnZXQ7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB3ZWVrID0gd2Vla3NUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyRGF0YSA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICAgICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgIHRoaXMubW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdxdWFydGVyJywgJ1EnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3F1YXJ0ZXInLCA3KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsXG4gICAgICAgICAgICA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKVxuICAgICAgICAgICAgOiB0aGlzLm1vbnRoKChpbnB1dCAtIDEpICogMyArICh0aGlzLm1vbnRoKCkgJSAzKSk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RhdGUnLCAnRCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RhdGUnLCA5KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0QnLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0REJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICByZXR1cm4gaXNTdHJpY3RcbiAgICAgICAgICAgID8gbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIHx8IGxvY2FsZS5fb3JkaW5hbFBhcnNlXG4gICAgICAgICAgICA6IGxvY2FsZS5fZGF5T2ZNb250aE9yZGluYWxQYXJzZUxlbmllbnQ7XG4gICAgfSk7XG5cbiAgICBhZGRQYXJzZVRva2VuKFsnRCcsICdERCddLCBEQVRFKTtcbiAgICBhZGRQYXJzZVRva2VuKCdEbycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbREFURV0gPSB0b0ludChpbnB1dC5tYXRjaChtYXRjaDF0bzIpWzBdKTtcbiAgICB9KTtcblxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXREYXlPZk1vbnRoID0gbWFrZUdldFNldCgnRGF0ZScsIHRydWUpO1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0RERCcsIFsnRERERCcsIDNdLCAnREREbycsICdkYXlPZlllYXInKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnZGF5T2ZZZWFyJywgJ0RERCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheU9mWWVhcicsIDQpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignREREJywgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyKGlucHV0KSB7XG4gICAgICAgIHZhciBkYXlPZlllYXIgPVxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNVxuICAgICAgICAgICAgKSArIDE7XG4gICAgICAgIHJldHVybiBpbnB1dCA9PSBudWxsID8gZGF5T2ZZZWFyIDogdGhpcy5hZGQoaW5wdXQgLSBkYXlPZlllYXIsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWludXRlJywgJ20nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbnV0ZScsIDE0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ21tJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydtJywgJ21tJ10sIE1JTlVURSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0TWludXRlID0gbWFrZUdldFNldCgnTWludXRlcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdzJywgWydzcycsIDJdLCAwLCAnc2Vjb25kJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ3NlY29uZCcsICdzJyk7XG5cbiAgICAvLyBQUklPUklUWVxuXG4gICAgYWRkVW5pdFByaW9yaXR5KCdzZWNvbmQnLCAxNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdzJywgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdzcycsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsncycsICdzcyddLCBTRUNPTkQpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldFNlY29uZCA9IG1ha2VHZXRTZXQoJ1NlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignUycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwMCk7XG4gICAgfSk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTJywgMl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIH5+KHRoaXMubWlsbGlzZWNvbmQoKSAvIDEwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTJywgM10sIDAsICdtaWxsaXNlY29uZCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTUycsIDRdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTJywgNV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTUycsIDZdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTUycsIDddLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTJywgOF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDtcbiAgICB9KTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1NTU1NTU1NTUycsIDldLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kKCkgKiAxMDAwMDAwO1xuICAgIH0pO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdtaWxsaXNlY29uZCcsICdtcycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbWlsbGlzZWNvbmQnLCAxNik7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdTJywgbWF0Y2gxdG8zLCBtYXRjaDEpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTJywgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsIG1hdGNoMXRvMywgbWF0Y2gzKTtcblxuICAgIHZhciB0b2tlbiwgZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0TWlsbGlzZWNvbmQgPSBtYWtlR2V0U2V0KCdNaWxsaXNlY29uZHMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigneicsIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdVVEMnIDogJyc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZU5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1VUQyA/ICdDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZScgOiAnJztcbiAgICB9XG5cbiAgICB2YXIgcHJvdG8gPSBNb21lbnQucHJvdG90eXBlO1xuXG4gICAgcHJvdG8uYWRkID0gYWRkO1xuICAgIHByb3RvLmNhbGVuZGFyID0gY2FsZW5kYXIkMTtcbiAgICBwcm90by5jbG9uZSA9IGNsb25lO1xuICAgIHByb3RvLmRpZmYgPSBkaWZmO1xuICAgIHByb3RvLmVuZE9mID0gZW5kT2Y7XG4gICAgcHJvdG8uZm9ybWF0ID0gZm9ybWF0O1xuICAgIHByb3RvLmZyb20gPSBmcm9tO1xuICAgIHByb3RvLmZyb21Ob3cgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvID0gdG87XG4gICAgcHJvdG8udG9Ob3cgPSB0b05vdztcbiAgICBwcm90by5nZXQgPSBzdHJpbmdHZXQ7XG4gICAgcHJvdG8uaW52YWxpZEF0ID0gaW52YWxpZEF0O1xuICAgIHByb3RvLmlzQWZ0ZXIgPSBpc0FmdGVyO1xuICAgIHByb3RvLmlzQmVmb3JlID0gaXNCZWZvcmU7XG4gICAgcHJvdG8uaXNCZXR3ZWVuID0gaXNCZXR3ZWVuO1xuICAgIHByb3RvLmlzU2FtZSA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyID0gaXNTYW1lT3JBZnRlcjtcbiAgICBwcm90by5pc1NhbWVPckJlZm9yZSA9IGlzU2FtZU9yQmVmb3JlO1xuICAgIHByb3RvLmlzVmFsaWQgPSBpc1ZhbGlkJDI7XG4gICAgcHJvdG8ubGFuZyA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlID0gbG9jYWxlO1xuICAgIHByb3RvLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCA9IHByb3RvdHlwZU1heDtcbiAgICBwcm90by5taW4gPSBwcm90b3R5cGVNaW47XG4gICAgcHJvdG8ucGFyc2luZ0ZsYWdzID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCA9IHN0cmluZ1NldDtcbiAgICBwcm90by5zdGFydE9mID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgPSB0b0FycmF5O1xuICAgIHByb3RvLnRvT2JqZWN0ID0gdG9PYmplY3Q7XG4gICAgcHJvdG8udG9EYXRlID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCA9IGluc3BlY3Q7XG4gICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5mb3IgIT0gbnVsbCkge1xuICAgICAgICBwcm90b1tTeW1ib2wuZm9yKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAnTW9tZW50PCcgKyB0aGlzLmZvcm1hdCgpICsgJz4nO1xuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm90by50b0pTT04gPSB0b0pTT047XG4gICAgcHJvdG8udG9TdHJpbmcgPSB0b1N0cmluZztcbiAgICBwcm90by51bml4ID0gdW5peDtcbiAgICBwcm90by52YWx1ZU9mID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgPSBjcmVhdGlvbkRhdGE7XG4gICAgcHJvdG8uZXJhTmFtZSA9IGdldEVyYU5hbWU7XG4gICAgcHJvdG8uZXJhTmFycm93ID0gZ2V0RXJhTmFycm93O1xuICAgIHByb3RvLmVyYUFiYnIgPSBnZXRFcmFBYmJyO1xuICAgIHByb3RvLmVyYVllYXIgPSBnZXRFcmFZZWFyO1xuICAgIHByb3RvLnllYXIgPSBnZXRTZXRZZWFyO1xuICAgIHByb3RvLmlzTGVhcFllYXIgPSBnZXRJc0xlYXBZZWFyO1xuICAgIHByb3RvLndlZWtZZWFyID0gZ2V0U2V0V2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla1llYXIgPSBnZXRTZXRJU09XZWVrWWVhcjtcbiAgICBwcm90by5xdWFydGVyID0gcHJvdG8ucXVhcnRlcnMgPSBnZXRTZXRRdWFydGVyO1xuICAgIHByb3RvLm1vbnRoID0gZ2V0U2V0TW9udGg7XG4gICAgcHJvdG8uZGF5c0luTW9udGggPSBnZXREYXlzSW5Nb250aDtcbiAgICBwcm90by53ZWVrID0gcHJvdG8ud2Vla3MgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgPSBwcm90by5pc29XZWVrcyA9IGdldFNldElTT1dlZWs7XG4gICAgcHJvdG8ud2Vla3NJblllYXIgPSBnZXRXZWVrc0luWWVhcjtcbiAgICBwcm90by53ZWVrc0luV2Vla1llYXIgPSBnZXRXZWVrc0luV2Vla1llYXI7XG4gICAgcHJvdG8uaXNvV2Vla3NJblllYXIgPSBnZXRJU09XZWVrc0luWWVhcjtcbiAgICBwcm90by5pc29XZWVrc0luSVNPV2Vla1llYXIgPSBnZXRJU09XZWVrc0luSVNPV2Vla1llYXI7XG4gICAgcHJvdG8uZGF0ZSA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ID0gcHJvdG8uZGF5cyA9IGdldFNldERheU9mV2VlaztcbiAgICBwcm90by53ZWVrZGF5ID0gZ2V0U2V0TG9jYWxlRGF5T2ZXZWVrO1xuICAgIHByb3RvLmlzb1dlZWtkYXkgPSBnZXRTZXRJU09EYXlPZldlZWs7XG4gICAgcHJvdG8uZGF5T2ZZZWFyID0gZ2V0U2V0RGF5T2ZZZWFyO1xuICAgIHByb3RvLmhvdXIgPSBwcm90by5ob3VycyA9IGdldFNldEhvdXI7XG4gICAgcHJvdG8ubWludXRlID0gcHJvdG8ubWludXRlcyA9IGdldFNldE1pbnV0ZTtcbiAgICBwcm90by5zZWNvbmQgPSBwcm90by5zZWNvbmRzID0gZ2V0U2V0U2Vjb25kO1xuICAgIHByb3RvLm1pbGxpc2Vjb25kID0gcHJvdG8ubWlsbGlzZWNvbmRzID0gZ2V0U2V0TWlsbGlzZWNvbmQ7XG4gICAgcHJvdG8udXRjT2Zmc2V0ID0gZ2V0U2V0T2Zmc2V0O1xuICAgIHByb3RvLnV0YyA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgPSBzZXRPZmZzZXRUb1BhcnNlZE9mZnNldDtcbiAgICBwcm90by5oYXNBbGlnbmVkSG91ck9mZnNldCA9IGhhc0FsaWduZWRIb3VyT2Zmc2V0O1xuICAgIHByb3RvLmlzRFNUID0gaXNEYXlsaWdodFNhdmluZ1RpbWU7XG4gICAgcHJvdG8uaXNMb2NhbCA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzID0gZGVwcmVjYXRlKFxuICAgICAgICAnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLFxuICAgICAgICBnZXRTZXREYXlPZk1vbnRoXG4gICAgKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWQnLFxuICAgICAgICBnZXRTZXRNb250aFxuICAgICk7XG4gICAgcHJvdG8ueWVhcnMgPSBkZXByZWNhdGUoXG4gICAgICAgICd5ZWFycyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgeWVhciBpbnN0ZWFkJyxcbiAgICAgICAgZ2V0U2V0WWVhclxuICAgICk7XG4gICAgcHJvdG8uem9uZSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJyxcbiAgICAgICAgZ2V0U2V0Wm9uZVxuICAgICk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKFxuICAgICAgICAnaXNEU1RTaGlmdGVkIGlzIGRlcHJlY2F0ZWQuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RzdC1zaGlmdGVkLyBmb3IgbW9yZSBpbmZvcm1hdGlvbicsXG4gICAgICAgIGlzRGF5bGlnaHRTYXZpbmdUaW1lU2hpZnRlZFxuICAgICk7XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVbml4KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSgpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsLmFwcGx5KG51bGwsIGFyZ3VtZW50cykucGFyc2Vab25lKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlUGFyc2VQb3N0Rm9ybWF0KHN0cmluZykge1xuICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgIH1cblxuICAgIHZhciBwcm90byQxID0gTG9jYWxlLnByb3RvdHlwZTtcblxuICAgIHByb3RvJDEuY2FsZW5kYXIgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ID0gbG9uZ0RhdGVGb3JtYXQ7XG4gICAgcHJvdG8kMS5pbnZhbGlkRGF0ZSA9IGludmFsaWREYXRlO1xuICAgIHByb3RvJDEub3JkaW5hbCA9IG9yZGluYWw7XG4gICAgcHJvdG8kMS5wcmVwYXJzZSA9IHByZVBhcnNlUG9zdEZvcm1hdDtcbiAgICBwcm90byQxLnBvc3Rmb3JtYXQgPSBwcmVQYXJzZVBvc3RGb3JtYXQ7XG4gICAgcHJvdG8kMS5yZWxhdGl2ZVRpbWUgPSByZWxhdGl2ZVRpbWU7XG4gICAgcHJvdG8kMS5wYXN0RnV0dXJlID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCA9IHNldDtcbiAgICBwcm90byQxLmVyYXMgPSBsb2NhbGVFcmFzO1xuICAgIHByb3RvJDEuZXJhc1BhcnNlID0gbG9jYWxlRXJhc1BhcnNlO1xuICAgIHByb3RvJDEuZXJhc0NvbnZlcnRZZWFyID0gbG9jYWxlRXJhc0NvbnZlcnRZZWFyO1xuICAgIHByb3RvJDEuZXJhc0FiYnJSZWdleCA9IGVyYXNBYmJyUmVnZXg7XG4gICAgcHJvdG8kMS5lcmFzTmFtZVJlZ2V4ID0gZXJhc05hbWVSZWdleDtcbiAgICBwcm90byQxLmVyYXNOYXJyb3dSZWdleCA9IGVyYXNOYXJyb3dSZWdleDtcblxuICAgIHByb3RvJDEubW9udGhzID0gbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgPSBsb2NhbGVNb250aHNTaG9ydDtcbiAgICBwcm90byQxLm1vbnRoc1BhcnNlID0gbG9jYWxlTW9udGhzUGFyc2U7XG4gICAgcHJvdG8kMS5tb250aHNSZWdleCA9IG1vbnRoc1JlZ2V4O1xuICAgIHByb3RvJDEubW9udGhzU2hvcnRSZWdleCA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyA9IGxvY2FsZVdlZWtkYXlzO1xuICAgIHByb3RvJDEud2Vla2RheXNNaW4gPSBsb2NhbGVXZWVrZGF5c01pbjtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnQgPSBsb2NhbGVXZWVrZGF5c1Nob3J0O1xuICAgIHByb3RvJDEud2Vla2RheXNQYXJzZSA9IGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggPSB3ZWVrZGF5c1JlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydFJlZ2V4ID0gd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCA9IHdlZWtkYXlzTWluUmVnZXg7XG5cbiAgICBwcm90byQxLmlzUE0gPSBsb2NhbGVJc1BNO1xuICAgIHByb3RvJDEubWVyaWRpZW0gPSBsb2NhbGVNZXJpZGllbTtcblxuICAgIGZ1bmN0aW9uIGdldCQxKGZvcm1hdCwgaW5kZXgsIGZpZWxkLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGxvY2FsZSA9IGdldExvY2FsZSgpLFxuICAgICAgICAgICAgdXRjID0gY3JlYXRlVVRDKCkuc2V0KHNldHRlciwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gbG9jYWxlW2ZpZWxkXSh1dGMsIGZvcm1hdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCBmaWVsZCkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVNvcnRlZCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBpZiAoaXNOdW1iZXIoZm9ybWF0KSkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0ID0gbG9jYWxlU29ydGVkO1xuICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICBsb2NhbGVTb3J0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSBnZXRMb2NhbGUoKSxcbiAgICAgICAgICAgIHNoaWZ0ID0gbG9jYWxlU29ydGVkID8gbG9jYWxlLl93ZWVrLmRvdyA6IDAsXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgb3V0ID0gW107XG5cbiAgICAgICAgaWYgKGluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQkMShmb3JtYXQsIChpbmRleCArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBvdXRbaV0gPSBnZXQkMShmb3JtYXQsIChpICsgc2hpZnQpICUgNywgZmllbGQsICdkYXknKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHMoZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdE1vbnRoc0ltcGwoZm9ybWF0LCBpbmRleCwgJ21vbnRocycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RNb250aHNTaG9ydChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdFdlZWtkYXlzU2hvcnQobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXNNaW4obG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZXJhczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNpbmNlOiAnMDAwMS0wMS0wMScsXG4gICAgICAgICAgICAgICAgdW50aWw6ICtJbmZpbml0eSxcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IDEsXG4gICAgICAgICAgICAgICAgbmFtZTogJ0Fubm8gRG9taW5pJyxcbiAgICAgICAgICAgICAgICBuYXJyb3c6ICdBRCcsXG4gICAgICAgICAgICAgICAgYWJicjogJ0FEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2luY2U6ICcwMDAwLTEyLTMxJyxcbiAgICAgICAgICAgICAgICB1bnRpbDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG9mZnNldDogMSxcbiAgICAgICAgICAgICAgICBuYW1lOiAnQmVmb3JlIENocmlzdCcsXG4gICAgICAgICAgICAgICAgbmFycm93OiAnQkMnLFxuICAgICAgICAgICAgICAgIGFiYnI6ICdCQycsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiAvXFxkezEsMn0odGh8c3R8bmR8cmQpLyxcbiAgICAgICAgb3JkaW5hbDogZnVuY3Rpb24gKG51bWJlcikge1xuICAgICAgICAgICAgdmFyIGIgPSBudW1iZXIgJSAxMCxcbiAgICAgICAgICAgICAgICBvdXRwdXQgPVxuICAgICAgICAgICAgICAgICAgICB0b0ludCgobnVtYmVyICUgMTAwKSAvIDEwKSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndGgnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGIgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3N0J1xuICAgICAgICAgICAgICAgICAgICAgICAgOiBiID09PSAyXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICduZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYiA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgPyAncmQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgaG9va3MubGFuZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuJyxcbiAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlXG4gICAgKTtcbiAgICBob29rcy5sYW5nRGF0YSA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLFxuICAgICAgICBnZXRMb2NhbGVcbiAgICApO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicygpIHtcbiAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9kYXRhO1xuXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9IG1hdGhBYnModGhpcy5fbWlsbGlzZWNvbmRzKTtcbiAgICAgICAgdGhpcy5fZGF5cyA9IG1hdGhBYnModGhpcy5fZGF5cyk7XG4gICAgICAgIHRoaXMuX21vbnRocyA9IG1hdGhBYnModGhpcy5fbW9udGhzKTtcblxuICAgICAgICBkYXRhLm1pbGxpc2Vjb25kcyA9IG1hdGhBYnMoZGF0YS5taWxsaXNlY29uZHMpO1xuICAgICAgICBkYXRhLnNlY29uZHMgPSBtYXRoQWJzKGRhdGEuc2Vjb25kcyk7XG4gICAgICAgIGRhdGEubWludXRlcyA9IG1hdGhBYnMoZGF0YS5taW51dGVzKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IG1hdGhBYnMoZGF0YS5ob3Vycyk7XG4gICAgICAgIGRhdGEubW9udGhzID0gbWF0aEFicyhkYXRhLm1vbnRocyk7XG4gICAgICAgIGRhdGEueWVhcnMgPSBtYXRoQWJzKGRhdGEueWVhcnMpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0JDEoZHVyYXRpb24sIGlucHV0LCB2YWx1ZSwgZGlyZWN0aW9uKSB7XG4gICAgICAgIHZhciBvdGhlciA9IGNyZWF0ZUR1cmF0aW9uKGlucHV0LCB2YWx1ZSk7XG5cbiAgICAgICAgZHVyYXRpb24uX21pbGxpc2Vjb25kcyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbWlsbGlzZWNvbmRzO1xuICAgICAgICBkdXJhdGlvbi5fZGF5cyArPSBkaXJlY3Rpb24gKiBvdGhlci5fZGF5cztcbiAgICAgICAgZHVyYXRpb24uX21vbnRocyArPSBkaXJlY3Rpb24gKiBvdGhlci5fbW9udGhzO1xuXG4gICAgICAgIHJldHVybiBkdXJhdGlvbi5fYnViYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgYWRkKDEsICdzJykgb3IgYWRkKGR1cmF0aW9uKVxuICAgIGZ1bmN0aW9uIGFkZCQxKGlucHV0LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gYWRkU3VidHJhY3QkMSh0aGlzLCBpbnB1dCwgdmFsdWUsIDEpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIHN1YnRyYWN0KDEsICdzJykgb3Igc3VidHJhY3QoZHVyYXRpb24pXG4gICAgZnVuY3Rpb24gc3VidHJhY3QkMShpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKG51bWJlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG51bWJlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBidWJibGUoKSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSB0aGlzLl9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyxcbiAgICAgICAgICAgIG1vbnRocyA9IHRoaXMuX21vbnRocyxcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9kYXRhLFxuICAgICAgICAgICAgc2Vjb25kcyxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgbW9udGhzRnJvbURheXM7XG5cbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG1peCBvZiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgdmFsdWVzLCBidWJibGUgZG93biBmaXJzdFxuICAgICAgICAvLyBjaGVjazogaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzIxNjZcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzID0gYWJzRmxvb3IobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgZGF0YS5taW51dGVzID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyA9IGhvdXJzICUgMjQ7XG5cbiAgICAgICAgZGF5cyArPSBhYnNGbG9vcihob3VycyAvIDI0KTtcblxuICAgICAgICAvLyBjb252ZXJ0IGRheXMgdG8gbW9udGhzXG4gICAgICAgIG1vbnRoc0Zyb21EYXlzID0gYWJzRmxvb3IoZGF5c1RvTW9udGhzKGRheXMpKTtcbiAgICAgICAgbW9udGhzICs9IG1vbnRoc0Zyb21EYXlzO1xuICAgICAgICBkYXlzIC09IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRoc0Zyb21EYXlzKSk7XG5cbiAgICAgICAgLy8gMTIgbW9udGhzIC0+IDEgeWVhclxuICAgICAgICB5ZWFycyA9IGFic0Zsb29yKG1vbnRocyAvIDEyKTtcbiAgICAgICAgbW9udGhzICU9IDEyO1xuXG4gICAgICAgIGRhdGEuZGF5cyA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzID0geWVhcnM7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5c1RvTW9udGhzKGRheXMpIHtcbiAgICAgICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxMiBtb250aHMgPT09IDQ4MDBcbiAgICAgICAgcmV0dXJuIChkYXlzICogNDgwMCkgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzKG1vbnRocykge1xuICAgICAgICAvLyB0aGUgcmV2ZXJzZSBvZiBkYXlzVG9Nb250aHNcbiAgICAgICAgcmV0dXJuIChtb250aHMgKiAxNDYwOTcpIC8gNDgwMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhcyh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzLFxuICAgICAgICAgICAgbW9udGhzLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3F1YXJ0ZXInOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9udGhzIC8gMztcbiAgICAgICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRocyAvIDEyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIG1pbGxpc2Vjb25kcyBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YgZmxvYXRpbmcgcG9pbnQgbWF0aCBlcnJvcnMgKGlzc3VlICMxODY3KVxuICAgICAgICAgICAgZGF5cyA9IHRoaXMuX2RheXMgKyBNYXRoLnJvdW5kKG1vbnRoc1RvRGF5cyh0aGlzLl9tb250aHMpKTtcbiAgICAgICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRheXMgLyA3ICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMjQgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXlzICogMTQ0MCArIG1pbGxpc2Vjb25kcyAvIDZlNDtcbiAgICAgICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzICtcbiAgICAgICAgICAgIHRoaXMuX2RheXMgKiA4NjRlNSArXG4gICAgICAgICAgICAodGhpcy5fbW9udGhzICUgMTIpICogMjU5MmU2ICtcbiAgICAgICAgICAgIHRvSW50KHRoaXMuX21vbnRocyAvIDEyKSAqIDMxNTM2ZTZcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlQXMoYWxpYXMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzKGFsaWFzKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgYXNNaWxsaXNlY29uZHMgPSBtYWtlQXMoJ21zJyksXG4gICAgICAgIGFzU2Vjb25kcyA9IG1ha2VBcygncycpLFxuICAgICAgICBhc01pbnV0ZXMgPSBtYWtlQXMoJ20nKSxcbiAgICAgICAgYXNIb3VycyA9IG1ha2VBcygnaCcpLFxuICAgICAgICBhc0RheXMgPSBtYWtlQXMoJ2QnKSxcbiAgICAgICAgYXNXZWVrcyA9IG1ha2VBcygndycpLFxuICAgICAgICBhc01vbnRocyA9IG1ha2VBcygnTScpLFxuICAgICAgICBhc1F1YXJ0ZXJzID0gbWFrZUFzKCdRJyksXG4gICAgICAgIGFzWWVhcnMgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXQkMih1bml0cykge1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpc1t1bml0cyArICdzJ10oKSA6IE5hTjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYWtlR2V0dGVyKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2RhdGFbbmFtZV0gOiBOYU47XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG1pbGxpc2Vjb25kcyA9IG1ha2VHZXR0ZXIoJ21pbGxpc2Vjb25kcycpLFxuICAgICAgICBzZWNvbmRzID0gbWFrZUdldHRlcignc2Vjb25kcycpLFxuICAgICAgICBtaW51dGVzID0gbWFrZUdldHRlcignbWludXRlcycpLFxuICAgICAgICBob3VycyA9IG1ha2VHZXR0ZXIoJ2hvdXJzJyksXG4gICAgICAgIGRheXMgPSBtYWtlR2V0dGVyKCdkYXlzJyksXG4gICAgICAgIG1vbnRocyA9IG1ha2VHZXR0ZXIoJ21vbnRocycpLFxuICAgICAgICB5ZWFycyA9IG1ha2VHZXR0ZXIoJ3llYXJzJyk7XG5cbiAgICBmdW5jdGlvbiB3ZWVrcygpIHtcbiAgICAgICAgcmV0dXJuIGFic0Zsb29yKHRoaXMuZGF5cygpIC8gNyk7XG4gICAgfVxuXG4gICAgdmFyIHJvdW5kID0gTWF0aC5yb3VuZCxcbiAgICAgICAgdGhyZXNob2xkcyA9IHtcbiAgICAgICAgICAgIHNzOiA0NCwgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgICAgICBzOiA0NSwgLy8gc2Vjb25kcyB0byBtaW51dGVcbiAgICAgICAgICAgIG06IDQ1LCAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgICAgIGg6IDIyLCAvLyBob3VycyB0byBkYXlcbiAgICAgICAgICAgIGQ6IDI2LCAvLyBkYXlzIHRvIG1vbnRoL3dlZWtcbiAgICAgICAgICAgIHc6IG51bGwsIC8vIHdlZWtzIHRvIG1vbnRoXG4gICAgICAgICAgICBNOiAxMSwgLy8gbW9udGhzIHRvIHllYXJcbiAgICAgICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW1lJDEocG9zTmVnRHVyYXRpb24sIHdpdGhvdXRTdWZmaXgsIHRocmVzaG9sZHMsIGxvY2FsZSkge1xuICAgICAgICB2YXIgZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbihwb3NOZWdEdXJhdGlvbikuYWJzKCksXG4gICAgICAgICAgICBzZWNvbmRzID0gcm91bmQoZHVyYXRpb24uYXMoJ3MnKSksXG4gICAgICAgICAgICBtaW51dGVzID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSksXG4gICAgICAgICAgICBob3VycyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpLFxuICAgICAgICAgICAgZGF5cyA9IHJvdW5kKGR1cmF0aW9uLmFzKCdkJykpLFxuICAgICAgICAgICAgbW9udGhzID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSksXG4gICAgICAgICAgICB3ZWVrcyA9IHJvdW5kKGR1cmF0aW9uLmFzKCd3JykpLFxuICAgICAgICAgICAgeWVhcnMgPSByb3VuZChkdXJhdGlvbi5hcygneScpKSxcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIChzZWNvbmRzIDw9IHRocmVzaG9sZHMuc3MgJiYgWydzJywgc2Vjb25kc10pIHx8XG4gICAgICAgICAgICAgICAgKHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgJiYgWydzcycsIHNlY29uZHNdKSB8fFxuICAgICAgICAgICAgICAgIChtaW51dGVzIDw9IDEgJiYgWydtJ10pIHx8XG4gICAgICAgICAgICAgICAgKG1pbnV0ZXMgPCB0aHJlc2hvbGRzLm0gJiYgWydtbScsIG1pbnV0ZXNdKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8PSAxICYmIFsnaCddKSB8fFxuICAgICAgICAgICAgICAgIChob3VycyA8IHRocmVzaG9sZHMuaCAmJiBbJ2hoJywgaG91cnNdKSB8fFxuICAgICAgICAgICAgICAgIChkYXlzIDw9IDEgJiYgWydkJ10pIHx8XG4gICAgICAgICAgICAgICAgKGRheXMgPCB0aHJlc2hvbGRzLmQgJiYgWydkZCcsIGRheXNdKTtcblxuICAgICAgICBpZiAodGhyZXNob2xkcy53ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGEgPVxuICAgICAgICAgICAgICAgIGEgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPD0gMSAmJiBbJ3cnXSkgfHxcbiAgICAgICAgICAgICAgICAod2Vla3MgPCB0aHJlc2hvbGRzLncgJiYgWyd3dycsIHdlZWtzXSk7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGEgfHxcbiAgICAgICAgICAgIChtb250aHMgPD0gMSAmJiBbJ00nXSkgfHxcbiAgICAgICAgICAgIChtb250aHMgPCB0aHJlc2hvbGRzLk0gJiYgWydNTScsIG1vbnRoc10pIHx8XG4gICAgICAgICAgICAoeWVhcnMgPD0gMSAmJiBbJ3knXSkgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcocm91bmRpbmdGdW5jdGlvbikge1xuICAgICAgICBpZiAocm91bmRpbmdGdW5jdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gcm91bmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByb3VuZGluZ0Z1bmN0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByb3VuZCA9IHJvdW5kaW5nRnVuY3Rpb247XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiBhbGxvd3MgeW91IHRvIHNldCBhIHRocmVzaG9sZCBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZShhcmdXaXRoU3VmZml4LCBhcmdUaHJlc2hvbGRzKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHdpdGhTdWZmaXggPSBmYWxzZSxcbiAgICAgICAgICAgIHRoID0gdGhyZXNob2xkcyxcbiAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgIG91dHB1dDtcblxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBhcmdUaHJlc2hvbGRzID0gYXJnV2l0aFN1ZmZpeDtcbiAgICAgICAgICAgIGFyZ1dpdGhTdWZmaXggPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFyZ1dpdGhTdWZmaXggPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgd2l0aFN1ZmZpeCA9IGFyZ1dpdGhTdWZmaXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcmdUaHJlc2hvbGRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGggPSBPYmplY3QuYXNzaWduKHt9LCB0aHJlc2hvbGRzLCBhcmdUaHJlc2hvbGRzKTtcbiAgICAgICAgICAgIGlmIChhcmdUaHJlc2hvbGRzLnMgIT0gbnVsbCAmJiBhcmdUaHJlc2hvbGRzLnNzID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aC5zcyA9IGFyZ1RocmVzaG9sZHMucyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgb3V0cHV0ID0gcmVsYXRpdmVUaW1lJDEodGhpcywgIXdpdGhTdWZmaXgsIHRoLCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoeCA+IDApIC0gKHggPCAwKSB8fCAreDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0lTT1N0cmluZyQxKCkge1xuICAgICAgICAvLyBmb3IgSVNPIHN0cmluZ3Mgd2UgZG8gbm90IHVzZSB0aGUgbm9ybWFsIGJ1YmJsaW5nIHJ1bGVzOlxuICAgICAgICAvLyAgKiBtaWxsaXNlY29uZHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIGhvdXJzXG4gICAgICAgIC8vICAqIGRheXMgZG8gbm90IGJ1YmJsZSBhdCBhbGxcbiAgICAgICAgLy8gICogbW9udGhzIGJ1YmJsZSB1cCB1bnRpbCB0aGV5IGJlY29tZSB5ZWFyc1xuICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gY29udGV4dC1mcmVlIGNvbnZlcnNpb24gYmV0d2VlbiBob3VycyBhbmQgZGF5c1xuICAgICAgICAvLyAodGhpbmsgb2YgY2xvY2sgY2hhbmdlcylcbiAgICAgICAgLy8gYW5kIGFsc28gbm90IGJldHdlZW4gZGF5cyBhbmQgbW9udGhzICgyOC0zMSBkYXlzIHBlciBtb250aClcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc2Vjb25kcyA9IGFicyQxKHRoaXMuX21pbGxpc2Vjb25kcykgLyAxMDAwLFxuICAgICAgICAgICAgZGF5cyA9IGFicyQxKHRoaXMuX2RheXMpLFxuICAgICAgICAgICAgbW9udGhzID0gYWJzJDEodGhpcy5fbW9udGhzKSxcbiAgICAgICAgICAgIG1pbnV0ZXMsXG4gICAgICAgICAgICBob3VycyxcbiAgICAgICAgICAgIHllYXJzLFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIHRvdGFsID0gdGhpcy5hc1NlY29uZHMoKSxcbiAgICAgICAgICAgIHRvdGFsU2lnbixcbiAgICAgICAgICAgIHltU2lnbixcbiAgICAgICAgICAgIGRheXNTaWduLFxuICAgICAgICAgICAgaG1zU2lnbjtcblxuICAgICAgICBpZiAoIXRvdGFsKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGlzIHRoZSBzYW1lIGFzIEMjJ3MgKE5vZGEpIGFuZCBweXRob24gKGlzb2RhdGUpLi4uXG4gICAgICAgICAgICAvLyBidXQgbm90IG90aGVyIEpTIChnb29nLmRhdGUpXG4gICAgICAgICAgICByZXR1cm4gJ1AwRCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzNjAwIHNlY29uZHMgLT4gNjAgbWludXRlcyAtPiAxIGhvdXJcbiAgICAgICAgbWludXRlcyA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGhvdXJzID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgc2Vjb25kcyAlPSA2MDtcbiAgICAgICAgbWludXRlcyAlPSA2MDtcblxuICAgICAgICAvLyAxMiBtb250aHMgLT4gMSB5ZWFyXG4gICAgICAgIHllYXJzID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cbiAgICAgICAgLy8gaW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL2RvcmRpbGxlL21vbWVudC1pc29kdXJhdGlvbi9ibG9iL21hc3Rlci9tb21lbnQuaXNvZHVyYXRpb24uanNcbiAgICAgICAgcyA9IHNlY29uZHMgPyBzZWNvbmRzLnRvRml4ZWQoMykucmVwbGFjZSgvXFwuPzArJC8sICcnKSA6ICcnO1xuXG4gICAgICAgIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB5bVNpZ24gPSBzaWduKHRoaXMuX21vbnRocykgIT09IHNpZ24odG90YWwpID8gJy0nIDogJyc7XG4gICAgICAgIGRheXNTaWduID0gc2lnbih0aGlzLl9kYXlzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcbiAgICAgICAgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdG90YWxTaWduICtcbiAgICAgICAgICAgICdQJyArXG4gICAgICAgICAgICAoeWVhcnMgPyB5bVNpZ24gKyB5ZWFycyArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAobW9udGhzID8geW1TaWduICsgbW9udGhzICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChkYXlzID8gZGF5c1NpZ24gKyBkYXlzICsgJ0QnIDogJycpICtcbiAgICAgICAgICAgIChob3VycyB8fCBtaW51dGVzIHx8IHNlY29uZHMgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGhvdXJzID8gaG1zU2lnbiArIGhvdXJzICsgJ0gnIDogJycpICtcbiAgICAgICAgICAgIChtaW51dGVzID8gaG1zU2lnbiArIG1pbnV0ZXMgKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKHNlY29uZHMgPyBobXNTaWduICsgcyArICdTJyA6ICcnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBwcm90byQyID0gRHVyYXRpb24ucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMi5pc1ZhbGlkID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzID0gYWJzO1xuICAgIHByb3RvJDIuYWRkID0gYWRkJDE7XG4gICAgcHJvdG8kMi5zdWJ0cmFjdCA9IHN1YnRyYWN0JDE7XG4gICAgcHJvdG8kMi5hcyA9IGFzO1xuICAgIHByb3RvJDIuYXNNaWxsaXNlY29uZHMgPSBhc01pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLmFzU2Vjb25kcyA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyA9IGFzTWludXRlcztcbiAgICBwcm90byQyLmFzSG91cnMgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzID0gYXNEYXlzO1xuICAgIHByb3RvJDIuYXNXZWVrcyA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyA9IGFzUXVhcnRlcnM7XG4gICAgcHJvdG8kMi5hc1llYXJzID0gYXNZZWFycztcbiAgICBwcm90byQyLnZhbHVlT2YgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlID0gYnViYmxlO1xuICAgIHByb3RvJDIuY2xvbmUgPSBjbG9uZSQxO1xuICAgIHByb3RvJDIuZ2V0ID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5zZWNvbmRzID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgPSBtaW51dGVzO1xuICAgIHByb3RvJDIuaG91cnMgPSBob3VycztcbiAgICBwcm90byQyLmRheXMgPSBkYXlzO1xuICAgIHByb3RvJDIud2Vla3MgPSB3ZWVrcztcbiAgICBwcm90byQyLm1vbnRocyA9IG1vbnRocztcbiAgICBwcm90byQyLnllYXJzID0geWVhcnM7XG4gICAgcHJvdG8kMi5odW1hbml6ZSA9IGh1bWFuaXplO1xuICAgIHByb3RvJDIudG9JU09TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9TdHJpbmcgPSB0b0lTT1N0cmluZyQxO1xuICAgIHByb3RvJDIudG9KU09OID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSA9IGxvY2FsZTtcbiAgICBwcm90byQyLmxvY2FsZURhdGEgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3RvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpJyxcbiAgICAgICAgdG9JU09TdHJpbmckMVxuICAgICk7XG4gICAgcHJvdG8kMi5sYW5nID0gbGFuZztcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdYJywgMCwgMCwgJ3VuaXgnKTtcbiAgICBhZGRGb3JtYXRUb2tlbigneCcsIDAsIDAsICd2YWx1ZU9mJyk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd4JywgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1gnLCBtYXRjaFRpbWVzdGFtcCk7XG4gICAgYWRkUGFyc2VUb2tlbignWCcsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShwYXJzZUZsb2F0KGlucHV0KSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vISBtb21lbnQuanNcblxuICAgIGhvb2tzLnZlcnNpb24gPSAnMi4yOS4xJztcblxuICAgIHNldEhvb2tDYWxsYmFjayhjcmVhdGVMb2NhbCk7XG5cbiAgICBob29rcy5mbiA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiA9IG1pbjtcbiAgICBob29rcy5tYXggPSBtYXg7XG4gICAgaG9va3Mubm93ID0gbm93O1xuICAgIGhvb2tzLnV0YyA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ID0gY3JlYXRlVW5peDtcbiAgICBob29rcy5tb250aHMgPSBsaXN0TW9udGhzO1xuICAgIGhvb2tzLmlzRGF0ZSA9IGlzRGF0ZTtcbiAgICBob29rcy5sb2NhbGUgPSBnZXRTZXRHbG9iYWxMb2NhbGU7XG4gICAgaG9va3MuaW52YWxpZCA9IGNyZWF0ZUludmFsaWQ7XG4gICAgaG9va3MuZHVyYXRpb24gPSBjcmVhdGVEdXJhdGlvbjtcbiAgICBob29rcy5pc01vbWVudCA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzID0gbGlzdFdlZWtkYXlzO1xuICAgIGhvb2tzLnBhcnNlWm9uZSA9IGNyZWF0ZUluWm9uZTtcbiAgICBob29rcy5sb2NhbGVEYXRhID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gPSBpc0R1cmF0aW9uO1xuICAgIGhvb2tzLm1vbnRoc1Nob3J0ID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluID0gbGlzdFdlZWtkYXlzTWluO1xuICAgIGhvb2tzLmRlZmluZUxvY2FsZSA9IGRlZmluZUxvY2FsZTtcbiAgICBob29rcy51cGRhdGVMb2NhbGUgPSB1cGRhdGVMb2NhbGU7XG4gICAgaG9va3MubG9jYWxlcyA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgPSBsaXN0V2Vla2RheXNTaG9ydDtcbiAgICBob29rcy5ub3JtYWxpemVVbml0cyA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nID0gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmc7XG4gICAgaG9va3MucmVsYXRpdmVUaW1lVGhyZXNob2xkID0gZ2V0U2V0UmVsYXRpdmVUaW1lVGhyZXNob2xkO1xuICAgIGhvb2tzLmNhbGVuZGFyRm9ybWF0ID0gZ2V0Q2FsZW5kYXJGb3JtYXQ7XG4gICAgaG9va3MucHJvdG90eXBlID0gcHJvdG87XG5cbiAgICAvLyBjdXJyZW50bHkgSFRNTDUgaW5wdXQgdHlwZSBvbmx5IHN1cHBvcnRzIDI0LWhvdXIgZm9ybWF0c1xuICAgIGhvb2tzLkhUTUw1X0ZNVCA9IHtcbiAgICAgICAgREFURVRJTUVfTE9DQUw6ICdZWVlZLU1NLUREVEhIOm1tJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIC8+XG4gICAgICAgIERBVEVUSU1FX0xPQ0FMX1NFQ09ORFM6ICdZWVlZLU1NLUREVEhIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdGVwPVwiMC4wMDFcIiAvPlxuICAgICAgICBEQVRFOiAnWVlZWS1NTS1ERCcsIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjFcIiAvPlxuICAgICAgICBUSU1FX01TOiAnSEg6bW06c3MuU1NTJywgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAvLyA8aW5wdXQgdHlwZT1cIndlZWtcIiAvPlxuICAgICAgICBNT05USDogJ1lZWVktTU0nLCAvLyA8aW5wdXQgdHlwZT1cIm1vbnRoXCIgLz5cbiAgICB9O1xuXG4gICAgcmV0dXJuIGhvb2tzO1xuXG59KSkpO1xuIiwiXHJcbi8qKlxyXG4gKiBFeHBvc2UgYEVtaXR0ZXJgLlxyXG4gKi9cclxuXHJcbmlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJykge1xyXG4gIG1vZHVsZS5leHBvcnRzID0gRW1pdHRlcjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEluaXRpYWxpemUgYSBuZXcgYEVtaXR0ZXJgLlxyXG4gKlxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIEVtaXR0ZXIob2JqKSB7XHJcbiAgaWYgKG9iaikgcmV0dXJuIG1peGluKG9iaik7XHJcbn07XHJcblxyXG4vKipcclxuICogTWl4aW4gdGhlIGVtaXR0ZXIgcHJvcGVydGllcy5cclxuICpcclxuICogQHBhcmFtIHtPYmplY3R9IG9ialxyXG4gKiBAcmV0dXJuIHtPYmplY3R9XHJcbiAqIEBhcGkgcHJpdmF0ZVxyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1peGluKG9iaikge1xyXG4gIGZvciAodmFyIGtleSBpbiBFbWl0dGVyLnByb3RvdHlwZSkge1xyXG4gICAgb2JqW2tleV0gPSBFbWl0dGVyLnByb3RvdHlwZVtrZXldO1xyXG4gIH1cclxuICByZXR1cm4gb2JqO1xyXG59XHJcblxyXG4vKipcclxuICogTGlzdGVuIG9uIHRoZSBnaXZlbiBgZXZlbnRgIHdpdGggYGZuYC5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUub24gPVxyXG5FbWl0dGVyLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcbiAgKHRoaXMuX2NhbGxiYWNrc1snJCcgKyBldmVudF0gPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdKVxyXG4gICAgLnB1c2goZm4pO1xyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEFkZHMgYW4gYGV2ZW50YCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgaW52b2tlZCBhIHNpbmdsZVxyXG4gKiB0aW1lIHRoZW4gYXV0b21hdGljYWxseSByZW1vdmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cclxuICogQHJldHVybiB7RW1pdHRlcn1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24oZXZlbnQsIGZuKXtcclxuICBmdW5jdGlvbiBvbigpIHtcclxuICAgIHRoaXMub2ZmKGV2ZW50LCBvbik7XHJcbiAgICBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4gIH1cclxuXHJcbiAgb24uZm4gPSBmbjtcclxuICB0aGlzLm9uKGV2ZW50LCBvbik7XHJcbiAgcmV0dXJuIHRoaXM7XHJcbn07XHJcblxyXG4vKipcclxuICogUmVtb3ZlIHRoZSBnaXZlbiBjYWxsYmFjayBmb3IgYGV2ZW50YCBvciBhbGxcclxuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxyXG4gKiBAcmV0dXJuIHtFbWl0dGVyfVxyXG4gKiBAYXBpIHB1YmxpY1xyXG4gKi9cclxuXHJcbkVtaXR0ZXIucHJvdG90eXBlLm9mZiA9XHJcbkVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID1cclxuRW1pdHRlci5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50LCBmbil7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG5cclxuICAvLyBhbGxcclxuICBpZiAoMCA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gc3BlY2lmaWMgZXZlbnRcclxuICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICBpZiAoIWNhbGxiYWNrcykgcmV0dXJuIHRoaXM7XHJcblxyXG4gIC8vIHJlbW92ZSBhbGwgaGFuZGxlcnNcclxuICBpZiAoMSA9PSBhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gcmVtb3ZlIHNwZWNpZmljIGhhbmRsZXJcclxuICB2YXIgY2I7XHJcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgIGNiID0gY2FsbGJhY2tzW2ldO1xyXG4gICAgaWYgKGNiID09PSBmbiB8fCBjYi5mbiA9PT0gZm4pIHtcclxuICAgICAgY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBSZW1vdmUgZXZlbnQgc3BlY2lmaWMgYXJyYXlzIGZvciBldmVudCB0eXBlcyB0aGF0IG5vXHJcbiAgLy8gb25lIGlzIHN1YnNjcmliZWQgZm9yIHRvIGF2b2lkIG1lbW9yeSBsZWFrLlxyXG4gIGlmIChjYWxsYmFja3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzWyckJyArIGV2ZW50XTtcclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIEVtaXQgYGV2ZW50YCB3aXRoIHRoZSBnaXZlbiBhcmdzLlxyXG4gKlxyXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRcclxuICogQHBhcmFtIHtNaXhlZH0gLi4uXHJcbiAqIEByZXR1cm4ge0VtaXR0ZXJ9XHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKGV2ZW50KXtcclxuICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwge307XHJcblxyXG4gIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKVxyXG4gICAgLCBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdO1xyXG5cclxuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XHJcbiAgfVxyXG5cclxuICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICBjYWxsYmFja3MgPSBjYWxsYmFja3Muc2xpY2UoMCk7XHJcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XHJcbiAgICAgIGNhbGxiYWNrc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiB0aGlzO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFJldHVybiBhcnJheSBvZiBjYWxsYmFja3MgZm9yIGBldmVudGAuXHJcbiAqXHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxyXG4gKiBAcmV0dXJuIHtBcnJheX1cclxuICogQGFwaSBwdWJsaWNcclxuICovXHJcblxyXG5FbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihldmVudCl7XHJcbiAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzIHx8IHt9O1xyXG4gIHJldHVybiB0aGlzLl9jYWxsYmFja3NbJyQnICsgZXZlbnRdIHx8IFtdO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIENoZWNrIGlmIHRoaXMgZW1pdHRlciBoYXMgYGV2ZW50YCBoYW5kbGVycy5cclxuICpcclxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50XHJcbiAqIEByZXR1cm4ge0Jvb2xlYW59XHJcbiAqIEBhcGkgcHVibGljXHJcbiAqL1xyXG5cclxuRW1pdHRlci5wcm90b3R5cGUuaGFzTGlzdGVuZXJzID0gZnVuY3Rpb24oZXZlbnQpe1xyXG4gIHJldHVybiAhISB0aGlzLmxpc3RlbmVycyhldmVudCkubGVuZ3RoO1xyXG59O1xyXG4iLCIvKiEgSGFtbWVyLkpTIC0gdjIuMC4xNy1yYyAtIDIwMTktMTItMTZcbiAqIGh0dHA6Ly9uYXZlci5naXRodWIuaW8vZWdqc1xuICpcbiAqIEZvcmtlZCBCeSBOYXZlciBlZ2pzXG4gKiBDb3B5cmlnaHQgKGMpIGhhbW1lcmpzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgKi9cbmZ1bmN0aW9uIF9leHRlbmRzKCkge1xuICBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcbiAgc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzcztcbn1cblxuZnVuY3Rpb24gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKSB7XG4gIGlmIChzZWxmID09PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gc2VsZjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFxuICogQHBhcmFtIHsuLi5PYmplY3R9IG9iamVjdHNfdG9fYXNzaWduXG4gKiBAcmV0dXJucyB7T2JqZWN0fSB0YXJnZXRcbiAqL1xudmFyIGFzc2lnbjtcblxuaWYgKHR5cGVvZiBPYmplY3QuYXNzaWduICE9PSAnZnVuY3Rpb24nKSB7XG4gIGFzc2lnbiA9IGZ1bmN0aW9uIGFzc2lnbih0YXJnZXQpIHtcbiAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QnKTtcbiAgICB9XG5cbiAgICB2YXIgb3V0cHV0ID0gT2JqZWN0KHRhcmdldCk7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgYXJndW1lbnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG5cbiAgICAgIGlmIChzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgZm9yICh2YXIgbmV4dEtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KG5leHRLZXkpKSB7XG4gICAgICAgICAgICBvdXRwdXRbbmV4dEtleV0gPSBzb3VyY2VbbmV4dEtleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcbn0gZWxzZSB7XG4gIGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG59XG5cbnZhciBhc3NpZ24kMSA9IGFzc2lnbjtcblxudmFyIFZFTkRPUl9QUkVGSVhFUyA9IFsnJywgJ3dlYmtpdCcsICdNb3onLCAnTVMnLCAnbXMnLCAnbyddO1xudmFyIFRFU1RfRUxFTUVOVCA9IHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIiA/IHtcbiAgc3R5bGU6IHt9XG59IDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG52YXIgVFlQRV9GVU5DVElPTiA9ICdmdW5jdGlvbic7XG52YXIgcm91bmQgPSBNYXRoLnJvdW5kLFxuICAgIGFicyA9IE1hdGguYWJzO1xudmFyIG5vdyA9IERhdGUubm93O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBnZXQgdGhlIHByZWZpeGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlcbiAqIEByZXR1cm5zIHtTdHJpbmd8VW5kZWZpbmVkfSBwcmVmaXhlZFxuICovXG5cbmZ1bmN0aW9uIHByZWZpeGVkKG9iaiwgcHJvcGVydHkpIHtcbiAgdmFyIHByZWZpeDtcbiAgdmFyIHByb3A7XG4gIHZhciBjYW1lbFByb3AgPSBwcm9wZXJ0eVswXS50b1VwcGVyQ2FzZSgpICsgcHJvcGVydHkuc2xpY2UoMSk7XG4gIHZhciBpID0gMDtcblxuICB3aGlsZSAoaSA8IFZFTkRPUl9QUkVGSVhFUy5sZW5ndGgpIHtcbiAgICBwcmVmaXggPSBWRU5ET1JfUFJFRklYRVNbaV07XG4gICAgcHJvcCA9IHByZWZpeCA/IHByZWZpeCArIGNhbWVsUHJvcCA6IHByb3BlcnR5O1xuXG4gICAgaWYgKHByb3AgaW4gb2JqKSB7XG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9XG5cbiAgICBpKys7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYywgbm8tbmVzdGVkLXRlcm5hcnkgKi9cbnZhciB3aW47XG5cbmlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gIC8vIHdpbmRvdyBpcyB1bmRlZmluZWQgaW4gbm9kZS5qc1xuICB3aW4gPSB7fTtcbn0gZWxzZSB7XG4gIHdpbiA9IHdpbmRvdztcbn1cblxudmFyIFBSRUZJWEVEX1RPVUNIX0FDVElPTiA9IHByZWZpeGVkKFRFU1RfRUxFTUVOVC5zdHlsZSwgJ3RvdWNoQWN0aW9uJyk7XG52YXIgTkFUSVZFX1RPVUNIX0FDVElPTiA9IFBSRUZJWEVEX1RPVUNIX0FDVElPTiAhPT0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0VG91Y2hBY3Rpb25Qcm9wcygpIHtcbiAgaWYgKCFOQVRJVkVfVE9VQ0hfQUNUSU9OKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHRvdWNoTWFwID0ge307XG4gIHZhciBjc3NTdXBwb3J0cyA9IHdpbi5DU1MgJiYgd2luLkNTUy5zdXBwb3J0cztcbiAgWydhdXRvJywgJ21hbmlwdWxhdGlvbicsICdwYW4teScsICdwYW4teCcsICdwYW4teCBwYW4teScsICdub25lJ10uZm9yRWFjaChmdW5jdGlvbiAodmFsKSB7XG4gICAgLy8gSWYgY3NzLnN1cHBvcnRzIGlzIG5vdCBzdXBwb3J0ZWQgYnV0IHRoZXJlIGlzIG5hdGl2ZSB0b3VjaC1hY3Rpb24gYXNzdW1lIGl0IHN1cHBvcnRzXG4gICAgLy8gYWxsIHZhbHVlcy4gVGhpcyBpcyB0aGUgY2FzZSBmb3IgSUUgMTAgYW5kIDExLlxuICAgIHJldHVybiB0b3VjaE1hcFt2YWxdID0gY3NzU3VwcG9ydHMgPyB3aW4uQ1NTLnN1cHBvcnRzKCd0b3VjaC1hY3Rpb24nLCB2YWwpIDogdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiB0b3VjaE1hcDtcbn1cblxudmFyIFRPVUNIX0FDVElPTl9DT01QVVRFID0gJ2NvbXB1dGUnO1xudmFyIFRPVUNIX0FDVElPTl9BVVRPID0gJ2F1dG8nO1xudmFyIFRPVUNIX0FDVElPTl9NQU5JUFVMQVRJT04gPSAnbWFuaXB1bGF0aW9uJzsgLy8gbm90IGltcGxlbWVudGVkXG5cbnZhciBUT1VDSF9BQ1RJT05fTk9ORSA9ICdub25lJztcbnZhciBUT1VDSF9BQ1RJT05fUEFOX1ggPSAncGFuLXgnO1xudmFyIFRPVUNIX0FDVElPTl9QQU5fWSA9ICdwYW4teSc7XG52YXIgVE9VQ0hfQUNUSU9OX01BUCA9IGdldFRvdWNoQWN0aW9uUHJvcHMoKTtcblxudmFyIE1PQklMRV9SRUdFWCA9IC9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaTtcbnZhciBTVVBQT1JUX1RPVUNIID0gJ29udG91Y2hzdGFydCcgaW4gd2luO1xudmFyIFNVUFBPUlRfUE9JTlRFUl9FVkVOVFMgPSBwcmVmaXhlZCh3aW4sICdQb2ludGVyRXZlbnQnKSAhPT0gdW5kZWZpbmVkO1xudmFyIFNVUFBPUlRfT05MWV9UT1VDSCA9IFNVUFBPUlRfVE9VQ0ggJiYgTU9CSUxFX1JFR0VYLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG52YXIgSU5QVVRfVFlQRV9UT1VDSCA9ICd0b3VjaCc7XG52YXIgSU5QVVRfVFlQRV9QRU4gPSAncGVuJztcbnZhciBJTlBVVF9UWVBFX01PVVNFID0gJ21vdXNlJztcbnZhciBJTlBVVF9UWVBFX0tJTkVDVCA9ICdraW5lY3QnO1xudmFyIENPTVBVVEVfSU5URVJWQUwgPSAyNTtcbnZhciBJTlBVVF9TVEFSVCA9IDE7XG52YXIgSU5QVVRfTU9WRSA9IDI7XG52YXIgSU5QVVRfRU5EID0gNDtcbnZhciBJTlBVVF9DQU5DRUwgPSA4O1xudmFyIERJUkVDVElPTl9OT05FID0gMTtcbnZhciBESVJFQ1RJT05fTEVGVCA9IDI7XG52YXIgRElSRUNUSU9OX1JJR0hUID0gNDtcbnZhciBESVJFQ1RJT05fVVAgPSA4O1xudmFyIERJUkVDVElPTl9ET1dOID0gMTY7XG52YXIgRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fTEVGVCB8IERJUkVDVElPTl9SSUdIVDtcbnZhciBESVJFQ1RJT05fVkVSVElDQUwgPSBESVJFQ1RJT05fVVAgfCBESVJFQ1RJT05fRE9XTjtcbnZhciBESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUw7XG52YXIgUFJPUFNfWFkgPSBbJ3gnLCAneSddO1xudmFyIFBST1BTX0NMSUVOVF9YWSA9IFsnY2xpZW50WCcsICdjbGllbnRZJ107XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHdhbGsgb2JqZWN0cyBhbmQgYXJyYXlzXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRvclxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqL1xuZnVuY3Rpb24gZWFjaChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSB7XG4gIHZhciBpO1xuXG4gIGlmICghb2JqKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9iai5mb3JFYWNoKSB7XG4gICAgb2JqLmZvckVhY2goaXRlcmF0b3IsIGNvbnRleHQpO1xuICB9IGVsc2UgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGkgPSAwO1xuXG4gICAgd2hpbGUgKGkgPCBvYmoubGVuZ3RoKSB7XG4gICAgICBpdGVyYXRvci5jYWxsKGNvbnRleHQsIG9ialtpXSwgaSwgb2JqKTtcbiAgICAgIGkrKztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChpIGluIG9iaikge1xuICAgICAgb2JqLmhhc093blByb3BlcnR5KGkpICYmIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBsZXQgYSBib29sZWFuIHZhbHVlIGFsc28gYmUgYSBmdW5jdGlvbiB0aGF0IG11c3QgcmV0dXJuIGEgYm9vbGVhblxuICogdGhpcyBmaXJzdCBpdGVtIGluIGFyZ3Mgd2lsbCBiZSB1c2VkIGFzIHRoZSBjb250ZXh0XG4gKiBAcGFyYW0ge0Jvb2xlYW58RnVuY3Rpb259IHZhbFxuICogQHBhcmFtIHtBcnJheX0gW2FyZ3NdXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn1cbiAqL1xuXG5mdW5jdGlvbiBib29sT3JGbih2YWwsIGFyZ3MpIHtcbiAgaWYgKHR5cGVvZiB2YWwgPT09IFRZUEVfRlVOQ1RJT04pIHtcbiAgICByZXR1cm4gdmFsLmFwcGx5KGFyZ3MgPyBhcmdzWzBdIHx8IHVuZGVmaW5lZCA6IHVuZGVmaW5lZCwgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBzbWFsbCBpbmRleE9mIHdyYXBwZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBmaW5kXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gZm91bmRcbiAqL1xuZnVuY3Rpb24gaW5TdHIoc3RyLCBmaW5kKSB7XG4gIHJldHVybiBzdHIuaW5kZXhPZihmaW5kKSA+IC0xO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiB3aGVuIHRoZSB0b3VjaEFjdGlvbnMgYXJlIGNvbGxlY3RlZCB0aGV5IGFyZSBub3QgYSB2YWxpZCB2YWx1ZSwgc28gd2UgbmVlZCB0byBjbGVhbiB0aGluZ3MgdXAuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuXG5mdW5jdGlvbiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zKSB7XG4gIC8vIG5vbmVcbiAgaWYgKGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSkge1xuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTk9ORTtcbiAgfVxuXG4gIHZhciBoYXNQYW5YID0gaW5TdHIoYWN0aW9ucywgVE9VQ0hfQUNUSU9OX1BBTl9YKTtcbiAgdmFyIGhhc1BhblkgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1kpOyAvLyBpZiBib3RoIHBhbi14IGFuZCBwYW4teSBhcmUgc2V0IChkaWZmZXJlbnQgcmVjb2duaXplcnNcbiAgLy8gZm9yIGRpZmZlcmVudCBkaXJlY3Rpb25zLCBlLmcuIGhvcml6b250YWwgcGFuIGJ1dCB2ZXJ0aWNhbCBzd2lwZT8pXG4gIC8vIHdlIG5lZWQgbm9uZSAoYXMgb3RoZXJ3aXNlIHdpdGggcGFuLXggcGFuLXkgY29tYmluZWQgbm9uZSBvZiB0aGVzZVxuICAvLyByZWNvZ25pemVycyB3aWxsIHdvcmssIHNpbmNlIHRoZSBicm93c2VyIHdvdWxkIGhhbmRsZSBhbGwgcGFubmluZ1xuXG4gIGlmIChoYXNQYW5YICYmIGhhc1BhblkpIHtcbiAgICByZXR1cm4gVE9VQ0hfQUNUSU9OX05PTkU7XG4gIH0gLy8gcGFuLXggT1IgcGFuLXlcblxuXG4gIGlmIChoYXNQYW5YIHx8IGhhc1BhblkpIHtcbiAgICByZXR1cm4gaGFzUGFuWCA/IFRPVUNIX0FDVElPTl9QQU5fWCA6IFRPVUNIX0FDVElPTl9QQU5fWTtcbiAgfSAvLyBtYW5pcHVsYXRpb25cblxuXG4gIGlmIChpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OKSkge1xuICAgIHJldHVybiBUT1VDSF9BQ1RJT05fTUFOSVBVTEFUSU9OO1xuICB9XG5cbiAgcmV0dXJuIFRPVUNIX0FDVElPTl9BVVRPO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBUb3VjaCBBY3Rpb25cbiAqIHNldHMgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IG9yIHVzZXMgdGhlIGpzIGFsdGVybmF0aXZlXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxudmFyIFRvdWNoQWN0aW9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVG91Y2hBY3Rpb24obWFuYWdlciwgdmFsdWUpIHtcbiAgICB0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIHRoaXMuc2V0KHZhbHVlKTtcbiAgfVxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogc2V0IHRoZSB0b3VjaEFjdGlvbiB2YWx1ZSBvbiB0aGUgZWxlbWVudCBvciBlbmFibGUgdGhlIHBvbHlmaWxsXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBUb3VjaEFjdGlvbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgIC8vIGZpbmQgb3V0IHRoZSB0b3VjaC1hY3Rpb24gYnkgdGhlIGV2ZW50IGhhbmRsZXJzXG4gICAgaWYgKHZhbHVlID09PSBUT1VDSF9BQ1RJT05fQ09NUFVURSkge1xuICAgICAgdmFsdWUgPSB0aGlzLmNvbXB1dGUoKTtcbiAgICB9XG5cbiAgICBpZiAoTkFUSVZFX1RPVUNIX0FDVElPTiAmJiB0aGlzLm1hbmFnZXIuZWxlbWVudC5zdHlsZSAmJiBUT1VDSF9BQ1RJT05fTUFQW3ZhbHVlXSkge1xuICAgICAgdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbUFJFRklYRURfVE9VQ0hfQUNUSU9OXSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9ucyA9IHZhbHVlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICoganVzdCByZS1zZXQgdGhlIHRvdWNoQWN0aW9uIHZhbHVlXG4gICAqL1xuXG5cbiAgX3Byb3RvLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICB0aGlzLnNldCh0aGlzLm1hbmFnZXIub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBjb21wdXRlIHRoZSB2YWx1ZSBmb3IgdGhlIHRvdWNoQWN0aW9uIHByb3BlcnR5IGJhc2VkIG9uIHRoZSByZWNvZ25pemVyJ3Mgc2V0dGluZ3NcbiAgICogQHJldHVybnMge1N0cmluZ30gdmFsdWVcbiAgICovXG5cblxuICBfcHJvdG8uY29tcHV0ZSA9IGZ1bmN0aW9uIGNvbXB1dGUoKSB7XG4gICAgdmFyIGFjdGlvbnMgPSBbXTtcbiAgICBlYWNoKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywgZnVuY3Rpb24gKHJlY29nbml6ZXIpIHtcbiAgICAgIGlmIChib29sT3JGbihyZWNvZ25pemVyLm9wdGlvbnMuZW5hYmxlLCBbcmVjb2duaXplcl0pKSB7XG4gICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLmNvbmNhdChyZWNvZ25pemVyLmdldFRvdWNoQWN0aW9uKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBjbGVhblRvdWNoQWN0aW9ucyhhY3Rpb25zLmpvaW4oJyAnKSk7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gZWFjaCBpbnB1dCBjeWNsZSBhbmQgcHJvdmlkZXMgdGhlIHByZXZlbnRpbmcgb2YgdGhlIGJyb3dzZXIgYmVoYXZpb3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gICAqL1xuXG5cbiAgX3Byb3RvLnByZXZlbnREZWZhdWx0cyA9IGZ1bmN0aW9uIHByZXZlbnREZWZhdWx0cyhpbnB1dCkge1xuICAgIHZhciBzcmNFdmVudCA9IGlucHV0LnNyY0V2ZW50O1xuICAgIHZhciBkaXJlY3Rpb24gPSBpbnB1dC5vZmZzZXREaXJlY3Rpb247IC8vIGlmIHRoZSB0b3VjaCBhY3Rpb24gZGlkIHByZXZlbnRlZCBvbmNlIHRoaXMgc2Vzc2lvblxuXG4gICAgaWYgKHRoaXMubWFuYWdlci5zZXNzaW9uLnByZXZlbnRlZCkge1xuICAgICAgc3JjRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYWN0aW9ucyA9IHRoaXMuYWN0aW9ucztcbiAgICB2YXIgaGFzTm9uZSA9IGluU3RyKGFjdGlvbnMsIFRPVUNIX0FDVElPTl9OT05FKSAmJiAhVE9VQ0hfQUNUSU9OX01BUFtUT1VDSF9BQ1RJT05fTk9ORV07XG4gICAgdmFyIGhhc1BhblkgPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1kpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWV07XG4gICAgdmFyIGhhc1BhblggPSBpblN0cihhY3Rpb25zLCBUT1VDSF9BQ1RJT05fUEFOX1gpICYmICFUT1VDSF9BQ1RJT05fTUFQW1RPVUNIX0FDVElPTl9QQU5fWF07XG5cbiAgICBpZiAoaGFzTm9uZSkge1xuICAgICAgLy8gZG8gbm90IHByZXZlbnQgZGVmYXVsdHMgaWYgdGhpcyBpcyBhIHRhcCBnZXN0dXJlXG4gICAgICB2YXIgaXNUYXBQb2ludGVyID0gaW5wdXQucG9pbnRlcnMubGVuZ3RoID09PSAxO1xuICAgICAgdmFyIGlzVGFwTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IDI7XG4gICAgICB2YXIgaXNUYXBUb3VjaFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPCAyNTA7XG5cbiAgICAgIGlmIChpc1RhcFBvaW50ZXIgJiYgaXNUYXBNb3ZlbWVudCAmJiBpc1RhcFRvdWNoVGltZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGhhc1BhblggJiYgaGFzUGFuWSkge1xuICAgICAgLy8gYHBhbi14IHBhbi15YCBtZWFucyBicm93c2VyIGhhbmRsZXMgYWxsIHNjcm9sbGluZy9wYW5uaW5nLCBkbyBub3QgcHJldmVudFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChoYXNOb25lIHx8IGhhc1BhblkgJiYgZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwgfHwgaGFzUGFuWCAmJiBkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByZXZlbnRTcmMoc3JjRXZlbnQpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIGNhbGwgcHJldmVudERlZmF1bHQgdG8gcHJldmVudCB0aGUgYnJvd3NlcidzIGRlZmF1bHQgYmVoYXZpb3IgKHNjcm9sbGluZyBpbiBtb3N0IGNhc2VzKVxuICAgKiBAcGFyYW0ge09iamVjdH0gc3JjRXZlbnRcbiAgICovXG5cblxuICBfcHJvdG8ucHJldmVudFNyYyA9IGZ1bmN0aW9uIHByZXZlbnRTcmMoc3JjRXZlbnQpIHtcbiAgICB0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQgPSB0cnVlO1xuICAgIHNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgcmV0dXJuIFRvdWNoQWN0aW9uO1xufSgpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBmaW5kIGlmIGEgbm9kZSBpcyBpbiB0aGUgZ2l2ZW4gcGFyZW50XG4gKiBAbWV0aG9kIGhhc1BhcmVudFxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufSBmb3VuZFxuICovXG5mdW5jdGlvbiBoYXNQYXJlbnQobm9kZSwgcGFyZW50KSB7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHBhcmVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogZ2V0IHRoZSBjZW50ZXIgb2YgYWxsIHRoZSBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gcG9pbnRlcnNcbiAqIEByZXR1cm4ge09iamVjdH0gY2VudGVyIGNvbnRhaW5zIGB4YCBhbmQgYHlgIHByb3BlcnRpZXNcbiAqL1xuXG5mdW5jdGlvbiBnZXRDZW50ZXIocG9pbnRlcnMpIHtcbiAgdmFyIHBvaW50ZXJzTGVuZ3RoID0gcG9pbnRlcnMubGVuZ3RoOyAvLyBubyBuZWVkIHRvIGxvb3Agd2hlbiBvbmx5IG9uZSB0b3VjaFxuXG4gIGlmIChwb2ludGVyc0xlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiByb3VuZChwb2ludGVyc1swXS5jbGllbnRYKSxcbiAgICAgIHk6IHJvdW5kKHBvaW50ZXJzWzBdLmNsaWVudFkpXG4gICAgfTtcbiAgfVxuXG4gIHZhciB4ID0gMDtcbiAgdmFyIHkgPSAwO1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBwb2ludGVyc0xlbmd0aCkge1xuICAgIHggKz0gcG9pbnRlcnNbaV0uY2xpZW50WDtcbiAgICB5ICs9IHBvaW50ZXJzW2ldLmNsaWVudFk7XG4gICAgaSsrO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByb3VuZCh4IC8gcG9pbnRlcnNMZW5ndGgpLFxuICAgIHk6IHJvdW5kKHkgLyBwb2ludGVyc0xlbmd0aClcbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogY3JlYXRlIGEgc2ltcGxlIGNsb25lIGZyb20gdGhlIGlucHV0IHVzZWQgZm9yIHN0b3JhZ2Ugb2YgZmlyc3RJbnB1dCBhbmQgZmlyc3RNdWx0aXBsZVxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjbG9uZWRJbnB1dERhdGFcbiAqL1xuXG5mdW5jdGlvbiBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCkge1xuICAvLyBtYWtlIGEgc2ltcGxlIGNvcHkgb2YgdGhlIHBvaW50ZXJzIGJlY2F1c2Ugd2Ugd2lsbCBnZXQgYSByZWZlcmVuY2UgaWYgd2UgZG9uJ3RcbiAgLy8gd2Ugb25seSBuZWVkIGNsaWVudFhZIGZvciB0aGUgY2FsY3VsYXRpb25zXG4gIHZhciBwb2ludGVycyA9IFtdO1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBpbnB1dC5wb2ludGVycy5sZW5ndGgpIHtcbiAgICBwb2ludGVyc1tpXSA9IHtcbiAgICAgIGNsaWVudFg6IHJvdW5kKGlucHV0LnBvaW50ZXJzW2ldLmNsaWVudFgpLFxuICAgICAgY2xpZW50WTogcm91bmQoaW5wdXQucG9pbnRlcnNbaV0uY2xpZW50WSlcbiAgICB9O1xuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGltZVN0YW1wOiBub3coKSxcbiAgICBwb2ludGVyczogcG9pbnRlcnMsXG4gICAgY2VudGVyOiBnZXRDZW50ZXIocG9pbnRlcnMpLFxuICAgIGRlbHRhWDogaW5wdXQuZGVsdGFYLFxuICAgIGRlbHRhWTogaW5wdXQuZGVsdGFZXG4gIH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGNhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gcDEge3gsIHl9XG4gKiBAcGFyYW0ge09iamVjdH0gcDIge3gsIHl9XG4gKiBAcGFyYW0ge0FycmF5fSBbcHJvcHNdIGNvbnRhaW5pbmcgeCBhbmQgeSBrZXlzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpc3RhbmNlXG4gKi9cblxuZnVuY3Rpb24gZ2V0RGlzdGFuY2UocDEsIHAyLCBwcm9wcykge1xuICBpZiAoIXByb3BzKSB7XG4gICAgcHJvcHMgPSBQUk9QU19YWTtcbiAgfVxuXG4gIHZhciB4ID0gcDJbcHJvcHNbMF1dIC0gcDFbcHJvcHNbMF1dO1xuICB2YXIgeSA9IHAyW3Byb3BzWzFdXSAtIHAxW3Byb3BzWzFdXTtcbiAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogY2FsY3VsYXRlIHRoZSBhbmdsZSBiZXR3ZWVuIHR3byBjb29yZGluYXRlc1xuICogQHBhcmFtIHtPYmplY3R9IHAxXG4gKiBAcGFyYW0ge09iamVjdH0gcDJcbiAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wc10gY29udGFpbmluZyB4IGFuZCB5IGtleXNcbiAqIEByZXR1cm4ge051bWJlcn0gYW5nbGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRBbmdsZShwMSwgcDIsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICBwcm9wcyA9IFBST1BTX1hZO1xuICB9XG5cbiAgdmFyIHggPSBwMltwcm9wc1swXV0gLSBwMVtwcm9wc1swXV07XG4gIHZhciB5ID0gcDJbcHJvcHNbMV1dIC0gcDFbcHJvcHNbMV1dO1xuICByZXR1cm4gTWF0aC5hdGFuMih5LCB4KSAqIDE4MCAvIE1hdGguUEk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGdldCB0aGUgZGlyZWN0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiBAcmV0dXJuIHtOdW1iZXJ9IGRpcmVjdGlvblxuICovXG5cbmZ1bmN0aW9uIGdldERpcmVjdGlvbih4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIERJUkVDVElPTl9OT05FO1xuICB9XG5cbiAgaWYgKGFicyh4KSA+PSBhYnMoeSkpIHtcbiAgICByZXR1cm4geCA8IDAgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVDtcbiAgfVxuXG4gIHJldHVybiB5IDwgMCA/IERJUkVDVElPTl9VUCA6IERJUkVDVElPTl9ET1dOO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRGVsdGFYWShzZXNzaW9uLCBpbnB1dCkge1xuICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyOyAvLyBsZXQgeyBvZmZzZXREZWx0YTpvZmZzZXQgPSB7fSwgcHJldkRlbHRhID0ge30sIHByZXZJbnB1dCA9IHt9IH0gPSBzZXNzaW9uO1xuICAvLyBqc2NzIHRocm93aW5nIGVycm9yIG9uIGRlZmFsdXQgZGVzdHJ1Y3R1cmVkIHZhbHVlcyBhbmQgd2l0aG91dCBkZWZhdWx0cyB0ZXN0cyBmYWlsXG5cbiAgdmFyIG9mZnNldCA9IHNlc3Npb24ub2Zmc2V0RGVsdGEgfHwge307XG4gIHZhciBwcmV2RGVsdGEgPSBzZXNzaW9uLnByZXZEZWx0YSB8fCB7fTtcbiAgdmFyIHByZXZJbnB1dCA9IHNlc3Npb24ucHJldklucHV0IHx8IHt9O1xuXG4gIGlmIChpbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX1NUQVJUIHx8IHByZXZJbnB1dC5ldmVudFR5cGUgPT09IElOUFVUX0VORCkge1xuICAgIHByZXZEZWx0YSA9IHNlc3Npb24ucHJldkRlbHRhID0ge1xuICAgICAgeDogcHJldklucHV0LmRlbHRhWCB8fCAwLFxuICAgICAgeTogcHJldklucHV0LmRlbHRhWSB8fCAwXG4gICAgfTtcbiAgICBvZmZzZXQgPSBzZXNzaW9uLm9mZnNldERlbHRhID0ge1xuICAgICAgeDogY2VudGVyLngsXG4gICAgICB5OiBjZW50ZXIueVxuICAgIH07XG4gIH1cblxuICBpbnB1dC5kZWx0YVggPSBwcmV2RGVsdGEueCArIChjZW50ZXIueCAtIG9mZnNldC54KTtcbiAgaW5wdXQuZGVsdGFZID0gcHJldkRlbHRhLnkgKyAoY2VudGVyLnkgLSBvZmZzZXQueSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGNhbGN1bGF0ZSB0aGUgdmVsb2NpdHkgYmV0d2VlbiB0d28gcG9pbnRzLiB1bml0IGlzIGluIHB4IHBlciBtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YVRpbWVcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogQHJldHVybiB7T2JqZWN0fSB2ZWxvY2l0eSBgeGAgYW5kIGB5YFxuICovXG5mdW5jdGlvbiBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIHgsIHkpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiB4IC8gZGVsdGFUaW1lIHx8IDAsXG4gICAgeTogeSAvIGRlbHRhVGltZSB8fCAwXG4gIH07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGNhbGN1bGF0ZSB0aGUgc2NhbGUgZmFjdG9yIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBubyBzY2FsZSBpcyAxLCBhbmQgZ29lcyBkb3duIHRvIDAgd2hlbiBwaW5jaGVkIHRvZ2V0aGVyLCBhbmQgYmlnZ2VyIHdoZW4gcGluY2hlZCBvdXRcbiAqIEBwYXJhbSB7QXJyYXl9IHN0YXJ0IGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcGFyYW0ge0FycmF5fSBlbmQgYXJyYXkgb2YgcG9pbnRlcnNcbiAqIEByZXR1cm4ge051bWJlcn0gc2NhbGVcbiAqL1xuXG5mdW5jdGlvbiBnZXRTY2FsZShzdGFydCwgZW5kKSB7XG4gIHJldHVybiBnZXREaXN0YW5jZShlbmRbMF0sIGVuZFsxXSwgUFJPUFNfQ0xJRU5UX1hZKSAvIGdldERpc3RhbmNlKHN0YXJ0WzBdLCBzdGFydFsxXSwgUFJPUFNfQ0xJRU5UX1hZKTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogY2FsY3VsYXRlIHRoZSByb3RhdGlvbiBkZWdyZWVzIGJldHdlZW4gdHdvIHBvaW50ZXJzZXRzXG4gKiBAcGFyYW0ge0FycmF5fSBzdGFydCBhcnJheSBvZiBwb2ludGVyc1xuICogQHBhcmFtIHtBcnJheX0gZW5kIGFycmF5IG9mIHBvaW50ZXJzXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHJvdGF0aW9uXG4gKi9cblxuZnVuY3Rpb24gZ2V0Um90YXRpb24oc3RhcnQsIGVuZCkge1xuICByZXR1cm4gZ2V0QW5nbGUoZW5kWzFdLCBlbmRbMF0sIFBST1BTX0NMSUVOVF9YWSkgKyBnZXRBbmdsZShzdGFydFsxXSwgc3RhcnRbMF0sIFBST1BTX0NMSUVOVF9YWSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHZlbG9jaXR5IGlzIGNhbGN1bGF0ZWQgZXZlcnkgeCBtc1xuICogQHBhcmFtIHtPYmplY3R9IHNlc3Npb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5cbmZ1bmN0aW9uIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCkge1xuICB2YXIgbGFzdCA9IHNlc3Npb24ubGFzdEludGVydmFsIHx8IGlucHV0O1xuICB2YXIgZGVsdGFUaW1lID0gaW5wdXQudGltZVN0YW1wIC0gbGFzdC50aW1lU3RhbXA7XG4gIHZhciB2ZWxvY2l0eTtcbiAgdmFyIHZlbG9jaXR5WDtcbiAgdmFyIHZlbG9jaXR5WTtcbiAgdmFyIGRpcmVjdGlvbjtcblxuICBpZiAoaW5wdXQuZXZlbnRUeXBlICE9PSBJTlBVVF9DQU5DRUwgJiYgKGRlbHRhVGltZSA+IENPTVBVVEVfSU5URVJWQUwgfHwgbGFzdC52ZWxvY2l0eSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIHZhciBkZWx0YVggPSBpbnB1dC5kZWx0YVggLSBsYXN0LmRlbHRhWDtcbiAgICB2YXIgZGVsdGFZID0gaW5wdXQuZGVsdGFZIC0gbGFzdC5kZWx0YVk7XG4gICAgdmFyIHYgPSBnZXRWZWxvY2l0eShkZWx0YVRpbWUsIGRlbHRhWCwgZGVsdGFZKTtcbiAgICB2ZWxvY2l0eVggPSB2Lng7XG4gICAgdmVsb2NpdHlZID0gdi55O1xuICAgIHZlbG9jaXR5ID0gYWJzKHYueCkgPiBhYnModi55KSA/IHYueCA6IHYueTtcbiAgICBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIHNlc3Npb24ubGFzdEludGVydmFsID0gaW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gdXNlIGxhdGVzdCB2ZWxvY2l0eSBpbmZvIGlmIGl0IGRvZXNuJ3Qgb3ZlcnRha2UgYSBtaW5pbXVtIHBlcmlvZFxuICAgIHZlbG9jaXR5ID0gbGFzdC52ZWxvY2l0eTtcbiAgICB2ZWxvY2l0eVggPSBsYXN0LnZlbG9jaXR5WDtcbiAgICB2ZWxvY2l0eVkgPSBsYXN0LnZlbG9jaXR5WTtcbiAgICBkaXJlY3Rpb24gPSBsYXN0LmRpcmVjdGlvbjtcbiAgfVxuXG4gIGlucHV0LnZlbG9jaXR5ID0gdmVsb2NpdHk7XG4gIGlucHV0LnZlbG9jaXR5WCA9IHZlbG9jaXR5WDtcbiAgaW5wdXQudmVsb2NpdHlZID0gdmVsb2NpdHlZO1xuICBpbnB1dC5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG59XG5cbi8qKlxuKiBAcHJpdmF0ZVxuICogZXh0ZW5kIHRoZSBkYXRhIHdpdGggc29tZSB1c2FibGUgcHJvcGVydGllcyBsaWtlIHNjYWxlLCByb3RhdGUsIHZlbG9jaXR5IGV0Y1xuICogQHBhcmFtIHtPYmplY3R9IG1hbmFnZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5cbmZ1bmN0aW9uIGNvbXB1dGVJbnB1dERhdGEobWFuYWdlciwgaW5wdXQpIHtcbiAgdmFyIHNlc3Npb24gPSBtYW5hZ2VyLnNlc3Npb247XG4gIHZhciBwb2ludGVycyA9IGlucHV0LnBvaW50ZXJzO1xuICB2YXIgcG9pbnRlcnNMZW5ndGggPSBwb2ludGVycy5sZW5ndGg7IC8vIHN0b3JlIHRoZSBmaXJzdCBpbnB1dCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIGFuZCBkaXJlY3Rpb25cblxuICBpZiAoIXNlc3Npb24uZmlyc3RJbnB1dCkge1xuICAgIHNlc3Npb24uZmlyc3RJbnB1dCA9IHNpbXBsZUNsb25lSW5wdXREYXRhKGlucHV0KTtcbiAgfSAvLyB0byBjb21wdXRlIHNjYWxlIGFuZCByb3RhdGlvbiB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBtdWx0aXBsZSB0b3VjaGVzXG5cblxuICBpZiAocG9pbnRlcnNMZW5ndGggPiAxICYmICFzZXNzaW9uLmZpcnN0TXVsdGlwbGUpIHtcbiAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBzaW1wbGVDbG9uZUlucHV0RGF0YShpbnB1dCk7XG4gIH0gZWxzZSBpZiAocG9pbnRlcnNMZW5ndGggPT09IDEpIHtcbiAgICBzZXNzaW9uLmZpcnN0TXVsdGlwbGUgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBmaXJzdElucHV0ID0gc2Vzc2lvbi5maXJzdElucHV0LFxuICAgICAgZmlyc3RNdWx0aXBsZSA9IHNlc3Npb24uZmlyc3RNdWx0aXBsZTtcbiAgdmFyIG9mZnNldENlbnRlciA9IGZpcnN0TXVsdGlwbGUgPyBmaXJzdE11bHRpcGxlLmNlbnRlciA6IGZpcnN0SW5wdXQuY2VudGVyO1xuICB2YXIgY2VudGVyID0gaW5wdXQuY2VudGVyID0gZ2V0Q2VudGVyKHBvaW50ZXJzKTtcbiAgaW5wdXQudGltZVN0YW1wID0gbm93KCk7XG4gIGlucHV0LmRlbHRhVGltZSA9IGlucHV0LnRpbWVTdGFtcCAtIGZpcnN0SW5wdXQudGltZVN0YW1wO1xuICBpbnB1dC5hbmdsZSA9IGdldEFuZ2xlKG9mZnNldENlbnRlciwgY2VudGVyKTtcbiAgaW5wdXQuZGlzdGFuY2UgPSBnZXREaXN0YW5jZShvZmZzZXRDZW50ZXIsIGNlbnRlcik7XG4gIGNvbXB1dGVEZWx0YVhZKHNlc3Npb24sIGlucHV0KTtcbiAgaW5wdXQub2Zmc2V0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKGlucHV0LmRlbHRhWCwgaW5wdXQuZGVsdGFZKTtcbiAgdmFyIG92ZXJhbGxWZWxvY2l0eSA9IGdldFZlbG9jaXR5KGlucHV0LmRlbHRhVGltZSwgaW5wdXQuZGVsdGFYLCBpbnB1dC5kZWx0YVkpO1xuICBpbnB1dC5vdmVyYWxsVmVsb2NpdHlYID0gb3ZlcmFsbFZlbG9jaXR5Lng7XG4gIGlucHV0Lm92ZXJhbGxWZWxvY2l0eVkgPSBvdmVyYWxsVmVsb2NpdHkueTtcbiAgaW5wdXQub3ZlcmFsbFZlbG9jaXR5ID0gYWJzKG92ZXJhbGxWZWxvY2l0eS54KSA+IGFicyhvdmVyYWxsVmVsb2NpdHkueSkgPyBvdmVyYWxsVmVsb2NpdHkueCA6IG92ZXJhbGxWZWxvY2l0eS55O1xuICBpbnB1dC5zY2FsZSA9IGZpcnN0TXVsdGlwbGUgPyBnZXRTY2FsZShmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAxO1xuICBpbnB1dC5yb3RhdGlvbiA9IGZpcnN0TXVsdGlwbGUgPyBnZXRSb3RhdGlvbihmaXJzdE11bHRpcGxlLnBvaW50ZXJzLCBwb2ludGVycykgOiAwO1xuICBpbnB1dC5tYXhQb2ludGVycyA9ICFzZXNzaW9uLnByZXZJbnB1dCA/IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA6IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA+IHNlc3Npb24ucHJldklucHV0Lm1heFBvaW50ZXJzID8gaW5wdXQucG9pbnRlcnMubGVuZ3RoIDogc2Vzc2lvbi5wcmV2SW5wdXQubWF4UG9pbnRlcnM7XG4gIGNvbXB1dGVJbnRlcnZhbElucHV0RGF0YShzZXNzaW9uLCBpbnB1dCk7IC8vIGZpbmQgdGhlIGNvcnJlY3QgdGFyZ2V0XG5cbiAgdmFyIHRhcmdldCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgdmFyIHNyY0V2ZW50ID0gaW5wdXQuc3JjRXZlbnQ7XG4gIHZhciBzcmNFdmVudFRhcmdldDtcblxuICBpZiAoc3JjRXZlbnQuY29tcG9zZWRQYXRoKSB7XG4gICAgc3JjRXZlbnRUYXJnZXQgPSBzcmNFdmVudC5jb21wb3NlZFBhdGgoKVswXTtcbiAgfSBlbHNlIGlmIChzcmNFdmVudC5wYXRoKSB7XG4gICAgc3JjRXZlbnRUYXJnZXQgPSBzcmNFdmVudC5wYXRoWzBdO1xuICB9IGVsc2Uge1xuICAgIHNyY0V2ZW50VGFyZ2V0ID0gc3JjRXZlbnQudGFyZ2V0O1xuICB9XG5cbiAgaWYgKGhhc1BhcmVudChzcmNFdmVudFRhcmdldCwgdGFyZ2V0KSkge1xuICAgIHRhcmdldCA9IHNyY0V2ZW50VGFyZ2V0O1xuICB9XG5cbiAgaW5wdXQudGFyZ2V0ID0gdGFyZ2V0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBoYW5kbGUgaW5wdXQgZXZlbnRzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICovXG5cbmZ1bmN0aW9uIGlucHV0SGFuZGxlcihtYW5hZ2VyLCBldmVudFR5cGUsIGlucHV0KSB7XG4gIHZhciBwb2ludGVyc0xlbiA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aDtcbiAgdmFyIGNoYW5nZWRQb2ludGVyc0xlbiA9IGlucHV0LmNoYW5nZWRQb2ludGVycy5sZW5ndGg7XG4gIHZhciBpc0ZpcnN0ID0gZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQgJiYgcG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDA7XG4gIHZhciBpc0ZpbmFsID0gZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgcG9pbnRlcnNMZW4gLSBjaGFuZ2VkUG9pbnRlcnNMZW4gPT09IDA7XG4gIGlucHV0LmlzRmlyc3QgPSAhIWlzRmlyc3Q7XG4gIGlucHV0LmlzRmluYWwgPSAhIWlzRmluYWw7XG5cbiAgaWYgKGlzRmlyc3QpIHtcbiAgICBtYW5hZ2VyLnNlc3Npb24gPSB7fTtcbiAgfSAvLyBzb3VyY2UgZXZlbnQgaXMgdGhlIG5vcm1hbGl6ZWQgdmFsdWUgb2YgdGhlIGRvbUV2ZW50c1xuICAvLyBsaWtlICd0b3VjaHN0YXJ0LCBtb3VzZXVwLCBwb2ludGVyZG93bidcblxuXG4gIGlucHV0LmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsgLy8gY29tcHV0ZSBzY2FsZSwgcm90YXRpb24gZXRjXG5cbiAgY29tcHV0ZUlucHV0RGF0YShtYW5hZ2VyLCBpbnB1dCk7IC8vIGVtaXQgc2VjcmV0IGV2ZW50XG5cbiAgbWFuYWdlci5lbWl0KCdoYW1tZXIuaW5wdXQnLCBpbnB1dCk7XG4gIG1hbmFnZXIucmVjb2duaXplKGlucHV0KTtcbiAgbWFuYWdlci5zZXNzaW9uLnByZXZJbnB1dCA9IGlucHV0O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBzcGxpdCBzdHJpbmcgb24gd2hpdGVzcGFjZVxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybnMge0FycmF5fSB3b3Jkc1xuICovXG5mdW5jdGlvbiBzcGxpdFN0cihzdHIpIHtcbiAgcmV0dXJuIHN0ci50cmltKCkuc3BsaXQoL1xccysvZyk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGFkZEV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHJlbW92ZUV2ZW50TGlzdGVuZXIgd2l0aCBtdWx0aXBsZSBldmVudHMgYXQgb25jZVxuICogQHBhcmFtIHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXJcbiAqL1xuXG5mdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVycyh0YXJnZXQsIHR5cGVzLCBoYW5kbGVyKSB7XG4gIGVhY2goc3BsaXRTdHIodHlwZXMpLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGZhbHNlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGdldCB0aGUgd2luZG93IG9iamVjdCBvZiBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcmV0dXJucyB7RG9jdW1lbnRWaWV3fFdpbmRvd31cbiAqL1xuZnVuY3Rpb24gZ2V0V2luZG93Rm9yRWxlbWVudChlbGVtZW50KSB7XG4gIHZhciBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZWxlbWVudDtcbiAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93IHx8IHdpbmRvdztcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogY3JlYXRlIG5ldyBpbnB1dCB0eXBlIG1hbmFnZXJcbiAqIEBwYXJhbSB7TWFuYWdlcn0gbWFuYWdlclxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqIEByZXR1cm5zIHtJbnB1dH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbnZhciBJbnB1dCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIElucHV0KG1hbmFnZXIsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMubWFuYWdlciA9IG1hbmFnZXI7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuZWxlbWVudCA9IG1hbmFnZXIuZWxlbWVudDtcbiAgICB0aGlzLnRhcmdldCA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dFRhcmdldDsgLy8gc21hbGxlciB3cmFwcGVyIGFyb3VuZCB0aGUgaGFuZGxlciwgZm9yIHRoZSBzY29wZSBhbmQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhlIG1hbmFnZXIsXG4gICAgLy8gc28gd2hlbiBkaXNhYmxlZCB0aGUgaW5wdXQgZXZlbnRzIGFyZSBjb21wbGV0ZWx5IGJ5cGFzc2VkLlxuXG4gICAgdGhpcy5kb21IYW5kbGVyID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICBpZiAoYm9vbE9yRm4obWFuYWdlci5vcHRpb25zLmVuYWJsZSwgW21hbmFnZXJdKSkge1xuICAgICAgICBzZWxmLmhhbmRsZXIoZXYpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogc2hvdWxkIGhhbmRsZSB0aGUgaW5wdXRFdmVudCBkYXRhIGFuZCB0cmlnZ2VyIHRoZSBjYWxsYmFja1xuICAgKiBAdmlydHVhbFxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBJbnB1dC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge307XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBiaW5kIHRoZSBldmVudHNcbiAgICovXG5cblxuICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdGhpcy5ldkVsICYmIGFkZEV2ZW50TGlzdGVuZXJzKHRoaXMuZWxlbWVudCwgdGhpcy5ldkVsLCB0aGlzLmRvbUhhbmRsZXIpO1xuICAgIHRoaXMuZXZUYXJnZXQgJiYgYWRkRXZlbnRMaXN0ZW5lcnModGhpcy50YXJnZXQsIHRoaXMuZXZUYXJnZXQsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgdGhpcy5ldldpbiAmJiBhZGRFdmVudExpc3RlbmVycyhnZXRXaW5kb3dGb3JFbGVtZW50KHRoaXMuZWxlbWVudCksIHRoaXMuZXZXaW4sIHRoaXMuZG9tSGFuZGxlcik7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiB1bmJpbmQgdGhlIGV2ZW50c1xuICAgKi9cblxuXG4gIF9wcm90by5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICB0aGlzLmV2RWwgJiYgcmVtb3ZlRXZlbnRMaXN0ZW5lcnModGhpcy5lbGVtZW50LCB0aGlzLmV2RWwsIHRoaXMuZG9tSGFuZGxlcik7XG4gICAgdGhpcy5ldlRhcmdldCAmJiByZW1vdmVFdmVudExpc3RlbmVycyh0aGlzLnRhcmdldCwgdGhpcy5ldlRhcmdldCwgdGhpcy5kb21IYW5kbGVyKTtcbiAgICB0aGlzLmV2V2luICYmIHJlbW92ZUV2ZW50TGlzdGVuZXJzKGdldFdpbmRvd0ZvckVsZW1lbnQodGhpcy5lbGVtZW50KSwgdGhpcy5ldldpbiwgdGhpcy5kb21IYW5kbGVyKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXQ7XG59KCk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGZpbmQgaWYgYSBhcnJheSBjb250YWlucyB0aGUgb2JqZWN0IHVzaW5nIGluZGV4T2Ygb3IgYSBzaW1wbGUgcG9seUZpbGxcbiAqIEBwYXJhbSB7QXJyYXl9IHNyY1xuICogQHBhcmFtIHtTdHJpbmd9IGZpbmRcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmluZEJ5S2V5XVxuICogQHJldHVybiB7Qm9vbGVhbnxOdW1iZXJ9IGZhbHNlIHdoZW4gbm90IGZvdW5kLCBvciB0aGUgaW5kZXhcbiAqL1xuZnVuY3Rpb24gaW5BcnJheShzcmMsIGZpbmQsIGZpbmRCeUtleSkge1xuICBpZiAoc3JjLmluZGV4T2YgJiYgIWZpbmRCeUtleSkge1xuICAgIHJldHVybiBzcmMuaW5kZXhPZihmaW5kKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHNyYy5sZW5ndGgpIHtcbiAgICAgIGlmIChmaW5kQnlLZXkgJiYgc3JjW2ldW2ZpbmRCeUtleV0gPT0gZmluZCB8fCAhZmluZEJ5S2V5ICYmIHNyY1tpXSA9PT0gZmluZCkge1xuICAgICAgICAvLyBkbyBub3QgdXNlID09PSBoZXJlLCB0ZXN0IGZhaWxzXG4gICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cbnZhciBQT0lOVEVSX0lOUFVUX01BUCA9IHtcbiAgcG9pbnRlcmRvd246IElOUFVUX1NUQVJULFxuICBwb2ludGVybW92ZTogSU5QVVRfTU9WRSxcbiAgcG9pbnRlcnVwOiBJTlBVVF9FTkQsXG4gIHBvaW50ZXJjYW5jZWw6IElOUFVUX0NBTkNFTCxcbiAgcG9pbnRlcm91dDogSU5QVVRfQ0FOQ0VMXG59OyAvLyBpbiBJRTEwIHRoZSBwb2ludGVyIHR5cGVzIGlzIGRlZmluZWQgYXMgYW4gZW51bVxuXG52YXIgSUUxMF9QT0lOVEVSX1RZUEVfRU5VTSA9IHtcbiAgMjogSU5QVVRfVFlQRV9UT1VDSCxcbiAgMzogSU5QVVRfVFlQRV9QRU4sXG4gIDQ6IElOUFVUX1RZUEVfTU9VU0UsXG4gIDU6IElOUFVUX1RZUEVfS0lORUNUIC8vIHNlZSBodHRwczovL3R3aXR0ZXIuY29tL2phY29icm9zc2kvc3RhdHVzLzQ4MDU5NjQzODQ4OTg5MDgxNlxuXG59O1xudmFyIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAncG9pbnRlcmRvd24nO1xudmFyIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbCc7IC8vIElFMTAgaGFzIHByZWZpeGVkIHN1cHBvcnQsIGFuZCBjYXNlLXNlbnNpdGl2ZVxuXG5pZiAod2luLk1TUG9pbnRlckV2ZW50ICYmICF3aW4uUG9pbnRlckV2ZW50KSB7XG4gIFBPSU5URVJfRUxFTUVOVF9FVkVOVFMgPSAnTVNQb2ludGVyRG93bic7XG4gIFBPSU5URVJfV0lORE9XX0VWRU5UUyA9ICdNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbCc7XG59XG4vKipcbiAqIEBwcml2YXRlXG4gKiBQb2ludGVyIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5cblxudmFyIFBvaW50ZXJFdmVudElucHV0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfSW5wdXQpIHtcbiAgX2luaGVyaXRzTG9vc2UoUG9pbnRlckV2ZW50SW5wdXQsIF9JbnB1dCk7XG5cbiAgZnVuY3Rpb24gUG9pbnRlckV2ZW50SW5wdXQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHByb3RvID0gUG9pbnRlckV2ZW50SW5wdXQucHJvdG90eXBlO1xuICAgIHByb3RvLmV2RWwgPSBQT0lOVEVSX0VMRU1FTlRfRVZFTlRTO1xuICAgIHByb3RvLmV2V2luID0gUE9JTlRFUl9XSU5ET1dfRVZFTlRTO1xuICAgIF90aGlzID0gX0lucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICBfdGhpcy5zdG9yZSA9IF90aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzID0gW107XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBQb2ludGVyRXZlbnRJbnB1dC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKGV2KSB7XG4gICAgdmFyIHN0b3JlID0gdGhpcy5zdG9yZTtcbiAgICB2YXIgcmVtb3ZlUG9pbnRlciA9IGZhbHNlO1xuICAgIHZhciBldmVudFR5cGVOb3JtYWxpemVkID0gZXYudHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ21zJywgJycpO1xuICAgIHZhciBldmVudFR5cGUgPSBQT0lOVEVSX0lOUFVUX01BUFtldmVudFR5cGVOb3JtYWxpemVkXTtcbiAgICB2YXIgcG9pbnRlclR5cGUgPSBJRTEwX1BPSU5URVJfVFlQRV9FTlVNW2V2LnBvaW50ZXJUeXBlXSB8fCBldi5wb2ludGVyVHlwZTtcbiAgICB2YXIgaXNUb3VjaCA9IHBvaW50ZXJUeXBlID09PSBJTlBVVF9UWVBFX1RPVUNIOyAvLyBnZXQgaW5kZXggb2YgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG4gICAgdmFyIHN0b3JlSW5kZXggPSBpbkFycmF5KHN0b3JlLCBldi5wb2ludGVySWQsICdwb2ludGVySWQnKTsgLy8gc3RhcnQgYW5kIG1vdXNlIG11c3QgYmUgZG93blxuXG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX1NUQVJUICYmIChldi5idXR0b24gPT09IDAgfHwgaXNUb3VjaCkpIHtcbiAgICAgIGlmIChzdG9yZUluZGV4IDwgMCkge1xuICAgICAgICBzdG9yZS5wdXNoKGV2KTtcbiAgICAgICAgc3RvcmVJbmRleCA9IHN0b3JlLmxlbmd0aCAtIDE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgICAgcmVtb3ZlUG9pbnRlciA9IHRydWU7XG4gICAgfSAvLyBpdCBub3QgZm91bmQsIHNvIHRoZSBwb2ludGVyIGhhc24ndCBiZWVuIGRvd24gKHNvIGl0J3MgcHJvYmFibHkgYSBob3ZlcilcblxuXG4gICAgaWYgKHN0b3JlSW5kZXggPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyB1cGRhdGUgdGhlIGV2ZW50IGluIHRoZSBzdG9yZVxuXG5cbiAgICBzdG9yZVtzdG9yZUluZGV4XSA9IGV2O1xuICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgIHBvaW50ZXJzOiBzdG9yZSxcbiAgICAgIGNoYW5nZWRQb2ludGVyczogW2V2XSxcbiAgICAgIHBvaW50ZXJUeXBlOiBwb2ludGVyVHlwZSxcbiAgICAgIHNyY0V2ZW50OiBldlxuICAgIH0pO1xuXG4gICAgaWYgKHJlbW92ZVBvaW50ZXIpIHtcbiAgICAgIC8vIHJlbW92ZSBmcm9tIHRoZSBzdG9yZVxuICAgICAgc3RvcmUuc3BsaWNlKHN0b3JlSW5kZXgsIDEpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUG9pbnRlckV2ZW50SW5wdXQ7XG59KElucHV0KTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogY29udmVydCBhcnJheS1saWtlIG9iamVjdHMgdG8gcmVhbCBhcnJheXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdG9BcnJheShvYmopIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaiwgMCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHVuaXF1ZSBhcnJheSB3aXRoIG9iamVjdHMgYmFzZWQgb24gYSBrZXkgKGxpa2UgJ2lkJykgb3IganVzdCBieSB0aGUgYXJyYXkncyB2YWx1ZVxuICogQHBhcmFtIHtBcnJheX0gc3JjIFt7aWQ6MX0se2lkOjJ9LHtpZDoxfV1cbiAqIEBwYXJhbSB7U3RyaW5nfSBba2V5XVxuICogQHBhcmFtIHtCb29sZWFufSBbc29ydD1GYWxzZV1cbiAqIEByZXR1cm5zIHtBcnJheX0gW3tpZDoxfSx7aWQ6Mn1dXG4gKi9cblxuZnVuY3Rpb24gdW5pcXVlQXJyYXkoc3JjLCBrZXksIHNvcnQpIHtcbiAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgdmFyIHZhbHVlcyA9IFtdO1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBzcmMubGVuZ3RoKSB7XG4gICAgdmFyIHZhbCA9IGtleSA/IHNyY1tpXVtrZXldIDogc3JjW2ldO1xuXG4gICAgaWYgKGluQXJyYXkodmFsdWVzLCB2YWwpIDwgMCkge1xuICAgICAgcmVzdWx0cy5wdXNoKHNyY1tpXSk7XG4gICAgfVxuXG4gICAgdmFsdWVzW2ldID0gdmFsO1xuICAgIGkrKztcbiAgfVxuXG4gIGlmIChzb3J0KSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYVtrZXldID4gYltrZXldO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG5cbnZhciBUT1VDSF9JTlBVVF9NQVAgPSB7XG4gIHRvdWNoc3RhcnQ6IElOUFVUX1NUQVJULFxuICB0b3VjaG1vdmU6IElOUFVUX01PVkUsXG4gIHRvdWNoZW5kOiBJTlBVVF9FTkQsXG4gIHRvdWNoY2FuY2VsOiBJTlBVVF9DQU5DRUxcbn07XG52YXIgVE9VQ0hfVEFSR0VUX0VWRU5UUyA9ICd0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbCc7XG4vKipcbiAqIEBwcml2YXRlXG4gKiBNdWx0aS11c2VyIHRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5cbnZhciBUb3VjaElucHV0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfSW5wdXQpIHtcbiAgX2luaGVyaXRzTG9vc2UoVG91Y2hJbnB1dCwgX0lucHV0KTtcblxuICBmdW5jdGlvbiBUb3VjaElucHV0KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIFRvdWNoSW5wdXQucHJvdG90eXBlLmV2VGFyZ2V0ID0gVE9VQ0hfVEFSR0VUX0VWRU5UUztcbiAgICBfdGhpcyA9IF9JbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgX3RoaXMudGFyZ2V0SWRzID0ge307IC8vIHRoaXMuZXZUYXJnZXQgPSBUT1VDSF9UQVJHRVRfRVZFTlRTO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRvdWNoSW5wdXQucHJvdG90eXBlO1xuXG4gIF9wcm90by5oYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcihldikge1xuICAgIHZhciB0eXBlID0gVE9VQ0hfSU5QVVRfTUFQW2V2LnR5cGVdO1xuICAgIHZhciB0b3VjaGVzID0gZ2V0VG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTtcblxuICAgIGlmICghdG91Y2hlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCB0eXBlLCB7XG4gICAgICBwb2ludGVyczogdG91Y2hlc1swXSxcbiAgICAgIGNoYW5nZWRQb2ludGVyczogdG91Y2hlc1sxXSxcbiAgICAgIHBvaW50ZXJUeXBlOiBJTlBVVF9UWVBFX1RPVUNILFxuICAgICAgc3JjRXZlbnQ6IGV2XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFRvdWNoSW5wdXQ7XG59KElucHV0KTtcblxuZnVuY3Rpb24gZ2V0VG91Y2hlcyhldiwgdHlwZSkge1xuICB2YXIgYWxsVG91Y2hlcyA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gIHZhciB0YXJnZXRJZHMgPSB0aGlzLnRhcmdldElkczsgLy8gd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSB0b3VjaCwgdGhlIHByb2Nlc3MgY2FuIGJlIHNpbXBsaWZpZWRcblxuICBpZiAodHlwZSAmIChJTlBVVF9TVEFSVCB8IElOUFVUX01PVkUpICYmIGFsbFRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgdGFyZ2V0SWRzW2FsbFRvdWNoZXNbMF0uaWRlbnRpZmllcl0gPSB0cnVlO1xuICAgIHJldHVybiBbYWxsVG91Y2hlcywgYWxsVG91Y2hlc107XG4gIH1cblxuICB2YXIgaTtcbiAgdmFyIHRhcmdldFRvdWNoZXM7XG4gIHZhciBjaGFuZ2VkVG91Y2hlcyA9IHRvQXJyYXkoZXYuY2hhbmdlZFRvdWNoZXMpO1xuICB2YXIgY2hhbmdlZFRhcmdldFRvdWNoZXMgPSBbXTtcbiAgdmFyIHRhcmdldCA9IHRoaXMudGFyZ2V0OyAvLyBnZXQgdGFyZ2V0IHRvdWNoZXMgZnJvbSB0b3VjaGVzXG5cbiAgdGFyZ2V0VG91Y2hlcyA9IGFsbFRvdWNoZXMuZmlsdGVyKGZ1bmN0aW9uICh0b3VjaCkge1xuICAgIHJldHVybiBoYXNQYXJlbnQodG91Y2gudGFyZ2V0LCB0YXJnZXQpO1xuICB9KTsgLy8gY29sbGVjdCB0b3VjaGVzXG5cbiAgaWYgKHR5cGUgPT09IElOUFVUX1NUQVJUKSB7XG4gICAgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICB0YXJnZXRJZHNbdGFyZ2V0VG91Y2hlc1tpXS5pZGVudGlmaWVyXSA9IHRydWU7XG4gICAgICBpKys7XG4gICAgfVxuICB9IC8vIGZpbHRlciBjaGFuZ2VkIHRvdWNoZXMgdG8gb25seSBjb250YWluIHRvdWNoZXMgdGhhdCBleGlzdCBpbiB0aGUgY29sbGVjdGVkIHRhcmdldCBpZHNcblxuXG4gIGkgPSAwO1xuXG4gIHdoaWxlIChpIDwgY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgaWYgKHRhcmdldElkc1tjaGFuZ2VkVG91Y2hlc1tpXS5pZGVudGlmaWVyXSkge1xuICAgICAgY2hhbmdlZFRhcmdldFRvdWNoZXMucHVzaChjaGFuZ2VkVG91Y2hlc1tpXSk7XG4gICAgfSAvLyBjbGVhbnVwIHJlbW92ZWQgdG91Y2hlc1xuXG5cbiAgICBpZiAodHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgICBkZWxldGUgdGFyZ2V0SWRzW2NoYW5nZWRUb3VjaGVzW2ldLmlkZW50aWZpZXJdO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIGlmICghY2hhbmdlZFRhcmdldFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmV0dXJuIFsvLyBtZXJnZSB0YXJnZXRUb3VjaGVzIHdpdGggY2hhbmdlZFRhcmdldFRvdWNoZXMgc28gaXQgY29udGFpbnMgQUxMIHRvdWNoZXMsIGluY2x1ZGluZyAnZW5kJyBhbmQgJ2NhbmNlbCdcbiAgdW5pcXVlQXJyYXkodGFyZ2V0VG91Y2hlcy5jb25jYXQoY2hhbmdlZFRhcmdldFRvdWNoZXMpLCAnaWRlbnRpZmllcicsIHRydWUpLCBjaGFuZ2VkVGFyZ2V0VG91Y2hlc107XG59XG5cbnZhciBNT1VTRV9JTlBVVF9NQVAgPSB7XG4gIG1vdXNlZG93bjogSU5QVVRfU1RBUlQsXG4gIG1vdXNlbW92ZTogSU5QVVRfTU9WRSxcbiAgbW91c2V1cDogSU5QVVRfRU5EXG59O1xudmFyIE1PVVNFX0VMRU1FTlRfRVZFTlRTID0gJ21vdXNlZG93bic7XG52YXIgTU9VU0VfV0lORE9XX0VWRU5UUyA9ICdtb3VzZW1vdmUgbW91c2V1cCc7XG4vKipcbiAqIEBwcml2YXRlXG4gKiBNb3VzZSBldmVudHMgaW5wdXRcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgSW5wdXRcbiAqL1xuXG52YXIgTW91c2VJbnB1dCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0lucHV0KSB7XG4gIF9pbmhlcml0c0xvb3NlKE1vdXNlSW5wdXQsIF9JbnB1dCk7XG5cbiAgZnVuY3Rpb24gTW91c2VJbnB1dCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcHJvdG8gPSBNb3VzZUlucHV0LnByb3RvdHlwZTtcbiAgICBwcm90by5ldkVsID0gTU9VU0VfRUxFTUVOVF9FVkVOVFM7XG4gICAgcHJvdG8uZXZXaW4gPSBNT1VTRV9XSU5ET1dfRVZFTlRTO1xuICAgIF90aGlzID0gX0lucHV0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpcztcbiAgICBfdGhpcy5wcmVzc2VkID0gZmFsc2U7IC8vIG1vdXNlZG93biBzdGF0ZVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBoYW5kbGUgbW91c2UgZXZlbnRzXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBNb3VzZUlucHV0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoZXYpIHtcbiAgICB2YXIgZXZlbnRUeXBlID0gTU9VU0VfSU5QVVRfTUFQW2V2LnR5cGVdOyAvLyBvbiBzdGFydCB3ZSB3YW50IHRvIGhhdmUgdGhlIGxlZnQgbW91c2UgYnV0dG9uIGRvd25cblxuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiBldi5idXR0b24gPT09IDApIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50VHlwZSAmIElOUFVUX01PVkUgJiYgZXYud2hpY2ggIT09IDEpIHtcbiAgICAgIGV2ZW50VHlwZSA9IElOUFVUX0VORDtcbiAgICB9IC8vIG1vdXNlIG11c3QgYmUgZG93blxuXG5cbiAgICBpZiAoIXRoaXMucHJlc3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgIHRoaXMucHJlc3NlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLCBldmVudFR5cGUsIHtcbiAgICAgIHBvaW50ZXJzOiBbZXZdLFxuICAgICAgY2hhbmdlZFBvaW50ZXJzOiBbZXZdLFxuICAgICAgcG9pbnRlclR5cGU6IElOUFVUX1RZUEVfTU9VU0UsXG4gICAgICBzcmNFdmVudDogZXZcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gTW91c2VJbnB1dDtcbn0oSW5wdXQpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBDb21iaW5lZCB0b3VjaCBhbmQgbW91c2UgaW5wdXRcbiAqXG4gKiBUb3VjaCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgdGhlbiBtb3VzZSwgYW5kIHdoaWxlIHRvdWNoaW5nIG5vIG1vdXNlIGV2ZW50cyBhcmUgYWxsb3dlZC5cbiAqIFRoaXMgYmVjYXVzZSB0b3VjaCBkZXZpY2VzIGFsc28gZW1pdCBtb3VzZSBldmVudHMgd2hpbGUgZG9pbmcgYSB0b3VjaC5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIElucHV0XG4gKi9cblxudmFyIERFRFVQX1RJTUVPVVQgPSAyNTAwO1xudmFyIERFRFVQX0RJU1RBTkNFID0gMjU7XG5cbmZ1bmN0aW9uIHNldExhc3RUb3VjaChldmVudERhdGEpIHtcbiAgdmFyIF9ldmVudERhdGEkY2hhbmdlZFBvaSA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnMsXG4gICAgICB0b3VjaCA9IF9ldmVudERhdGEkY2hhbmdlZFBvaVswXTtcblxuICBpZiAodG91Y2guaWRlbnRpZmllciA9PT0gdGhpcy5wcmltYXJ5VG91Y2gpIHtcbiAgICB2YXIgbGFzdFRvdWNoID0ge1xuICAgICAgeDogdG91Y2guY2xpZW50WCxcbiAgICAgIHk6IHRvdWNoLmNsaWVudFlcbiAgICB9O1xuICAgIHZhciBsdHMgPSB0aGlzLmxhc3RUb3VjaGVzO1xuICAgIHRoaXMubGFzdFRvdWNoZXMucHVzaChsYXN0VG91Y2gpO1xuXG4gICAgdmFyIHJlbW92ZUxhc3RUb3VjaCA9IGZ1bmN0aW9uIHJlbW92ZUxhc3RUb3VjaCgpIHtcbiAgICAgIHZhciBpID0gbHRzLmluZGV4T2YobGFzdFRvdWNoKTtcblxuICAgICAgaWYgKGkgPiAtMSkge1xuICAgICAgICBsdHMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZXRUaW1lb3V0KHJlbW92ZUxhc3RUb3VjaCwgREVEVVBfVElNRU9VVCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVjb3JkVG91Y2hlcyhldmVudFR5cGUsIGV2ZW50RGF0YSkge1xuICBpZiAoZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICB0aGlzLnByaW1hcnlUb3VjaCA9IGV2ZW50RGF0YS5jaGFuZ2VkUG9pbnRlcnNbMF0uaWRlbnRpZmllcjtcbiAgICBzZXRMYXN0VG91Y2guY2FsbCh0aGlzLCBldmVudERhdGEpO1xuICB9IGVsc2UgaWYgKGV2ZW50VHlwZSAmIChJTlBVVF9FTkQgfCBJTlBVVF9DQU5DRUwpKSB7XG4gICAgc2V0TGFzdFRvdWNoLmNhbGwodGhpcywgZXZlbnREYXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KGV2ZW50RGF0YSkge1xuICB2YXIgeCA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRYO1xuICB2YXIgeSA9IGV2ZW50RGF0YS5zcmNFdmVudC5jbGllbnRZO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sYXN0VG91Y2hlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciB0ID0gdGhpcy5sYXN0VG91Y2hlc1tpXTtcbiAgICB2YXIgZHggPSBNYXRoLmFicyh4IC0gdC54KTtcbiAgICB2YXIgZHkgPSBNYXRoLmFicyh5IC0gdC55KTtcblxuICAgIGlmIChkeCA8PSBERURVUF9ESVNUQU5DRSAmJiBkeSA8PSBERURVUF9ESVNUQU5DRSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG52YXIgVG91Y2hNb3VzZUlucHV0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgdmFyIFRvdWNoTW91c2VJbnB1dCA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKF9JbnB1dCkge1xuICAgIF9pbmhlcml0c0xvb3NlKFRvdWNoTW91c2VJbnB1dCwgX0lucHV0KTtcblxuICAgIGZ1bmN0aW9uIFRvdWNoTW91c2VJbnB1dChfbWFuYWdlciwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcztcblxuICAgICAgX3RoaXMgPSBfSW5wdXQuY2FsbCh0aGlzLCBfbWFuYWdlciwgY2FsbGJhY2spIHx8IHRoaXM7XG5cbiAgICAgIF90aGlzLmhhbmRsZXIgPSBmdW5jdGlvbiAobWFuYWdlciwgaW5wdXRFdmVudCwgaW5wdXREYXRhKSB7XG4gICAgICAgIHZhciBpc1RvdWNoID0gaW5wdXREYXRhLnBvaW50ZXJUeXBlID09PSBJTlBVVF9UWVBFX1RPVUNIO1xuICAgICAgICB2YXIgaXNNb3VzZSA9IGlucHV0RGF0YS5wb2ludGVyVHlwZSA9PT0gSU5QVVRfVFlQRV9NT1VTRTtcblxuICAgICAgICBpZiAoaXNNb3VzZSAmJiBpbnB1dERhdGEuc291cmNlQ2FwYWJpbGl0aWVzICYmIGlucHV0RGF0YS5zb3VyY2VDYXBhYmlsaXRpZXMuZmlyZXNUb3VjaEV2ZW50cykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyB3aGVuIHdlJ3JlIGluIGEgdG91Y2ggZXZlbnQsIHJlY29yZCB0b3VjaGVzIHRvICBkZS1kdXBlIHN5bnRoZXRpYyBtb3VzZSBldmVudFxuXG5cbiAgICAgICAgaWYgKGlzVG91Y2gpIHtcbiAgICAgICAgICByZWNvcmRUb3VjaGVzLmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIGlucHV0RXZlbnQsIGlucHV0RGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNNb3VzZSAmJiBpc1N5bnRoZXRpY0V2ZW50LmNhbGwoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIGlucHV0RGF0YSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpcy5jYWxsYmFjayhtYW5hZ2VyLCBpbnB1dEV2ZW50LCBpbnB1dERhdGEpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXMudG91Y2ggPSBuZXcgVG91Y2hJbnB1dChfdGhpcy5tYW5hZ2VyLCBfdGhpcy5oYW5kbGVyKTtcbiAgICAgIF90aGlzLm1vdXNlID0gbmV3IE1vdXNlSW5wdXQoX3RoaXMubWFuYWdlciwgX3RoaXMuaGFuZGxlcik7XG4gICAgICBfdGhpcy5wcmltYXJ5VG91Y2ggPSBudWxsO1xuICAgICAgX3RoaXMubGFzdFRvdWNoZXMgPSBbXTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBoYW5kbGUgbW91c2UgYW5kIHRvdWNoIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGlucHV0RXZlbnRcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXREYXRhXG4gICAgICovXG5cblxuICAgIHZhciBfcHJvdG8gPSBUb3VjaE1vdXNlSW5wdXQucHJvdG90eXBlO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIF9wcm90by5kZXN0cm95ID0gZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIHRoaXMudG91Y2guZGVzdHJveSgpO1xuICAgICAgdGhpcy5tb3VzZS5kZXN0cm95KCk7XG4gICAgfTtcblxuICAgIHJldHVybiBUb3VjaE1vdXNlSW5wdXQ7XG4gIH0oSW5wdXQpO1xuXG4gIHJldHVybiBUb3VjaE1vdXNlSW5wdXQ7XG59KCk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGNyZWF0ZSBuZXcgaW5wdXQgdHlwZSBtYW5hZ2VyXG4gKiBjYWxsZWQgYnkgdGhlIE1hbmFnZXIgY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7SGFtbWVyfSBtYW5hZ2VyXG4gKiBAcmV0dXJucyB7SW5wdXR9XG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlSW5wdXRJbnN0YW5jZShtYW5hZ2VyKSB7XG4gIHZhciBUeXBlOyAvLyBsZXQgaW5wdXRDbGFzcyA9IG1hbmFnZXIub3B0aW9ucy5pbnB1dENsYXNzO1xuXG4gIHZhciBpbnB1dENsYXNzID0gbWFuYWdlci5vcHRpb25zLmlucHV0Q2xhc3M7XG5cbiAgaWYgKGlucHV0Q2xhc3MpIHtcbiAgICBUeXBlID0gaW5wdXRDbGFzcztcbiAgfSBlbHNlIGlmIChTVVBQT1JUX1BPSU5URVJfRVZFTlRTKSB7XG4gICAgVHlwZSA9IFBvaW50ZXJFdmVudElucHV0O1xuICB9IGVsc2UgaWYgKFNVUFBPUlRfT05MWV9UT1VDSCkge1xuICAgIFR5cGUgPSBUb3VjaElucHV0O1xuICB9IGVsc2UgaWYgKCFTVVBQT1JUX1RPVUNIKSB7XG4gICAgVHlwZSA9IE1vdXNlSW5wdXQ7XG4gIH0gZWxzZSB7XG4gICAgVHlwZSA9IFRvdWNoTW91c2VJbnB1dDtcbiAgfVxuXG4gIHJldHVybiBuZXcgVHlwZShtYW5hZ2VyLCBpbnB1dEhhbmRsZXIpO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYXJyYXksIHdlIHdhbnQgdG8gZXhlY3V0ZSB0aGUgZm4gb24gZWFjaCBlbnRyeVxuICogaWYgaXQgYWludCBhbiBhcnJheSB3ZSBkb24ndCB3YW50IHRvIGRvIGEgdGhpbmcuXG4gKiB0aGlzIGlzIHVzZWQgYnkgYWxsIHRoZSBtZXRob2RzIHRoYXQgYWNjZXB0IGEgc2luZ2xlIGFuZCBhcnJheSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7KnxBcnJheX0gYXJnXG4gKiBAcGFyYW0ge1N0cmluZ30gZm5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dF1cbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICovXG5cbmZ1bmN0aW9uIGludm9rZUFycmF5QXJnKGFyZywgZm4sIGNvbnRleHQpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJnKSkge1xuICAgIGVhY2goYXJnLCBjb250ZXh0W2ZuXSwgY29udGV4dCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbnZhciBTVEFURV9QT1NTSUJMRSA9IDE7XG52YXIgU1RBVEVfQkVHQU4gPSAyO1xudmFyIFNUQVRFX0NIQU5HRUQgPSA0O1xudmFyIFNUQVRFX0VOREVEID0gODtcbnZhciBTVEFURV9SRUNPR05JWkVEID0gU1RBVEVfRU5ERUQ7XG52YXIgU1RBVEVfQ0FOQ0VMTEVEID0gMTY7XG52YXIgU1RBVEVfRkFJTEVEID0gMzI7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIGdldCBhIHVuaXF1ZSBpZFxuICogQHJldHVybnMge251bWJlcn0gdW5pcXVlSWRcbiAqL1xudmFyIF91bmlxdWVJZCA9IDE7XG5mdW5jdGlvbiB1bmlxdWVJZCgpIHtcbiAgcmV0dXJuIF91bmlxdWVJZCsrO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBnZXQgYSByZWNvZ25pemVyIGJ5IG5hbWUgaWYgaXQgaXMgYm91bmQgdG8gYSBtYW5hZ2VyXG4gKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSBvdGhlclJlY29nbml6ZXJcbiAqIEBwYXJhbSB7UmVjb2duaXplcn0gcmVjb2duaXplclxuICogQHJldHVybnMge1JlY29nbml6ZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCByZWNvZ25pemVyKSB7XG4gIHZhciBtYW5hZ2VyID0gcmVjb2duaXplci5tYW5hZ2VyO1xuXG4gIGlmIChtYW5hZ2VyKSB7XG4gICAgcmV0dXJuIG1hbmFnZXIuZ2V0KG90aGVyUmVjb2duaXplcik7XG4gIH1cblxuICByZXR1cm4gb3RoZXJSZWNvZ25pemVyO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBnZXQgYSB1c2FibGUgc3RyaW5nLCB1c2VkIGFzIGV2ZW50IHBvc3RmaXhcbiAqIEBwYXJhbSB7Y29uc3RhbnR9IHN0YXRlXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdGF0ZVxuICovXG5cbmZ1bmN0aW9uIHN0YXRlU3RyKHN0YXRlKSB7XG4gIGlmIChzdGF0ZSAmIFNUQVRFX0NBTkNFTExFRCkge1xuICAgIHJldHVybiAnY2FuY2VsJztcbiAgfSBlbHNlIGlmIChzdGF0ZSAmIFNUQVRFX0VOREVEKSB7XG4gICAgcmV0dXJuICdlbmQnO1xuICB9IGVsc2UgaWYgKHN0YXRlICYgU1RBVEVfQ0hBTkdFRCkge1xuICAgIHJldHVybiAnbW92ZSc7XG4gIH0gZWxzZSBpZiAoc3RhdGUgJiBTVEFURV9CRUdBTikge1xuICAgIHJldHVybiAnc3RhcnQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBSZWNvZ25pemVyIGZsb3cgZXhwbGFpbmVkOyAqXG4gKiBBbGwgcmVjb2duaXplcnMgaGF2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBQT1NTSUJMRSB3aGVuIGEgaW5wdXQgc2Vzc2lvbiBzdGFydHMuXG4gKiBUaGUgZGVmaW5pdGlvbiBvZiBhIGlucHV0IHNlc3Npb24gaXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgdW50aWwgdGhlIGxhc3QgaW5wdXQsIHdpdGggYWxsIGl0J3MgbW92ZW1lbnQgaW4gaXQuICpcbiAqIEV4YW1wbGUgc2Vzc2lvbiBmb3IgbW91c2UtaW5wdXQ6IG1vdXNlZG93biAtPiBtb3VzZW1vdmUgLT4gbW91c2V1cFxuICpcbiAqIE9uIGVhY2ggcmVjb2duaXppbmcgY3ljbGUgKHNlZSBNYW5hZ2VyLnJlY29nbml6ZSkgdGhlIC5yZWNvZ25pemUoKSBtZXRob2QgaXMgZXhlY3V0ZWRcbiAqIHdoaWNoIGRldGVybWluZXMgd2l0aCBzdGF0ZSBpdCBzaG91bGQgYmUuXG4gKlxuICogSWYgdGhlIHJlY29nbml6ZXIgaGFzIHRoZSBzdGF0ZSBGQUlMRUQsIENBTkNFTExFRCBvciBSRUNPR05JWkVEIChlcXVhbHMgRU5ERUQpLCBpdCBpcyByZXNldCB0b1xuICogUE9TU0lCTEUgdG8gZ2l2ZSBpdCBhbm90aGVyIGNoYW5nZSBvbiB0aGUgbmV4dCBjeWNsZS5cbiAqXG4gKiAgICAgICAgICAgICAgIFBvc3NpYmxlXG4gKiAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgKy0tLS0tKy0tLS0tLS0tLS0tLS0tLStcbiAqICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgKy0tLS0tKy0tLS0tKyAgICAgICAgICAgICAgIHxcbiAqICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgICAgIHxcbiAqICAgRmFpbGVkICAgICAgQ2FuY2VsbGVkICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLSstLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgUmVjb2duaXplZCAgICAgICBCZWdhblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kZWQvUmVjb2duaXplZFxuICovXG5cbi8qKlxuICogQHByaXZhdGVcbiAqIFJlY29nbml6ZXJcbiAqIEV2ZXJ5IHJlY29nbml6ZXIgbmVlZHMgdG8gZXh0ZW5kIGZyb20gdGhpcyBjbGFzcy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuXG52YXIgUmVjb2duaXplciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlY29nbml6ZXIob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSBfZXh0ZW5kcyh7XG4gICAgICBlbmFibGU6IHRydWVcbiAgICB9LCBvcHRpb25zKTtcbiAgICB0aGlzLmlkID0gdW5pcXVlSWQoKTtcbiAgICB0aGlzLm1hbmFnZXIgPSBudWxsOyAvLyBkZWZhdWx0IGlzIGVuYWJsZSB0cnVlXG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfUE9TU0lCTEU7XG4gICAgdGhpcy5zaW11bHRhbmVvdXMgPSB7fTtcbiAgICB0aGlzLnJlcXVpcmVGYWlsID0gW107XG4gIH1cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIHNldCBvcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge1JlY29nbml6ZXJ9XG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IFJlY29nbml6ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5zZXQgPSBmdW5jdGlvbiBzZXQob3B0aW9ucykge1xuICAgIGFzc2lnbiQxKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7IC8vIGFsc28gdXBkYXRlIHRoZSB0b3VjaEFjdGlvbiwgaW4gY2FzZSBzb21ldGhpbmcgY2hhbmdlZCBhYm91dCB0aGUgZGlyZWN0aW9ucy9lbmFibGVkIHN0YXRlXG5cbiAgICB0aGlzLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyLnRvdWNoQWN0aW9uLnVwZGF0ZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogcmVjb2duaXplIHNpbXVsdGFuZW91cyB3aXRoIGFuIG90aGVyIHJlY29nbml6ZXIuXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAqL1xuXG5cbiAgX3Byb3RvLnJlY29nbml6ZVdpdGggPSBmdW5jdGlvbiByZWNvZ25pemVXaXRoKG90aGVyUmVjb2duaXplcikge1xuICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHZhciBzaW11bHRhbmVvdXMgPSB0aGlzLnNpbXVsdGFuZW91cztcbiAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG5cbiAgICBpZiAoIXNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdKSB7XG4gICAgICBzaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXSA9IG90aGVyUmVjb2duaXplcjtcbiAgICAgIG90aGVyUmVjb2duaXplci5yZWNvZ25pemVXaXRoKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogZHJvcCB0aGUgc2ltdWx0YW5lb3VzIGxpbmsuIGl0IGRvZXNudCByZW1vdmUgdGhlIGxpbmsgb24gdGhlIG90aGVyIHJlY29nbml6ZXIuXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfSB0aGlzXG4gICAqL1xuXG5cbiAgX3Byb3RvLmRyb3BSZWNvZ25pemVXaXRoID0gZnVuY3Rpb24gZHJvcFJlY29nbml6ZVdpdGgob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZWNvZ25pemVXaXRoJywgdGhpcykpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcbiAgICBkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbb3RoZXJSZWNvZ25pemVyLmlkXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIHJlY29nbml6ZXIgY2FuIG9ubHkgcnVuIHdoZW4gYW4gb3RoZXIgaXMgZmFpbGluZ1xuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgKi9cblxuXG4gIF9wcm90by5yZXF1aXJlRmFpbHVyZSA9IGZ1bmN0aW9uIHJlcXVpcmVGYWlsdXJlKG90aGVyUmVjb2duaXplcikge1xuICAgIGlmIChpbnZva2VBcnJheUFyZyhvdGhlclJlY29nbml6ZXIsICdyZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgcmVxdWlyZUZhaWwgPSB0aGlzLnJlcXVpcmVGYWlsO1xuICAgIG90aGVyUmVjb2duaXplciA9IGdldFJlY29nbml6ZXJCeU5hbWVJZk1hbmFnZXIob3RoZXJSZWNvZ25pemVyLCB0aGlzKTtcblxuICAgIGlmIChpbkFycmF5KHJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpID09PSAtMSkge1xuICAgICAgcmVxdWlyZUZhaWwucHVzaChvdGhlclJlY29nbml6ZXIpO1xuICAgICAgb3RoZXJSZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogZHJvcCB0aGUgcmVxdWlyZUZhaWx1cmUgbGluay4gaXQgZG9lcyBub3QgcmVtb3ZlIHRoZSBsaW5rIG9uIHRoZSBvdGhlciByZWNvZ25pemVyLlxuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ9IG90aGVyUmVjb2duaXplclxuICAgKiBAcmV0dXJucyB7UmVjb2duaXplcn0gdGhpc1xuICAgKi9cblxuXG4gIF9wcm90by5kcm9wUmVxdWlyZUZhaWx1cmUgPSBmdW5jdGlvbiBkcm9wUmVxdWlyZUZhaWx1cmUob3RoZXJSZWNvZ25pemVyKSB7XG4gICAgaWYgKGludm9rZUFycmF5QXJnKG90aGVyUmVjb2duaXplciwgJ2Ryb3BSZXF1aXJlRmFpbHVyZScsIHRoaXMpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBvdGhlclJlY29nbml6ZXIgPSBnZXRSZWNvZ25pemVyQnlOYW1lSWZNYW5hZ2VyKG90aGVyUmVjb2duaXplciwgdGhpcyk7XG4gICAgdmFyIGluZGV4ID0gaW5BcnJheSh0aGlzLnJlcXVpcmVGYWlsLCBvdGhlclJlY29nbml6ZXIpO1xuXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIGhhcyByZXF1aXJlIGZhaWx1cmVzIGJvb2xlYW5cbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuXG5cbiAgX3Byb3RvLmhhc1JlcXVpcmVGYWlsdXJlcyA9IGZ1bmN0aW9uIGhhc1JlcXVpcmVGYWlsdXJlcygpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGggPiAwO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogaWYgdGhlIHJlY29nbml6ZXIgY2FuIHJlY29nbml6ZSBzaW11bHRhbmVvdXMgd2l0aCBhbiBvdGhlciByZWNvZ25pemVyXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcn0gb3RoZXJSZWNvZ25pemVyXG4gICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgKi9cblxuXG4gIF9wcm90by5jYW5SZWNvZ25pemVXaXRoID0gZnVuY3Rpb24gY2FuUmVjb2duaXplV2l0aChvdGhlclJlY29nbml6ZXIpIHtcbiAgICByZXR1cm4gISF0aGlzLnNpbXVsdGFuZW91c1tvdGhlclJlY29nbml6ZXIuaWRdO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogWW91IHNob3VsZCB1c2UgYHRyeUVtaXRgIGluc3RlYWQgb2YgYGVtaXRgIGRpcmVjdGx5IHRvIGNoZWNrXG4gICAqIHRoYXQgYWxsIHRoZSBuZWVkZWQgcmVjb2duaXplcnMgaGFzIGZhaWxlZCBiZWZvcmUgZW1pdHRpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgKi9cblxuXG4gIF9wcm90by5lbWl0ID0gZnVuY3Rpb24gZW1pdChpbnB1dCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgZnVuY3Rpb24gZW1pdChldmVudCkge1xuICAgICAgc2VsZi5tYW5hZ2VyLmVtaXQoZXZlbnQsIGlucHV0KTtcbiAgICB9IC8vICdwYW5zdGFydCcgYW5kICdwYW5tb3ZlJ1xuXG5cbiAgICBpZiAoc3RhdGUgPCBTVEFURV9FTkRFRCkge1xuICAgICAgZW1pdChzZWxmLm9wdGlvbnMuZXZlbnQgKyBzdGF0ZVN0cihzdGF0ZSkpO1xuICAgIH1cblxuICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50KTsgLy8gc2ltcGxlICdldmVudE5hbWUnIGV2ZW50c1xuXG4gICAgaWYgKGlucHV0LmFkZGl0aW9uYWxFdmVudCkge1xuICAgICAgLy8gYWRkaXRpb25hbCBldmVudChwYW5sZWZ0LCBwYW5yaWdodCwgcGluY2hpbiwgcGluY2hvdXQuLi4pXG4gICAgICBlbWl0KGlucHV0LmFkZGl0aW9uYWxFdmVudCk7XG4gICAgfSAvLyBwYW5lbmQgYW5kIHBhbmNhbmNlbFxuXG5cbiAgICBpZiAoc3RhdGUgPj0gU1RBVEVfRU5ERUQpIHtcbiAgICAgIGVtaXQoc2VsZi5vcHRpb25zLmV2ZW50ICsgc3RhdGVTdHIoc3RhdGUpKTtcbiAgICB9XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBDaGVjayB0aGF0IGFsbCB0aGUgcmVxdWlyZSBmYWlsdXJlIHJlY29nbml6ZXJzIGhhcyBmYWlsZWQsXG4gICAqIGlmIHRydWUsIGl0IGVtaXRzIGEgZ2VzdHVyZSBldmVudCxcbiAgICogb3RoZXJ3aXNlLCBzZXR1cCB0aGUgc3RhdGUgdG8gRkFJTEVELlxuICAgKiBAcGFyYW0ge09iamVjdH0gaW5wdXRcbiAgICovXG5cblxuICBfcHJvdG8udHJ5RW1pdCA9IGZ1bmN0aW9uIHRyeUVtaXQoaW5wdXQpIHtcbiAgICBpZiAodGhpcy5jYW5FbWl0KCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmVtaXQoaW5wdXQpO1xuICAgIH0gLy8gaXQncyBmYWlsaW5nIGFueXdheVxuXG5cbiAgICB0aGlzLnN0YXRlID0gU1RBVEVfRkFJTEVEO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogY2FuIHdlIGVtaXQ/XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cblxuXG4gIF9wcm90by5jYW5FbWl0ID0gZnVuY3Rpb24gY2FuRW1pdCgpIHtcbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IHRoaXMucmVxdWlyZUZhaWwubGVuZ3RoKSB7XG4gICAgICBpZiAoISh0aGlzLnJlcXVpcmVGYWlsW2ldLnN0YXRlICYgKFNUQVRFX0ZBSUxFRCB8IFNUQVRFX1BPU1NJQkxFKSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiB1cGRhdGUgdGhlIHJlY29nbml6ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgKi9cblxuXG4gIF9wcm90by5yZWNvZ25pemUgPSBmdW5jdGlvbiByZWNvZ25pemUoaW5wdXREYXRhKSB7XG4gICAgLy8gbWFrZSBhIG5ldyBjb3B5IG9mIHRoZSBpbnB1dERhdGFcbiAgICAvLyBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBpbnB1dERhdGEgd2l0aG91dCBtZXNzaW5nIHVwIHRoZSBvdGhlciByZWNvZ25pemVyc1xuICAgIHZhciBpbnB1dERhdGFDbG9uZSA9IGFzc2lnbiQxKHt9LCBpbnB1dERhdGEpOyAvLyBpcyBpcyBlbmFibGVkIGFuZCBhbGxvdyByZWNvZ25pemluZz9cblxuICAgIGlmICghYm9vbE9yRm4odGhpcy5vcHRpb25zLmVuYWJsZSwgW3RoaXMsIGlucHV0RGF0YUNsb25lXSkpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9GQUlMRUQ7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyByZXNldCB3aGVuIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZFxuXG5cbiAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9SRUNPR05JWkVEIHwgU1RBVEVfQ0FOQ0VMTEVEIHwgU1RBVEVfRkFJTEVEKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1BPU1NJQkxFO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLnByb2Nlc3MoaW5wdXREYXRhQ2xvbmUpOyAvLyB0aGUgcmVjb2duaXplciBoYXMgcmVjb2duaXplZCBhIGdlc3R1cmVcbiAgICAvLyBzbyB0cmlnZ2VyIGFuIGV2ZW50XG5cbiAgICBpZiAodGhpcy5zdGF0ZSAmIChTVEFURV9CRUdBTiB8IFNUQVRFX0NIQU5HRUQgfCBTVEFURV9FTkRFRCB8IFNUQVRFX0NBTkNFTExFRCkpIHtcbiAgICAgIHRoaXMudHJ5RW1pdChpbnB1dERhdGFDbG9uZSk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogcmV0dXJuIHRoZSBzdGF0ZSBvZiB0aGUgcmVjb2duaXplclxuICAgKiB0aGUgYWN0dWFsIHJlY29nbml6aW5nIGhhcHBlbnMgaW4gdGhpcyBtZXRob2RcbiAgICogQHZpcnR1YWxcbiAgICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YVxuICAgKiBAcmV0dXJucyB7Y29uc3RhbnR9IFNUQVRFXG4gICAqL1xuXG4gIC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblxuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhpbnB1dERhdGEpIHt9O1xuICAvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiByZXR1cm4gdGhlIHByZWZlcnJlZCB0b3VjaC1hY3Rpb25cbiAgICogQHZpcnR1YWxcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cblxuXG4gIF9wcm90by5nZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge307XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBjYWxsZWQgd2hlbiB0aGUgZ2VzdHVyZSBpc24ndCBhbGxvd2VkIHRvIHJlY29nbml6ZVxuICAgKiBsaWtlIHdoZW4gYW5vdGhlciBpcyBiZWluZyByZWNvZ25pemVkIG9yIGl0IGlzIGRpc2FibGVkXG4gICAqIEB2aXJ0dWFsXG4gICAqL1xuXG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7fTtcblxuICByZXR1cm4gUmVjb2duaXplcjtcbn0oKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogQSB0YXAgaXMgcmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIGRvaW5nIGEgc21hbGwgdGFwL2NsaWNrLiBNdWx0aXBsZSB0YXBzIGFyZSByZWNvZ25pemVkIGlmIHRoZXkgb2NjdXJcbiAqIGJldHdlZW4gdGhlIGdpdmVuIGludGVydmFsIGFuZCBwb3NpdGlvbi4gVGhlIGRlbGF5IG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWNvZ25pemUgbXVsdGktdGFwcyB3aXRob3V0IGZpcmluZ1xuICogYSBzaW5nbGUgdGFwLlxuICpcbiAqIFRoZSBldmVudERhdGEgZnJvbSB0aGUgZW1pdHRlZCBldmVudCBjb250YWlucyB0aGUgcHJvcGVydHkgYHRhcENvdW50YCwgd2hpY2ggY29udGFpbnMgdGhlIGFtb3VudCBvZlxuICogbXVsdGktdGFwcyBiZWluZyByZWNvZ25pemVkLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cblxudmFyIFRhcFJlY29nbml6ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9SZWNvZ25pemVyKSB7XG4gIF9pbmhlcml0c0xvb3NlKFRhcFJlY29nbml6ZXIsIF9SZWNvZ25pemVyKTtcblxuICBmdW5jdGlvbiBUYXBSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVjb2duaXplci5jYWxsKHRoaXMsIF9leHRlbmRzKHtcbiAgICAgIGV2ZW50OiAndGFwJyxcbiAgICAgIHBvaW50ZXJzOiAxLFxuICAgICAgdGFwczogMSxcbiAgICAgIGludGVydmFsOiAzMDAsXG4gICAgICAvLyBtYXggdGltZSBiZXR3ZWVuIHRoZSBtdWx0aS10YXAgdGFwc1xuICAgICAgdGltZTogMjUwLFxuICAgICAgLy8gbWF4IHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgZG93biAobGlrZSBmaW5nZXIgb24gdGhlIHNjcmVlbilcbiAgICAgIHRocmVzaG9sZDogOSxcbiAgICAgIC8vIGEgbWluaW1hbCBtb3ZlbWVudCBpcyBvaywgYnV0IGtlZXAgaXQgbG93XG4gICAgICBwb3NUaHJlc2hvbGQ6IDEwXG4gICAgfSwgb3B0aW9ucykpIHx8IHRoaXM7IC8vIHByZXZpb3VzIHRpbWUgYW5kIGNlbnRlcixcbiAgICAvLyB1c2VkIGZvciB0YXAgY291bnRpbmdcblxuICAgIF90aGlzLnBUaW1lID0gZmFsc2U7XG4gICAgX3RoaXMucENlbnRlciA9IGZhbHNlO1xuICAgIF90aGlzLl90aW1lciA9IG51bGw7XG4gICAgX3RoaXMuX2lucHV0ID0gbnVsbDtcbiAgICBfdGhpcy5jb3VudCA9IDA7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRhcFJlY29nbml6ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX01BTklQVUxBVElPTl07XG4gIH07XG5cbiAgX3Byb3RvLnByb2Nlc3MgPSBmdW5jdGlvbiBwcm9jZXNzKGlucHV0KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB2YXIgdmFsaWRQb2ludGVycyA9IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9ucy5wb2ludGVycztcbiAgICB2YXIgdmFsaWRNb3ZlbWVudCA9IGlucHV0LmRpc3RhbmNlIDwgb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgdmFyIHZhbGlkVG91Y2hUaW1lID0gaW5wdXQuZGVsdGFUaW1lIDwgb3B0aW9ucy50aW1lO1xuICAgIHRoaXMucmVzZXQoKTtcblxuICAgIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9TVEFSVCAmJiB0aGlzLmNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgIH0gLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG5cblxuICAgIGlmICh2YWxpZE1vdmVtZW50ICYmIHZhbGlkVG91Y2hUaW1lICYmIHZhbGlkUG9pbnRlcnMpIHtcbiAgICAgIGlmIChpbnB1dC5ldmVudFR5cGUgIT09IElOUFVUX0VORCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdmFsaWRJbnRlcnZhbCA9IHRoaXMucFRpbWUgPyBpbnB1dC50aW1lU3RhbXAgLSB0aGlzLnBUaW1lIDwgb3B0aW9ucy5pbnRlcnZhbCA6IHRydWU7XG4gICAgICB2YXIgdmFsaWRNdWx0aVRhcCA9ICF0aGlzLnBDZW50ZXIgfHwgZ2V0RGlzdGFuY2UodGhpcy5wQ2VudGVyLCBpbnB1dC5jZW50ZXIpIDwgb3B0aW9ucy5wb3NUaHJlc2hvbGQ7XG4gICAgICB0aGlzLnBUaW1lID0gaW5wdXQudGltZVN0YW1wO1xuICAgICAgdGhpcy5wQ2VudGVyID0gaW5wdXQuY2VudGVyO1xuXG4gICAgICBpZiAoIXZhbGlkTXVsdGlUYXAgfHwgIXZhbGlkSW50ZXJ2YWwpIHtcbiAgICAgICAgdGhpcy5jb3VudCA9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvdW50ICs9IDE7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lucHV0ID0gaW5wdXQ7IC8vIGlmIHRhcCBjb3VudCBtYXRjaGVzIHdlIGhhdmUgcmVjb2duaXplZCBpdCxcbiAgICAgIC8vIGVsc2UgaXQgaGFzIGJlZ2FuIHJlY29nbml6aW5nLi4uXG5cbiAgICAgIHZhciB0YXBDb3VudCA9IHRoaXMuY291bnQgJSBvcHRpb25zLnRhcHM7XG5cbiAgICAgIGlmICh0YXBDb3VudCA9PT0gMCkge1xuICAgICAgICAvLyBubyBmYWlsaW5nIHJlcXVpcmVtZW50cywgaW1tZWRpYXRlbHkgdHJpZ2dlciB0aGUgdGFwIGV2ZW50XG4gICAgICAgIC8vIG9yIHdhaXQgYXMgbG9uZyBhcyB0aGUgbXVsdGl0YXAgaW50ZXJ2YWwgdG8gdHJpZ2dlclxuICAgICAgICBpZiAoIXRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCkpIHtcbiAgICAgICAgICByZXR1cm4gU1RBVEVfUkVDT0dOSVpFRDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLnN0YXRlID0gU1RBVEVfUkVDT0dOSVpFRDtcblxuICAgICAgICAgICAgX3RoaXMyLnRyeUVtaXQoKTtcbiAgICAgICAgICB9LCBvcHRpb25zLmludGVydmFsKTtcbiAgICAgICAgICByZXR1cm4gU1RBVEVfQkVHQU47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU1RBVEVfRkFJTEVEO1xuICB9O1xuXG4gIF9wcm90by5mYWlsVGltZW91dCA9IGZ1bmN0aW9uIGZhaWxUaW1lb3V0KCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMy5zdGF0ZSA9IFNUQVRFX0ZBSUxFRDtcbiAgICB9LCB0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpO1xuICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gIH07XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgfTtcblxuICBfcHJvdG8uZW1pdCA9IGZ1bmN0aW9uIGVtaXQoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IFNUQVRFX1JFQ09HTklaRUQpIHtcbiAgICAgIHRoaXMuX2lucHV0LnRhcENvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gVGFwUmVjb2duaXplcjtcbn0oUmVjb2duaXplcik7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIFRoaXMgcmVjb2duaXplciBpcyBqdXN0IHVzZWQgYXMgYSBiYXNlIGZvciB0aGUgc2ltcGxlIGF0dHJpYnV0ZSByZWNvZ25pemVycy5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgUmVjb2duaXplclxuICovXG5cbnZhciBBdHRyUmVjb2duaXplciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlY29nbml6ZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UoQXR0clJlY29nbml6ZXIsIF9SZWNvZ25pemVyKTtcblxuICBmdW5jdGlvbiBBdHRyUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBfUmVjb2duaXplci5jYWxsKHRoaXMsIF9leHRlbmRzKHtcbiAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSwgb3B0aW9ucykpIHx8IHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIFVzZWQgdG8gY2hlY2sgaWYgaXQgdGhlIHJlY29nbml6ZXIgcmVjZWl2ZXMgdmFsaWQgaW5wdXQsIGxpa2UgaW5wdXQuZGlzdGFuY2UgPiAxMC5cbiAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gcmVjb2duaXplZFxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBBdHRyUmVjb2duaXplci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmF0dHJUZXN0ID0gZnVuY3Rpb24gYXR0clRlc3QoaW5wdXQpIHtcbiAgICB2YXIgb3B0aW9uUG9pbnRlcnMgPSB0aGlzLm9wdGlvbnMucG9pbnRlcnM7XG4gICAgcmV0dXJuIG9wdGlvblBvaW50ZXJzID09PSAwIHx8IGlucHV0LnBvaW50ZXJzLmxlbmd0aCA9PT0gb3B0aW9uUG9pbnRlcnM7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBQcm9jZXNzIHRoZSBpbnB1dCBhbmQgcmV0dXJuIHRoZSBzdGF0ZSBmb3IgdGhlIHJlY29nbml6ZXJcbiAgICogQG1lbWJlcm9mIEF0dHJSZWNvZ25pemVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dFxuICAgKiBAcmV0dXJucyB7Kn0gU3RhdGVcbiAgICovXG5cblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MoaW5wdXQpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLnN0YXRlO1xuICAgIHZhciBldmVudFR5cGUgPSBpbnB1dC5ldmVudFR5cGU7XG4gICAgdmFyIGlzUmVjb2duaXplZCA9IHN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCk7XG4gICAgdmFyIGlzVmFsaWQgPSB0aGlzLmF0dHJUZXN0KGlucHV0KTsgLy8gb24gY2FuY2VsIGlucHV0IGFuZCB3ZSd2ZSByZWNvZ25pemVkIGJlZm9yZSwgcmV0dXJuIFNUQVRFX0NBTkNFTExFRFxuXG4gICAgaWYgKGlzUmVjb2duaXplZCAmJiAoZXZlbnRUeXBlICYgSU5QVVRfQ0FOQ0VMIHx8ICFpc1ZhbGlkKSkge1xuICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfQ0FOQ0VMTEVEO1xuICAgIH0gZWxzZSBpZiAoaXNSZWNvZ25pemVkIHx8IGlzVmFsaWQpIHtcbiAgICAgIGlmIChldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlIHwgU1RBVEVfRU5ERUQ7XG4gICAgICB9IGVsc2UgaWYgKCEoc3RhdGUgJiBTVEFURV9CRUdBTikpIHtcbiAgICAgICAgcmV0dXJuIFNUQVRFX0JFR0FOO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RhdGUgfCBTVEFURV9DSEFOR0VEO1xuICAgIH1cblxuICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gIH07XG5cbiAgcmV0dXJuIEF0dHJSZWNvZ25pemVyO1xufShSZWNvZ25pemVyKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogZGlyZWN0aW9uIGNvbnMgdG8gc3RyaW5nXG4gKiBAcGFyYW0ge2NvbnN0YW50fSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gZGlyZWN0aW9uU3RyKGRpcmVjdGlvbikge1xuICBpZiAoZGlyZWN0aW9uID09PSBESVJFQ1RJT05fRE9XTikge1xuICAgIHJldHVybiAnZG93bic7XG4gIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSBESVJFQ1RJT05fVVApIHtcbiAgICByZXR1cm4gJ3VwJztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUKSB7XG4gICAgcmV0dXJuICdsZWZ0JztcbiAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IERJUkVDVElPTl9SSUdIVCkge1xuICAgIHJldHVybiAncmlnaHQnO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBQYW5cbiAqIFJlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBkb3duIGFuZCBtb3ZlZCBpbiB0aGUgYWxsb3dlZCBkaXJlY3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cblxudmFyIFBhblJlY29nbml6ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9BdHRyUmVjb2duaXplcikge1xuICBfaW5oZXJpdHNMb29zZShQYW5SZWNvZ25pemVyLCBfQXR0clJlY29nbml6ZXIpO1xuXG4gIGZ1bmN0aW9uIFBhblJlY29nbml6ZXIob3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBfdGhpcyA9IF9BdHRyUmVjb2duaXplci5jYWxsKHRoaXMsIF9leHRlbmRzKHtcbiAgICAgIGV2ZW50OiAncGFuJyxcbiAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICBwb2ludGVyczogMSxcbiAgICAgIGRpcmVjdGlvbjogRElSRUNUSU9OX0FMTFxuICAgIH0sIG9wdGlvbnMpKSB8fCB0aGlzO1xuICAgIF90aGlzLnBYID0gbnVsbDtcbiAgICBfdGhpcy5wWSA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFBhblJlY29nbml6ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIHZhciBhY3Rpb25zID0gW107XG5cbiAgICBpZiAoZGlyZWN0aW9uICYgRElSRUNUSU9OX0hPUklaT05UQUwpIHtcbiAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1kpO1xuICAgIH1cblxuICAgIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgIGFjdGlvbnMucHVzaChUT1VDSF9BQ1RJT05fUEFOX1gpO1xuICAgIH1cblxuICAgIHJldHVybiBhY3Rpb25zO1xuICB9O1xuXG4gIF9wcm90by5kaXJlY3Rpb25UZXN0ID0gZnVuY3Rpb24gZGlyZWN0aW9uVGVzdChpbnB1dCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHZhciBoYXNNb3ZlZCA9IHRydWU7XG4gICAgdmFyIGRpc3RhbmNlID0gaW5wdXQuZGlzdGFuY2U7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGlucHV0LmRpcmVjdGlvbjtcbiAgICB2YXIgeCA9IGlucHV0LmRlbHRhWDtcbiAgICB2YXIgeSA9IGlucHV0LmRlbHRhWTsgLy8gbG9jayB0byBheGlzP1xuXG4gICAgaWYgKCEoZGlyZWN0aW9uICYgb3B0aW9ucy5kaXJlY3Rpb24pKSB7XG4gICAgICBpZiAob3B0aW9ucy5kaXJlY3Rpb24gJiBESVJFQ1RJT05fSE9SSVpPTlRBTCkge1xuICAgICAgICBkaXJlY3Rpb24gPSB4ID09PSAwID8gRElSRUNUSU9OX05PTkUgOiB4IDwgMCA/IERJUkVDVElPTl9MRUZUIDogRElSRUNUSU9OX1JJR0hUO1xuICAgICAgICBoYXNNb3ZlZCA9IHggIT09IHRoaXMucFg7XG4gICAgICAgIGRpc3RhbmNlID0gTWF0aC5hYnMoaW5wdXQuZGVsdGFYKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpcmVjdGlvbiA9IHkgPT09IDAgPyBESVJFQ1RJT05fTk9ORSA6IHkgPCAwID8gRElSRUNUSU9OX1VQIDogRElSRUNUSU9OX0RPV047XG4gICAgICAgIGhhc01vdmVkID0geSAhPT0gdGhpcy5wWTtcbiAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhpbnB1dC5kZWx0YVkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlucHV0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICByZXR1cm4gaGFzTW92ZWQgJiYgZGlzdGFuY2UgPiBvcHRpb25zLnRocmVzaG9sZCAmJiBkaXJlY3Rpb24gJiBvcHRpb25zLmRpcmVjdGlvbjtcbiAgfTtcblxuICBfcHJvdG8uYXR0clRlc3QgPSBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgIHJldHVybiBBdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiYgKCAvLyByZXBsYWNlIHdpdGggYSBzdXBlciBjYWxsXG4gICAgdGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOIHx8ICEodGhpcy5zdGF0ZSAmIFNUQVRFX0JFR0FOKSAmJiB0aGlzLmRpcmVjdGlvblRlc3QoaW5wdXQpKTtcbiAgfTtcblxuICBfcHJvdG8uZW1pdCA9IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICB0aGlzLnBYID0gaW5wdXQuZGVsdGFYO1xuICAgIHRoaXMucFkgPSBpbnB1dC5kZWx0YVk7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5kaXJlY3Rpb24pO1xuXG4gICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgaW5wdXQuYWRkaXRpb25hbEV2ZW50ID0gdGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIF9BdHRyUmVjb2duaXplci5wcm90b3R5cGUuZW1pdC5jYWxsKHRoaXMsIGlucHV0KTtcbiAgfTtcblxuICByZXR1cm4gUGFuUmVjb2duaXplcjtcbn0oQXR0clJlY29nbml6ZXIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBTd2lwZVxuICogUmVjb2duaXplZCB3aGVuIHRoZSBwb2ludGVyIGlzIG1vdmluZyBmYXN0ICh2ZWxvY2l0eSksIHdpdGggZW5vdWdoIGRpc3RhbmNlIGluIHRoZSBhbGxvd2VkIGRpcmVjdGlvbi5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgQXR0clJlY29nbml6ZXJcbiAqL1xuXG52YXIgU3dpcGVSZWNvZ25pemVyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQXR0clJlY29nbml6ZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UoU3dpcGVSZWNvZ25pemVyLCBfQXR0clJlY29nbml6ZXIpO1xuXG4gIGZ1bmN0aW9uIFN3aXBlUmVjb2duaXplcihvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIHJldHVybiBfQXR0clJlY29nbml6ZXIuY2FsbCh0aGlzLCBfZXh0ZW5kcyh7XG4gICAgICBldmVudDogJ3N3aXBlJyxcbiAgICAgIHRocmVzaG9sZDogMTAsXG4gICAgICB2ZWxvY2l0eTogMC4zLFxuICAgICAgZGlyZWN0aW9uOiBESVJFQ1RJT05fSE9SSVpPTlRBTCB8IERJUkVDVElPTl9WRVJUSUNBTCxcbiAgICAgIHBvaW50ZXJzOiAxXG4gICAgfSwgb3B0aW9ucykpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU3dpcGVSZWNvZ25pemVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHtcbiAgICByZXR1cm4gUGFuUmVjb2duaXplci5wcm90b3R5cGUuZ2V0VG91Y2hBY3Rpb24uY2FsbCh0aGlzKTtcbiAgfTtcblxuICBfcHJvdG8uYXR0clRlc3QgPSBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgIHZhciBkaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICAgIHZhciB2ZWxvY2l0eTtcblxuICAgIGlmIChkaXJlY3Rpb24gJiAoRElSRUNUSU9OX0hPUklaT05UQUwgfCBESVJFQ1RJT05fVkVSVElDQUwpKSB7XG4gICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eTtcbiAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiAmIERJUkVDVElPTl9IT1JJWk9OVEFMKSB7XG4gICAgICB2ZWxvY2l0eSA9IGlucHV0Lm92ZXJhbGxWZWxvY2l0eVg7XG4gICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gJiBESVJFQ1RJT05fVkVSVElDQUwpIHtcbiAgICAgIHZlbG9jaXR5ID0gaW5wdXQub3ZlcmFsbFZlbG9jaXR5WTtcbiAgICB9XG5cbiAgICByZXR1cm4gX0F0dHJSZWNvZ25pemVyLnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsIGlucHV0KSAmJiBkaXJlY3Rpb24gJiBpbnB1dC5vZmZzZXREaXJlY3Rpb24gJiYgaW5wdXQuZGlzdGFuY2UgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkICYmIGlucHV0Lm1heFBvaW50ZXJzID09PSB0aGlzLm9wdGlvbnMucG9pbnRlcnMgJiYgYWJzKHZlbG9jaXR5KSA+IHRoaXMub3B0aW9ucy52ZWxvY2l0eSAmJiBpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQ7XG4gIH07XG5cbiAgX3Byb3RvLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGlucHV0KSB7XG4gICAgdmFyIGRpcmVjdGlvbiA9IGRpcmVjdGlvblN0cihpbnB1dC5vZmZzZXREaXJlY3Rpb24pO1xuXG4gICAgaWYgKGRpcmVjdGlvbikge1xuICAgICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50ICsgZGlyZWN0aW9uLCBpbnB1dCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCBpbnB1dCk7XG4gIH07XG5cbiAgcmV0dXJuIFN3aXBlUmVjb2duaXplcjtcbn0oQXR0clJlY29nbml6ZXIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBQaW5jaFxuICogUmVjb2duaXplZCB3aGVuIHR3byBvciBtb3JlIHBvaW50ZXJzIGFyZSBtb3ZpbmcgdG93YXJkICh6b29tLWluKSBvciBhd2F5IGZyb20gZWFjaCBvdGhlciAoem9vbS1vdXQpLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBBdHRyUmVjb2duaXplclxuICovXG5cbnZhciBQaW5jaFJlY29nbml6ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9BdHRyUmVjb2duaXplcikge1xuICBfaW5oZXJpdHNMb29zZShQaW5jaFJlY29nbml6ZXIsIF9BdHRyUmVjb2duaXplcik7XG5cbiAgZnVuY3Rpb24gUGluY2hSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgcmV0dXJuIF9BdHRyUmVjb2duaXplci5jYWxsKHRoaXMsIF9leHRlbmRzKHtcbiAgICAgIGV2ZW50OiAncGluY2gnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LCBvcHRpb25zKSkgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQaW5jaFJlY29nbml6ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX05PTkVdO1xuICB9O1xuXG4gIF9wcm90by5hdHRyVGVzdCA9IGZ1bmN0aW9uIGF0dHJUZXN0KGlucHV0KSB7XG4gICAgcmV0dXJuIF9BdHRyUmVjb2duaXplci5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLCBpbnB1dCkgJiYgKE1hdGguYWJzKGlucHV0LnNjYWxlIC0gMSkgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gIH07XG5cbiAgX3Byb3RvLmVtaXQgPSBmdW5jdGlvbiBlbWl0KGlucHV0KSB7XG4gICAgaWYgKGlucHV0LnNjYWxlICE9PSAxKSB7XG4gICAgICB2YXIgaW5PdXQgPSBpbnB1dC5zY2FsZSA8IDEgPyAnaW4nIDogJ291dCc7XG4gICAgICBpbnB1dC5hZGRpdGlvbmFsRXZlbnQgPSB0aGlzLm9wdGlvbnMuZXZlbnQgKyBpbk91dDtcbiAgICB9XG5cbiAgICBfQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmVtaXQuY2FsbCh0aGlzLCBpbnB1dCk7XG4gIH07XG5cbiAgcmV0dXJuIFBpbmNoUmVjb2duaXplcjtcbn0oQXR0clJlY29nbml6ZXIpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBSb3RhdGVcbiAqIFJlY29nbml6ZWQgd2hlbiB0d28gb3IgbW9yZSBwb2ludGVyIGFyZSBtb3ZpbmcgaW4gYSBjaXJjdWxhciBtb3Rpb24uXG4gKiBAY29uc3RydWN0b3JcbiAqIEBleHRlbmRzIEF0dHJSZWNvZ25pemVyXG4gKi9cblxudmFyIFJvdGF0ZVJlY29nbml6ZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9BdHRyUmVjb2duaXplcikge1xuICBfaW5oZXJpdHNMb29zZShSb3RhdGVSZWNvZ25pemVyLCBfQXR0clJlY29nbml6ZXIpO1xuXG4gIGZ1bmN0aW9uIFJvdGF0ZVJlY29nbml6ZXIob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gX0F0dHJSZWNvZ25pemVyLmNhbGwodGhpcywgX2V4dGVuZHMoe1xuICAgICAgZXZlbnQ6ICdyb3RhdGUnLFxuICAgICAgdGhyZXNob2xkOiAwLFxuICAgICAgcG9pbnRlcnM6IDJcbiAgICB9LCBvcHRpb25zKSkgfHwgdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBSb3RhdGVSZWNvZ25pemVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbiBnZXRUb3VjaEFjdGlvbigpIHtcbiAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9OT05FXTtcbiAgfTtcblxuICBfcHJvdG8uYXR0clRlc3QgPSBmdW5jdGlvbiBhdHRyVGVzdChpbnB1dCkge1xuICAgIHJldHVybiBfQXR0clJlY29nbml6ZXIucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcywgaW5wdXQpICYmIChNYXRoLmFicyhpbnB1dC5yb3RhdGlvbikgPiB0aGlzLm9wdGlvbnMudGhyZXNob2xkIHx8IHRoaXMuc3RhdGUgJiBTVEFURV9CRUdBTik7XG4gIH07XG5cbiAgcmV0dXJuIFJvdGF0ZVJlY29nbml6ZXI7XG59KEF0dHJSZWNvZ25pemVyKTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogUHJlc3NcbiAqIFJlY29nbml6ZWQgd2hlbiB0aGUgcG9pbnRlciBpcyBkb3duIGZvciB4IG1zIHdpdGhvdXQgYW55IG1vdmVtZW50LlxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBSZWNvZ25pemVyXG4gKi9cblxudmFyIFByZXNzUmVjb2duaXplciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1JlY29nbml6ZXIpIHtcbiAgX2luaGVyaXRzTG9vc2UoUHJlc3NSZWNvZ25pemVyLCBfUmVjb2duaXplcik7XG5cbiAgZnVuY3Rpb24gUHJlc3NSZWNvZ25pemVyKG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgX3RoaXMgPSBfUmVjb2duaXplci5jYWxsKHRoaXMsIF9leHRlbmRzKHtcbiAgICAgIGV2ZW50OiAncHJlc3MnLFxuICAgICAgcG9pbnRlcnM6IDEsXG4gICAgICB0aW1lOiAyNTEsXG4gICAgICAvLyBtaW5pbWFsIHRpbWUgb2YgdGhlIHBvaW50ZXIgdG8gYmUgcHJlc3NlZFxuICAgICAgdGhyZXNob2xkOiA5XG4gICAgfSwgb3B0aW9ucykpIHx8IHRoaXM7XG4gICAgX3RoaXMuX3RpbWVyID0gbnVsbDtcbiAgICBfdGhpcy5faW5wdXQgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQcmVzc1JlY29nbml6ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRUb3VjaEFjdGlvbiA9IGZ1bmN0aW9uIGdldFRvdWNoQWN0aW9uKCkge1xuICAgIHJldHVybiBbVE9VQ0hfQUNUSU9OX0FVVE9dO1xuICB9O1xuXG4gIF9wcm90by5wcm9jZXNzID0gZnVuY3Rpb24gcHJvY2VzcyhpbnB1dCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdmFyIHZhbGlkUG9pbnRlcnMgPSBpbnB1dC5wb2ludGVycy5sZW5ndGggPT09IG9wdGlvbnMucG9pbnRlcnM7XG4gICAgdmFyIHZhbGlkTW92ZW1lbnQgPSBpbnB1dC5kaXN0YW5jZSA8IG9wdGlvbnMudGhyZXNob2xkO1xuICAgIHZhciB2YWxpZFRpbWUgPSBpbnB1dC5kZWx0YVRpbWUgPiBvcHRpb25zLnRpbWU7XG4gICAgdGhpcy5faW5wdXQgPSBpbnB1dDsgLy8gd2Ugb25seSBhbGxvdyBsaXR0bGUgbW92ZW1lbnRcbiAgICAvLyBhbmQgd2UndmUgcmVhY2hlZCBhbiBlbmQgZXZlbnQsIHNvIGEgdGFwIGlzIHBvc3NpYmxlXG5cbiAgICBpZiAoIXZhbGlkTW92ZW1lbnQgfHwgIXZhbGlkUG9pbnRlcnMgfHwgaW5wdXQuZXZlbnRUeXBlICYgKElOUFVUX0VORCB8IElOUFVUX0NBTkNFTCkgJiYgIXZhbGlkVGltZSkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQuZXZlbnRUeXBlICYgSU5QVVRfU1RBUlQpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMi5zdGF0ZSA9IFNUQVRFX1JFQ09HTklaRUQ7XG5cbiAgICAgICAgX3RoaXMyLnRyeUVtaXQoKTtcbiAgICAgIH0sIG9wdGlvbnMudGltZSk7XG4gICAgfSBlbHNlIGlmIChpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgIHJldHVybiBTVEFURV9SRUNPR05JWkVEO1xuICAgIH1cblxuICAgIHJldHVybiBTVEFURV9GQUlMRUQ7XG4gIH07XG5cbiAgX3Byb3RvLnJlc2V0ID0gZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgfTtcblxuICBfcHJvdG8uZW1pdCA9IGZ1bmN0aW9uIGVtaXQoaW5wdXQpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dCAmJiBpbnB1dC5ldmVudFR5cGUgJiBJTlBVVF9FTkQpIHtcbiAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCArIFwidXBcIiwgaW5wdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbnB1dC50aW1lU3RhbXAgPSBub3coKTtcbiAgICAgIHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCwgdGhpcy5faW5wdXQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUHJlc3NSZWNvZ25pemVyO1xufShSZWNvZ25pemVyKTtcblxudmFyIGRlZmF1bHRzID0ge1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogc2V0IGlmIERPTSBldmVudHMgYXJlIGJlaW5nIHRyaWdnZXJlZC5cbiAgICogQnV0IHRoaXMgaXMgc2xvd2VyIGFuZCB1bnVzZWQgYnkgc2ltcGxlIGltcGxlbWVudGF0aW9ucywgc28gZGlzYWJsZWQgYnkgZGVmYXVsdC5cbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkb21FdmVudHM6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBUaGUgdmFsdWUgZm9yIHRoZSB0b3VjaEFjdGlvbiBwcm9wZXJ0eS9mYWxsYmFjay5cbiAgICogV2hlbiBzZXQgdG8gYGNvbXB1dGVgIGl0IHdpbGwgbWFnaWNhbGx5IHNldCB0aGUgY29ycmVjdCB2YWx1ZSBiYXNlZCBvbiB0aGUgYWRkZWQgcmVjb2duaXplcnMuXG4gICAqIEB0eXBlIHtTdHJpbmd9XG4gICAqIEBkZWZhdWx0IGNvbXB1dGVcbiAgICovXG4gIHRvdWNoQWN0aW9uOiBUT1VDSF9BQ1RJT05fQ09NUFVURSxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogQHR5cGUge0Jvb2xlYW59XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZTogdHJ1ZSxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogRVhQRVJJTUVOVEFMIEZFQVRVUkUgLS0gY2FuIGJlIHJlbW92ZWQvY2hhbmdlZFxuICAgKiBDaGFuZ2UgdGhlIHBhcmVudCBpbnB1dCB0YXJnZXQgZWxlbWVudC5cbiAgICogSWYgTnVsbCwgdGhlbiBpdCBpcyBiZWluZyBzZXQgdGhlIHRvIG1haW4gZWxlbWVudC5cbiAgICogQHR5cGUge051bGx8RXZlbnRUYXJnZXR9XG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICovXG4gIGlucHV0VGFyZ2V0OiBudWxsLFxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBmb3JjZSBhbiBpbnB1dCBjbGFzc1xuICAgKiBAdHlwZSB7TnVsbHxGdW5jdGlvbn1cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKi9cbiAgaW5wdXRDbGFzczogbnVsbCxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogU29tZSBDU1MgcHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBpbXByb3ZlIHRoZSB3b3JraW5nIG9mIEhhbW1lci5cbiAgICogQWRkIHRoZW0gdG8gdGhpcyBtZXRob2QgYW5kIHRoZXkgd2lsbCBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBNYW5hZ2VyLlxuICAgKiBAbmFtZXNwYWNlXG4gICAqL1xuICBjc3NQcm9wczoge1xuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogRGlzYWJsZXMgdGV4dCBzZWxlY3Rpb24gdG8gaW1wcm92ZSB0aGUgZHJhZ2dpbmcgZ2VzdHVyZS4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICovXG4gICAgdXNlclNlbGVjdDogXCJub25lXCIsXG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIERpc2FibGUgdGhlIFdpbmRvd3MgUGhvbmUgZ3JpcHBlcnMgd2hlbiBwcmVzc2luZyBhbiBlbGVtZW50LlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICovXG4gICAgdG91Y2hTZWxlY3Q6IFwibm9uZVwiLFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBEaXNhYmxlcyB0aGUgZGVmYXVsdCBjYWxsb3V0IHNob3duIHdoZW4geW91IHRvdWNoIGFuZCBob2xkIGEgdG91Y2ggdGFyZ2V0LlxuICAgICAqIE9uIGlPUywgd2hlbiB5b3UgdG91Y2ggYW5kIGhvbGQgYSB0b3VjaCB0YXJnZXQgc3VjaCBhcyBhIGxpbmssIFNhZmFyaSBkaXNwbGF5c1xuICAgICAqIGEgY2FsbG91dCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsaW5rLiBUaGlzIHByb3BlcnR5IGFsbG93cyB5b3UgdG8gZGlzYWJsZSB0aGF0IGNhbGxvdXQuXG4gICAgICogQHR5cGUge1N0cmluZ31cbiAgICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICAgKi9cbiAgICB0b3VjaENhbGxvdXQ6IFwibm9uZVwiLFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB6b29taW5nIGlzIGVuYWJsZWQuIFVzZWQgYnkgSUUxMD5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqIEBkZWZhdWx0ICdub25lJ1xuICAgICAqL1xuICAgIGNvbnRlbnRab29taW5nOiBcIm5vbmVcIixcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogU3BlY2lmaWVzIHRoYXQgYW4gZW50aXJlIGVsZW1lbnQgc2hvdWxkIGJlIGRyYWdnYWJsZSBpbnN0ZWFkIG9mIGl0cyBjb250ZW50cy4gTWFpbmx5IGZvciBkZXNrdG9wIGJyb3dzZXJzLlxuICAgICAqIEB0eXBlIHtTdHJpbmd9XG4gICAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAgICovXG4gICAgdXNlckRyYWc6IFwibm9uZVwiLFxuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBPdmVycmlkZXMgdGhlIGhpZ2hsaWdodCBjb2xvciBzaG93biB3aGVuIHRoZSB1c2VyIHRhcHMgYSBsaW5rIG9yIGEgSmF2YVNjcmlwdFxuICAgICAqIGNsaWNrYWJsZSBlbGVtZW50IGluIGlPUy4gVGhpcyBwcm9wZXJ0eSBvYmV5cyB0aGUgYWxwaGEgdmFsdWUsIGlmIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxuICAgICAqIEBkZWZhdWx0ICdyZ2JhKDAsMCwwLDApJ1xuICAgICAqL1xuICAgIHRhcEhpZ2hsaWdodENvbG9yOiBcInJnYmEoMCwwLDAsMClcIlxuICB9XG59O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICogRGVmYXVsdCByZWNvZ25pemVyIHNldHVwIHdoZW4gY2FsbGluZyBgSGFtbWVyKClgXG4gKiBXaGVuIGNyZWF0aW5nIGEgbmV3IE1hbmFnZXIgdGhlc2Ugd2lsbCBiZSBza2lwcGVkLlxuICogVGhpcyBpcyBzZXBhcmF0ZWQgd2l0aCBvdGhlciBkZWZhdWx0cyBiZWNhdXNlIG9mIHRyZWUtc2hha2luZy5cbiAqIEB0eXBlIHtBcnJheX1cbiAqL1xuXG52YXIgcHJlc2V0ID0gW1tSb3RhdGVSZWNvZ25pemVyLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn1dLCBbUGluY2hSZWNvZ25pemVyLCB7XG4gIGVuYWJsZTogZmFsc2Vcbn0sIFsncm90YXRlJ11dLCBbU3dpcGVSZWNvZ25pemVyLCB7XG4gIGRpcmVjdGlvbjogRElSRUNUSU9OX0hPUklaT05UQUxcbn1dLCBbUGFuUmVjb2duaXplciwge1xuICBkaXJlY3Rpb246IERJUkVDVElPTl9IT1JJWk9OVEFMXG59LCBbJ3N3aXBlJ11dLCBbVGFwUmVjb2duaXplcl0sIFtUYXBSZWNvZ25pemVyLCB7XG4gIGV2ZW50OiAnZG91YmxldGFwJyxcbiAgdGFwczogMlxufSwgWyd0YXAnXV0sIFtQcmVzc1JlY29nbml6ZXJdXTtcblxudmFyIFNUT1AgPSAxO1xudmFyIEZPUkNFRF9TVE9QID0gMjtcbi8qKlxuICogQHByaXZhdGVcbiAqIGFkZC9yZW1vdmUgdGhlIGNzcyBwcm9wZXJ0aWVzIGFzIGRlZmluZWQgaW4gbWFuYWdlci5vcHRpb25zLmNzc1Byb3BzXG4gKiBAcGFyYW0ge01hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gYWRkXG4gKi9cblxuZnVuY3Rpb24gdG9nZ2xlQ3NzUHJvcHMobWFuYWdlciwgYWRkKSB7XG4gIHZhciBlbGVtZW50ID0gbWFuYWdlci5lbGVtZW50O1xuXG4gIGlmICghZWxlbWVudC5zdHlsZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwcm9wO1xuICBlYWNoKG1hbmFnZXIub3B0aW9ucy5jc3NQcm9wcywgZnVuY3Rpb24gKHZhbHVlLCBuYW1lKSB7XG4gICAgcHJvcCA9IHByZWZpeGVkKGVsZW1lbnQuc3R5bGUsIG5hbWUpO1xuXG4gICAgaWYgKGFkZCkge1xuICAgICAgbWFuYWdlci5vbGRDc3NQcm9wc1twcm9wXSA9IGVsZW1lbnQuc3R5bGVbcHJvcF07XG4gICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuc3R5bGVbcHJvcF0gPSBtYW5hZ2VyLm9sZENzc1Byb3BzW3Byb3BdIHx8IFwiXCI7XG4gICAgfVxuICB9KTtcblxuICBpZiAoIWFkZCkge1xuICAgIG1hbmFnZXIub2xkQ3NzUHJvcHMgPSB7fTtcbiAgfVxufVxuLyoqXG4gKiBAcHJpdmF0ZVxuICogdHJpZ2dlciBkb20gZXZlbnRcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqL1xuXG5cbmZ1bmN0aW9uIHRyaWdnZXJEb21FdmVudChldmVudCwgZGF0YSkge1xuICB2YXIgZ2VzdHVyZUV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoXCJFdmVudFwiKTtcbiAgZ2VzdHVyZUV2ZW50LmluaXRFdmVudChldmVudCwgdHJ1ZSwgdHJ1ZSk7XG4gIGdlc3R1cmVFdmVudC5nZXN0dXJlID0gZGF0YTtcbiAgZGF0YS50YXJnZXQuZGlzcGF0Y2hFdmVudChnZXN0dXJlRXZlbnQpO1xufVxuLyoqXG4qIEBwcml2YXRlXG4gKiBNYW5hZ2VyXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5cbnZhciBNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTWFuYWdlcihlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMub3B0aW9ucyA9IGFzc2lnbiQxKHt9LCBkZWZhdWx0cywgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0ID0gdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0IHx8IGVsZW1lbnQ7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMucmVjb2duaXplcnMgPSBbXTtcbiAgICB0aGlzLm9sZENzc1Byb3BzID0ge307XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlucHV0ID0gY3JlYXRlSW5wdXRJbnN0YW5jZSh0aGlzKTtcbiAgICB0aGlzLnRvdWNoQWN0aW9uID0gbmV3IFRvdWNoQWN0aW9uKHRoaXMsIHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbik7XG4gICAgdG9nZ2xlQ3NzUHJvcHModGhpcywgdHJ1ZSk7XG4gICAgZWFjaCh0aGlzLm9wdGlvbnMucmVjb2duaXplcnMsIGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgICB2YXIgcmVjb2duaXplciA9IF90aGlzLmFkZChuZXcgaXRlbVswXShpdGVtWzFdKSk7XG5cbiAgICAgIGl0ZW1bMl0gJiYgcmVjb2duaXplci5yZWNvZ25pemVXaXRoKGl0ZW1bMl0pO1xuICAgICAgaXRlbVszXSAmJiByZWNvZ25pemVyLnJlcXVpcmVGYWlsdXJlKGl0ZW1bM10pO1xuICAgIH0sIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBzZXQgb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7TWFuYWdlcn1cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gTWFuYWdlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldCA9IGZ1bmN0aW9uIHNldChvcHRpb25zKSB7XG4gICAgYXNzaWduJDEodGhpcy5vcHRpb25zLCBvcHRpb25zKTsgLy8gT3B0aW9ucyB0aGF0IG5lZWQgYSBsaXR0bGUgbW9yZSBzZXR1cFxuXG4gICAgaWYgKG9wdGlvbnMudG91Y2hBY3Rpb24pIHtcbiAgICAgIHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuaW5wdXRUYXJnZXQpIHtcbiAgICAgIC8vIENsZWFuIHVwIGV4aXN0aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQgcmVpbml0aWFsaXplXG4gICAgICB0aGlzLmlucHV0LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuaW5wdXQudGFyZ2V0ID0gb3B0aW9ucy5pbnB1dFRhcmdldDtcbiAgICAgIHRoaXMuaW5wdXQuaW5pdCgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogc3RvcCByZWNvZ25pemluZyBmb3IgdGhpcyBzZXNzaW9uLlxuICAgKiBUaGlzIHNlc3Npb24gd2lsbCBiZSBkaXNjYXJkZWQsIHdoZW4gYSBuZXcgW2lucHV0XXN0YXJ0IGV2ZW50IGlzIGZpcmVkLlxuICAgKiBXaGVuIGZvcmNlZCwgdGhlIHJlY29nbml6ZXIgY3ljbGUgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbZm9yY2VdXG4gICAqL1xuXG5cbiAgX3Byb3RvLnN0b3AgPSBmdW5jdGlvbiBzdG9wKGZvcmNlKSB7XG4gICAgdGhpcy5zZXNzaW9uLnN0b3BwZWQgPSBmb3JjZSA/IEZPUkNFRF9TVE9QIDogU1RPUDtcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIHJ1biB0aGUgcmVjb2duaXplcnMhXG4gICAqIGNhbGxlZCBieSB0aGUgaW5wdXRIYW5kbGVyIGZ1bmN0aW9uIG9uIGV2ZXJ5IG1vdmVtZW50IG9mIHRoZSBwb2ludGVycyAodG91Y2hlcylcbiAgICogaXQgd2Fsa3MgdGhyb3VnaCBhbGwgdGhlIHJlY29nbml6ZXJzIGFuZCB0cmllcyB0byBkZXRlY3QgdGhlIGdlc3R1cmUgdGhhdCBpcyBiZWluZyBtYWRlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbnB1dERhdGFcbiAgICovXG5cblxuICBfcHJvdG8ucmVjb2duaXplID0gZnVuY3Rpb24gcmVjb2duaXplKGlucHV0RGF0YSkge1xuICAgIHZhciBzZXNzaW9uID0gdGhpcy5zZXNzaW9uO1xuXG4gICAgaWYgKHNlc3Npb24uc3RvcHBlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gcnVuIHRoZSB0b3VjaC1hY3Rpb24gcG9seWZpbGxcblxuXG4gICAgdGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHMoaW5wdXREYXRhKTtcbiAgICB2YXIgcmVjb2duaXplcjtcbiAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzOyAvLyB0aGlzIGhvbGRzIHRoZSByZWNvZ25pemVyIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAvLyBzbyB0aGUgcmVjb2duaXplcidzIHN0YXRlIG5lZWRzIHRvIGJlIEJFR0FOLCBDSEFOR0VELCBFTkRFRCBvciBSRUNPR05JWkVEXG4gICAgLy8gaWYgbm8gcmVjb2duaXplciBpcyBkZXRlY3RpbmcgYSB0aGluZywgaXQgaXMgc2V0IHRvIGBudWxsYFxuXG4gICAgdmFyIGN1clJlY29nbml6ZXIgPSBzZXNzaW9uLmN1clJlY29nbml6ZXI7IC8vIHJlc2V0IHdoZW4gdGhlIGxhc3QgcmVjb2duaXplciBpcyByZWNvZ25pemVkXG4gICAgLy8gb3Igd2hlbiB3ZSdyZSBpbiBhIG5ldyBzZXNzaW9uXG5cbiAgICBpZiAoIWN1clJlY29nbml6ZXIgfHwgY3VyUmVjb2duaXplciAmJiBjdXJSZWNvZ25pemVyLnN0YXRlICYgU1RBVEVfUkVDT0dOSVpFRCkge1xuICAgICAgc2Vzc2lvbi5jdXJSZWNvZ25pemVyID0gbnVsbDtcbiAgICAgIGN1clJlY29nbml6ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBpID0gMDtcblxuICAgIHdoaWxlIChpIDwgcmVjb2duaXplcnMubGVuZ3RoKSB7XG4gICAgICByZWNvZ25pemVyID0gcmVjb2duaXplcnNbaV07IC8vIGZpbmQgb3V0IGlmIHdlIGFyZSBhbGxvd2VkIHRyeSB0byByZWNvZ25pemUgdGhlIGlucHV0IGZvciB0aGlzIG9uZS5cbiAgICAgIC8vIDEuICAgYWxsb3cgaWYgdGhlIHNlc3Npb24gaXMgTk9UIGZvcmNlZCBzdG9wcGVkIChzZWUgdGhlIC5zdG9wKCkgbWV0aG9kKVxuICAgICAgLy8gMi4gICBhbGxvdyBpZiB3ZSBzdGlsbCBoYXZlbid0IHJlY29nbml6ZWQgYSBnZXN0dXJlIGluIHRoaXMgc2Vzc2lvbiwgb3IgdGhlIHRoaXMgcmVjb2duaXplciBpcyB0aGUgb25lXG4gICAgICAvLyAgICAgIHRoYXQgaXMgYmVpbmcgcmVjb2duaXplZC5cbiAgICAgIC8vIDMuICAgYWxsb3cgaWYgdGhlIHJlY29nbml6ZXIgaXMgYWxsb3dlZCB0byBydW4gc2ltdWx0YW5lb3VzIHdpdGggdGhlIGN1cnJlbnQgcmVjb2duaXplZCByZWNvZ25pemVyLlxuICAgICAgLy8gICAgICB0aGlzIGNhbiBiZSBzZXR1cCB3aXRoIHRoZSBgcmVjb2duaXplV2l0aCgpYCBtZXRob2Qgb24gdGhlIHJlY29nbml6ZXIuXG5cbiAgICAgIGlmIChzZXNzaW9uLnN0b3BwZWQgIT09IEZPUkNFRF9TVE9QICYmICggLy8gMVxuICAgICAgIWN1clJlY29nbml6ZXIgfHwgcmVjb2duaXplciA9PT0gY3VyUmVjb2duaXplciB8fCAvLyAyXG4gICAgICByZWNvZ25pemVyLmNhblJlY29nbml6ZVdpdGgoY3VyUmVjb2duaXplcikpKSB7XG4gICAgICAgIC8vIDNcbiAgICAgICAgcmVjb2duaXplci5yZWNvZ25pemUoaW5wdXREYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29nbml6ZXIucmVzZXQoKTtcbiAgICAgIH0gLy8gaWYgdGhlIHJlY29nbml6ZXIgaGFzIGJlZW4gcmVjb2duaXppbmcgdGhlIGlucHV0IGFzIGEgdmFsaWQgZ2VzdHVyZSwgd2Ugd2FudCB0byBzdG9yZSB0aGlzIG9uZSBhcyB0aGVcbiAgICAgIC8vIGN1cnJlbnQgYWN0aXZlIHJlY29nbml6ZXIuIGJ1dCBvbmx5IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhbiBhY3RpdmUgcmVjb2duaXplclxuXG5cbiAgICAgIGlmICghY3VyUmVjb2duaXplciAmJiByZWNvZ25pemVyLnN0YXRlICYgKFNUQVRFX0JFR0FOIHwgU1RBVEVfQ0hBTkdFRCB8IFNUQVRFX0VOREVEKSkge1xuICAgICAgICBzZXNzaW9uLmN1clJlY29nbml6ZXIgPSByZWNvZ25pemVyO1xuICAgICAgICBjdXJSZWNvZ25pemVyID0gcmVjb2duaXplcjtcbiAgICAgIH1cblxuICAgICAgaSsrO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIGdldCBhIHJlY29nbml6ZXIgYnkgaXRzIGV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSB7UmVjb2duaXplcnxTdHJpbmd9IHJlY29nbml6ZXJcbiAgICogQHJldHVybnMge1JlY29nbml6ZXJ8TnVsbH1cbiAgICovXG5cblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KHJlY29nbml6ZXIpIHtcbiAgICBpZiAocmVjb2duaXplciBpbnN0YW5jZW9mIFJlY29nbml6ZXIpIHtcbiAgICAgIHJldHVybiByZWNvZ25pemVyO1xuICAgIH1cblxuICAgIHZhciByZWNvZ25pemVycyA9IHRoaXMucmVjb2duaXplcnM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVjb2duaXplcnNbaV0ub3B0aW9ucy5ldmVudCA9PT0gcmVjb2duaXplcikge1xuICAgICAgICByZXR1cm4gcmVjb2duaXplcnNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIC8qKlxuICAgKiBAcHJpdmF0ZSBhZGQgYSByZWNvZ25pemVyIHRvIHRoZSBtYW5hZ2VyXG4gICAqIGV4aXN0aW5nIHJlY29nbml6ZXJzIHdpdGggdGhlIHNhbWUgZXZlbnQgbmFtZSB3aWxsIGJlIHJlbW92ZWRcbiAgICogQHBhcmFtIHtSZWNvZ25pemVyfSByZWNvZ25pemVyXG4gICAqIEByZXR1cm5zIHtSZWNvZ25pemVyfE1hbmFnZXJ9XG4gICAqL1xuXG5cbiAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChyZWNvZ25pemVyKSB7XG4gICAgaWYgKGludm9rZUFycmF5QXJnKHJlY29nbml6ZXIsIFwiYWRkXCIsIHRoaXMpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IC8vIHJlbW92ZSBleGlzdGluZ1xuXG5cbiAgICB2YXIgZXhpc3RpbmcgPSB0aGlzLmdldChyZWNvZ25pemVyLm9wdGlvbnMuZXZlbnQpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICB0aGlzLnJlbW92ZShleGlzdGluZyk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWNvZ25pemVycy5wdXNoKHJlY29nbml6ZXIpO1xuICAgIHJlY29nbml6ZXIubWFuYWdlciA9IHRoaXM7XG4gICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICByZXR1cm4gcmVjb2duaXplcjtcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIHJlbW92ZSBhIHJlY29nbml6ZXIgYnkgbmFtZSBvciBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlY29nbml6ZXJ8U3RyaW5nfSByZWNvZ25pemVyXG4gICAqIEByZXR1cm5zIHtNYW5hZ2VyfVxuICAgKi9cblxuXG4gIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUocmVjb2duaXplcikge1xuICAgIGlmIChpbnZva2VBcnJheUFyZyhyZWNvZ25pemVyLCBcInJlbW92ZVwiLCB0aGlzKSkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldFJlY29nbml6ZXIgPSB0aGlzLmdldChyZWNvZ25pemVyKTsgLy8gbGV0J3MgbWFrZSBzdXJlIHRoaXMgcmVjb2duaXplciBleGlzdHNcblxuICAgIGlmIChyZWNvZ25pemVyKSB7XG4gICAgICB2YXIgcmVjb2duaXplcnMgPSB0aGlzLnJlY29nbml6ZXJzO1xuICAgICAgdmFyIGluZGV4ID0gaW5BcnJheShyZWNvZ25pemVycywgdGFyZ2V0UmVjb2duaXplcik7XG5cbiAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgcmVjb2duaXplcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIGJpbmQgZXZlbnRcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50c1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBoYW5kbGVyXG4gICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICovXG5cblxuICBfcHJvdG8ub24gPSBmdW5jdGlvbiBvbihldmVudHMsIGhhbmRsZXIpIHtcbiAgICBpZiAoZXZlbnRzID09PSB1bmRlZmluZWQgfHwgaGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuICAgIGVhY2goc3BsaXRTdHIoZXZlbnRzKSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBoYW5kbGVyc1tldmVudF0gPSBoYW5kbGVyc1tldmVudF0gfHwgW107XG4gICAgICBoYW5kbGVyc1tldmVudF0ucHVzaChoYW5kbGVyKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLyoqXG4gICAqIEBwcml2YXRlIHVuYmluZCBldmVudCwgbGVhdmUgZW1pdCBibGFuayB0byByZW1vdmUgYWxsIGhhbmRsZXJzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2hhbmRsZXJdXG4gICAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IHRoaXNcbiAgICovXG5cblxuICBfcHJvdG8ub2ZmID0gZnVuY3Rpb24gb2ZmKGV2ZW50cywgaGFuZGxlcikge1xuICAgIGlmIChldmVudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdmFyIGhhbmRsZXJzID0gdGhpcy5oYW5kbGVycztcbiAgICBlYWNoKHNwbGl0U3RyKGV2ZW50cyksIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICAgIGRlbGV0ZSBoYW5kbGVyc1tldmVudF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVyc1tldmVudF0gJiYgaGFuZGxlcnNbZXZlbnRdLnNwbGljZShpbkFycmF5KGhhbmRsZXJzW2V2ZW50XSwgaGFuZGxlciksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICAvKipcbiAgICogQHByaXZhdGUgZW1pdCBldmVudCB0byB0aGUgbGlzdGVuZXJzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKi9cblxuXG4gIF9wcm90by5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgZGF0YSkge1xuICAgIC8vIHdlIGFsc28gd2FudCB0byB0cmlnZ2VyIGRvbSBldmVudHNcbiAgICBpZiAodGhpcy5vcHRpb25zLmRvbUV2ZW50cykge1xuICAgICAgdHJpZ2dlckRvbUV2ZW50KGV2ZW50LCBkYXRhKTtcbiAgICB9IC8vIG5vIGhhbmRsZXJzLCBzbyBza2lwIGl0IGFsbFxuXG5cbiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzW2V2ZW50XSAmJiB0aGlzLmhhbmRsZXJzW2V2ZW50XS5zbGljZSgpO1xuXG4gICAgaWYgKCFoYW5kbGVycyB8fCAhaGFuZGxlcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGF0YS50eXBlID0gZXZlbnQ7XG5cbiAgICBkYXRhLnByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgZGF0YS5zcmNFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICB2YXIgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGhhbmRsZXJzLmxlbmd0aCkge1xuICAgICAgaGFuZGxlcnNbaV0oZGF0YSk7XG4gICAgICBpKys7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICogZGVzdHJveSB0aGUgbWFuYWdlciBhbmQgdW5iaW5kcyBhbGwgZXZlbnRzXG4gICAqIGl0IGRvZXNuJ3QgdW5iaW5kIGRvbSBldmVudHMsIHRoYXQgaXMgdGhlIHVzZXIgb3duIHJlc3BvbnNpYmlsaXR5XG4gICAqL1xuXG5cbiAgX3Byb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHRoaXMuZWxlbWVudCAmJiB0b2dnbGVDc3NQcm9wcyh0aGlzLCBmYWxzZSk7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuc2Vzc2lvbiA9IHt9O1xuICAgIHRoaXMuaW5wdXQuZGVzdHJveSgpO1xuICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gIH07XG5cbiAgcmV0dXJuIE1hbmFnZXI7XG59KCk7XG5cbnZhciBTSU5HTEVfVE9VQ0hfSU5QVVRfTUFQID0ge1xuICB0b3VjaHN0YXJ0OiBJTlBVVF9TVEFSVCxcbiAgdG91Y2htb3ZlOiBJTlBVVF9NT1ZFLFxuICB0b3VjaGVuZDogSU5QVVRfRU5ELFxuICB0b3VjaGNhbmNlbDogSU5QVVRfQ0FOQ0VMXG59O1xudmFyIFNJTkdMRV9UT1VDSF9UQVJHRVRfRVZFTlRTID0gJ3RvdWNoc3RhcnQnO1xudmFyIFNJTkdMRV9UT1VDSF9XSU5ET1dfRVZFTlRTID0gJ3RvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsJztcbi8qKlxuICogQHByaXZhdGVcbiAqIFRvdWNoIGV2ZW50cyBpbnB1dFxuICogQGNvbnN0cnVjdG9yXG4gKiBAZXh0ZW5kcyBJbnB1dFxuICovXG5cbnZhciBTaW5nbGVUb3VjaElucHV0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfSW5wdXQpIHtcbiAgX2luaGVyaXRzTG9vc2UoU2luZ2xlVG91Y2hJbnB1dCwgX0lucHV0KTtcblxuICBmdW5jdGlvbiBTaW5nbGVUb3VjaElucHV0KCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwcm90byA9IFNpbmdsZVRvdWNoSW5wdXQucHJvdG90eXBlO1xuICAgIHByb3RvLmV2VGFyZ2V0ID0gU0lOR0xFX1RPVUNIX1RBUkdFVF9FVkVOVFM7XG4gICAgcHJvdG8uZXZXaW4gPSBTSU5HTEVfVE9VQ0hfV0lORE9XX0VWRU5UUztcbiAgICBfdGhpcyA9IF9JbnB1dC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gICAgX3RoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTaW5nbGVUb3VjaElucHV0LnByb3RvdHlwZTtcblxuICBfcHJvdG8uaGFuZGxlciA9IGZ1bmN0aW9uIGhhbmRsZXIoZXYpIHtcbiAgICB2YXIgdHlwZSA9IFNJTkdMRV9UT1VDSF9JTlBVVF9NQVBbZXYudHlwZV07IC8vIHNob3VsZCB3ZSBoYW5kbGUgdGhlIHRvdWNoIGV2ZW50cz9cblxuICAgIGlmICh0eXBlID09PSBJTlBVVF9TVEFSVCkge1xuICAgICAgdGhpcy5zdGFydGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0b3VjaGVzID0gbm9ybWFsaXplU2luZ2xlVG91Y2hlcy5jYWxsKHRoaXMsIGV2LCB0eXBlKTsgLy8gd2hlbiBkb25lLCByZXNldCB0aGUgc3RhcnRlZCBzdGF0ZVxuXG4gICAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSAmJiB0b3VjaGVzWzBdLmxlbmd0aCAtIHRvdWNoZXNbMV0ubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXJ0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlciwgdHlwZSwge1xuICAgICAgcG9pbnRlcnM6IHRvdWNoZXNbMF0sXG4gICAgICBjaGFuZ2VkUG9pbnRlcnM6IHRvdWNoZXNbMV0sXG4gICAgICBwb2ludGVyVHlwZTogSU5QVVRfVFlQRV9UT1VDSCxcbiAgICAgIHNyY0V2ZW50OiBldlxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBTaW5nbGVUb3VjaElucHV0O1xufShJbnB1dCk7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNpbmdsZVRvdWNoZXMoZXYsIHR5cGUpIHtcbiAgdmFyIGFsbCA9IHRvQXJyYXkoZXYudG91Y2hlcyk7XG4gIHZhciBjaGFuZ2VkID0gdG9BcnJheShldi5jaGFuZ2VkVG91Y2hlcyk7XG5cbiAgaWYgKHR5cGUgJiAoSU5QVVRfRU5EIHwgSU5QVVRfQ0FOQ0VMKSkge1xuICAgIGFsbCA9IHVuaXF1ZUFycmF5KGFsbC5jb25jYXQoY2hhbmdlZCksICdpZGVudGlmaWVyJywgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gW2FsbCwgY2hhbmdlZF07XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHdyYXAgYSBtZXRob2Qgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHN0YWNrIHRyYWNlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXRob2RcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZVxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIG5ldyBmdW5jdGlvbiB3cmFwcGluZyB0aGUgc3VwcGxpZWQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBkZXByZWNhdGUobWV0aG9kLCBuYW1lLCBtZXNzYWdlKSB7XG4gIHZhciBkZXByZWNhdGlvbk1lc3NhZ2UgPSBcIkRFUFJFQ0FURUQgTUVUSE9EOiBcIiArIG5hbWUgKyBcIlxcblwiICsgbWVzc2FnZSArIFwiIEFUIFxcblwiO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlID0gbmV3IEVycm9yKCdnZXQtc3RhY2stdHJhY2UnKTtcbiAgICB2YXIgc3RhY2sgPSBlICYmIGUuc3RhY2sgPyBlLnN0YWNrLnJlcGxhY2UoL15bXlxcKF0rP1tcXG4kXS9nbSwgJycpLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLCAnJykucmVwbGFjZSgvXk9iamVjdC48YW5vbnltb3VzPlxccypcXCgvZ20sICd7YW5vbnltb3VzfSgpQCcpIDogJ1Vua25vd24gU3RhY2sgVHJhY2UnO1xuICAgIHZhciBsb2cgPSB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUud2FybiB8fCB3aW5kb3cuY29uc29sZS5sb2cpO1xuXG4gICAgaWYgKGxvZykge1xuICAgICAgbG9nLmNhbGwod2luZG93LmNvbnNvbGUsIGRlcHJlY2F0aW9uTWVzc2FnZSwgc3RhY2spO1xuICAgIH1cblxuICAgIHJldHVybiBtZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICogZXh0ZW5kIG9iamVjdC5cbiAqIG1lYW5zIHRoYXQgcHJvcGVydGllcyBpbiBkZXN0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIG9uZXMgaW4gc3JjLlxuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW21lcmdlPWZhbHNlXVxuICogQHJldHVybnMge09iamVjdH0gZGVzdFxuICovXG5cbnZhciBleHRlbmQgPSBkZXByZWNhdGUoZnVuY3Rpb24gKGRlc3QsIHNyYywgbWVyZ2UpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzcmMpO1xuICB2YXIgaSA9IDA7XG5cbiAgd2hpbGUgKGkgPCBrZXlzLmxlbmd0aCkge1xuICAgIGlmICghbWVyZ2UgfHwgbWVyZ2UgJiYgZGVzdFtrZXlzW2ldXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXN0W2tleXNbaV1dID0gc3JjW2tleXNbaV1dO1xuICAgIH1cblxuICAgIGkrKztcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufSwgJ2V4dGVuZCcsICdVc2UgYGFzc2lnbmAuJyk7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIG1lcmdlIHRoZSB2YWx1ZXMgZnJvbSBzcmMgaW4gdGhlIGRlc3QuXG4gKiBtZWFucyB0aGF0IHByb3BlcnRpZXMgdGhhdCBleGlzdCBpbiBkZXN0IHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuIGJ5IHNyY1xuICogQHBhcmFtIHtPYmplY3R9IGRlc3RcbiAqIEBwYXJhbSB7T2JqZWN0fSBzcmNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlc3RcbiAqL1xuXG52YXIgbWVyZ2UgPSBkZXByZWNhdGUoZnVuY3Rpb24gKGRlc3QsIHNyYykge1xuICByZXR1cm4gZXh0ZW5kKGRlc3QsIHNyYywgdHJ1ZSk7XG59LCAnbWVyZ2UnLCAnVXNlIGBhc3NpZ25gLicpO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBzaW1wbGUgY2xhc3MgaW5oZXJpdGFuY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNoaWxkXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBiYXNlXG4gKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdXG4gKi9cblxuZnVuY3Rpb24gaW5oZXJpdChjaGlsZCwgYmFzZSwgcHJvcGVydGllcykge1xuICB2YXIgYmFzZVAgPSBiYXNlLnByb3RvdHlwZTtcbiAgdmFyIGNoaWxkUDtcbiAgY2hpbGRQID0gY2hpbGQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShiYXNlUCk7XG4gIGNoaWxkUC5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICBjaGlsZFAuX3N1cGVyID0gYmFzZVA7XG5cbiAgaWYgKHByb3BlcnRpZXMpIHtcbiAgICBhc3NpZ24kMShjaGlsZFAsIHByb3BlcnRpZXMpO1xuICB9XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqIHNpbXBsZSBmdW5jdGlvbiBiaW5kXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHRcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gYmluZEZuKGZuLCBjb250ZXh0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBib3VuZEZuKCkge1xuICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKiBTaW1wbGUgd2F5IHRvIGNyZWF0ZSBhIG1hbmFnZXIgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHJlY29nbml6ZXJzLlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQGNvbnN0cnVjdG9yXG4gKi9cblxudmFyIEhhbW1lciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIHZhciBIYW1tZXIgPVxuICAvKipcbiAgICAqIEBwcml2YXRlXG4gICAgKiBAY29uc3Qge3N0cmluZ31cbiAgICAqL1xuICBmdW5jdGlvbiBIYW1tZXIoZWxlbWVudCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1hbmFnZXIoZWxlbWVudCwgX2V4dGVuZHMoe1xuICAgICAgcmVjb2duaXplcnM6IHByZXNldC5jb25jYXQoKVxuICAgIH0sIG9wdGlvbnMpKTtcbiAgfTtcblxuICBIYW1tZXIuVkVSU0lPTiA9IFwiMi4wLjE3LXJjXCI7XG4gIEhhbW1lci5ESVJFQ1RJT05fQUxMID0gRElSRUNUSU9OX0FMTDtcbiAgSGFtbWVyLkRJUkVDVElPTl9ET1dOID0gRElSRUNUSU9OX0RPV047XG4gIEhhbW1lci5ESVJFQ1RJT05fTEVGVCA9IERJUkVDVElPTl9MRUZUO1xuICBIYW1tZXIuRElSRUNUSU9OX1JJR0hUID0gRElSRUNUSU9OX1JJR0hUO1xuICBIYW1tZXIuRElSRUNUSU9OX1VQID0gRElSRUNUSU9OX1VQO1xuICBIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUwgPSBESVJFQ1RJT05fSE9SSVpPTlRBTDtcbiAgSGFtbWVyLkRJUkVDVElPTl9WRVJUSUNBTCA9IERJUkVDVElPTl9WRVJUSUNBTDtcbiAgSGFtbWVyLkRJUkVDVElPTl9OT05FID0gRElSRUNUSU9OX05PTkU7XG4gIEhhbW1lci5ESVJFQ1RJT05fRE9XTiA9IERJUkVDVElPTl9ET1dOO1xuICBIYW1tZXIuSU5QVVRfU1RBUlQgPSBJTlBVVF9TVEFSVDtcbiAgSGFtbWVyLklOUFVUX01PVkUgPSBJTlBVVF9NT1ZFO1xuICBIYW1tZXIuSU5QVVRfRU5EID0gSU5QVVRfRU5EO1xuICBIYW1tZXIuSU5QVVRfQ0FOQ0VMID0gSU5QVVRfQ0FOQ0VMO1xuICBIYW1tZXIuU1RBVEVfUE9TU0lCTEUgPSBTVEFURV9QT1NTSUJMRTtcbiAgSGFtbWVyLlNUQVRFX0JFR0FOID0gU1RBVEVfQkVHQU47XG4gIEhhbW1lci5TVEFURV9DSEFOR0VEID0gU1RBVEVfQ0hBTkdFRDtcbiAgSGFtbWVyLlNUQVRFX0VOREVEID0gU1RBVEVfRU5ERUQ7XG4gIEhhbW1lci5TVEFURV9SRUNPR05JWkVEID0gU1RBVEVfUkVDT0dOSVpFRDtcbiAgSGFtbWVyLlNUQVRFX0NBTkNFTExFRCA9IFNUQVRFX0NBTkNFTExFRDtcbiAgSGFtbWVyLlNUQVRFX0ZBSUxFRCA9IFNUQVRFX0ZBSUxFRDtcbiAgSGFtbWVyLk1hbmFnZXIgPSBNYW5hZ2VyO1xuICBIYW1tZXIuSW5wdXQgPSBJbnB1dDtcbiAgSGFtbWVyLlRvdWNoQWN0aW9uID0gVG91Y2hBY3Rpb247XG4gIEhhbW1lci5Ub3VjaElucHV0ID0gVG91Y2hJbnB1dDtcbiAgSGFtbWVyLk1vdXNlSW5wdXQgPSBNb3VzZUlucHV0O1xuICBIYW1tZXIuUG9pbnRlckV2ZW50SW5wdXQgPSBQb2ludGVyRXZlbnRJbnB1dDtcbiAgSGFtbWVyLlRvdWNoTW91c2VJbnB1dCA9IFRvdWNoTW91c2VJbnB1dDtcbiAgSGFtbWVyLlNpbmdsZVRvdWNoSW5wdXQgPSBTaW5nbGVUb3VjaElucHV0O1xuICBIYW1tZXIuUmVjb2duaXplciA9IFJlY29nbml6ZXI7XG4gIEhhbW1lci5BdHRyUmVjb2duaXplciA9IEF0dHJSZWNvZ25pemVyO1xuICBIYW1tZXIuVGFwID0gVGFwUmVjb2duaXplcjtcbiAgSGFtbWVyLlBhbiA9IFBhblJlY29nbml6ZXI7XG4gIEhhbW1lci5Td2lwZSA9IFN3aXBlUmVjb2duaXplcjtcbiAgSGFtbWVyLlBpbmNoID0gUGluY2hSZWNvZ25pemVyO1xuICBIYW1tZXIuUm90YXRlID0gUm90YXRlUmVjb2duaXplcjtcbiAgSGFtbWVyLlByZXNzID0gUHJlc3NSZWNvZ25pemVyO1xuICBIYW1tZXIub24gPSBhZGRFdmVudExpc3RlbmVycztcbiAgSGFtbWVyLm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJzO1xuICBIYW1tZXIuZWFjaCA9IGVhY2g7XG4gIEhhbW1lci5tZXJnZSA9IG1lcmdlO1xuICBIYW1tZXIuZXh0ZW5kID0gZXh0ZW5kO1xuICBIYW1tZXIuYmluZEZuID0gYmluZEZuO1xuICBIYW1tZXIuYXNzaWduID0gYXNzaWduJDE7XG4gIEhhbW1lci5pbmhlcml0ID0gaW5oZXJpdDtcbiAgSGFtbWVyLmJpbmRGbiA9IGJpbmRGbjtcbiAgSGFtbWVyLnByZWZpeGVkID0gcHJlZml4ZWQ7XG4gIEhhbW1lci50b0FycmF5ID0gdG9BcnJheTtcbiAgSGFtbWVyLmluQXJyYXkgPSBpbkFycmF5O1xuICBIYW1tZXIudW5pcXVlQXJyYXkgPSB1bmlxdWVBcnJheTtcbiAgSGFtbWVyLnNwbGl0U3RyID0gc3BsaXRTdHI7XG4gIEhhbW1lci5ib29sT3JGbiA9IGJvb2xPckZuO1xuICBIYW1tZXIuaGFzUGFyZW50ID0gaGFzUGFyZW50O1xuICBIYW1tZXIuYWRkRXZlbnRMaXN0ZW5lcnMgPSBhZGRFdmVudExpc3RlbmVycztcbiAgSGFtbWVyLnJlbW92ZUV2ZW50TGlzdGVuZXJzID0gcmVtb3ZlRXZlbnRMaXN0ZW5lcnM7XG4gIEhhbW1lci5kZWZhdWx0cyA9IGFzc2lnbiQxKHt9LCBkZWZhdWx0cywge1xuICAgIHByZXNldDogcHJlc2V0XG4gIH0pO1xuICByZXR1cm4gSGFtbWVyO1xufSgpO1xuXG4vLyAgc3R5bGUgbG9hZGVyIGJ1dCBieSBzY3JpcHQgdGFnLCBub3QgYnkgdGhlIGxvYWRlci5cblxudmFyIGRlZmF1bHRzJDEgPSBIYW1tZXIuZGVmYXVsdHM7XG5cbmV4cG9ydCBkZWZhdWx0IEhhbW1lcjtcbmV4cG9ydCB7IElOUFVUX1NUQVJULCBJTlBVVF9NT1ZFLCBJTlBVVF9FTkQsIElOUFVUX0NBTkNFTCwgU1RBVEVfUE9TU0lCTEUsIFNUQVRFX0JFR0FOLCBTVEFURV9DSEFOR0VELCBTVEFURV9FTkRFRCwgU1RBVEVfUkVDT0dOSVpFRCwgU1RBVEVfQ0FOQ0VMTEVELCBTVEFURV9GQUlMRUQsIERJUkVDVElPTl9OT05FLCBESVJFQ1RJT05fTEVGVCwgRElSRUNUSU9OX1JJR0hULCBESVJFQ1RJT05fVVAsIERJUkVDVElPTl9ET1dOLCBESVJFQ1RJT05fSE9SSVpPTlRBTCwgRElSRUNUSU9OX1ZFUlRJQ0FMLCBESVJFQ1RJT05fQUxMLCBNYW5hZ2VyLCBJbnB1dCwgVG91Y2hBY3Rpb24sIFRvdWNoSW5wdXQsIE1vdXNlSW5wdXQsIFBvaW50ZXJFdmVudElucHV0LCBUb3VjaE1vdXNlSW5wdXQsIFNpbmdsZVRvdWNoSW5wdXQsIFJlY29nbml6ZXIsIEF0dHJSZWNvZ25pemVyLCBUYXBSZWNvZ25pemVyIGFzIFRhcCwgUGFuUmVjb2duaXplciBhcyBQYW4sIFN3aXBlUmVjb2duaXplciBhcyBTd2lwZSwgUGluY2hSZWNvZ25pemVyIGFzIFBpbmNoLCBSb3RhdGVSZWNvZ25pemVyIGFzIFJvdGF0ZSwgUHJlc3NSZWNvZ25pemVyIGFzIFByZXNzLCBhZGRFdmVudExpc3RlbmVycyBhcyBvbiwgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMgYXMgb2ZmLCBlYWNoLCBtZXJnZSwgZXh0ZW5kLCBhc3NpZ24kMSBhcyBhc3NpZ24sIGluaGVyaXQsIGJpbmRGbiwgcHJlZml4ZWQsIHRvQXJyYXksIGluQXJyYXksIHVuaXF1ZUFycmF5LCBzcGxpdFN0ciwgYm9vbE9yRm4sIGhhc1BhcmVudCwgYWRkRXZlbnRMaXN0ZW5lcnMsIHJlbW92ZUV2ZW50TGlzdGVuZXJzLCBkZWZhdWx0cyQxIGFzIGRlZmF1bHRzIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1oYW1tZXIuZXNtLmpzLm1hcFxuIiwiLyoqXG4gKiB2aXMtdXRpbFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Zpc2pzL3Zpcy11dGlsXG4gKlxuICogdXRpbGl0aWUgY29sbGVjdGlvbiBmb3IgdmlzanNcbiAqXG4gKiBAdmVyc2lvbiA1LjAuMlxuICogQGRhdGUgICAgMjAyMS0wMi0wNlQyMTozMzo1Ny40NDdaXG4gKlxuICogQGNvcHlyaWdodCAoYykgMjAxMS0yMDE3IEFsbWVuZGUgQi5WLCBodHRwOi8vYWxtZW5kZS5jb21cbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTctMjAxOSB2aXNqcyBjb250cmlidXRvcnMsIGh0dHBzOi8vZ2l0aHViLmNvbS92aXNqc1xuICpcbiAqIEBsaWNlbnNlXG4gKiB2aXMuanMgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoXG4gKlxuICogICAxLiBUaGUgQXBhY2hlIDIuMCBMaWNlbnNlXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICAgYW5kXG4gKlxuICogICAyLiBUaGUgTUlUIExpY2Vuc2VcbiAqICAgICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIHZpcy5qcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IEVtaXR0ZXIgZnJvbSAnY29tcG9uZW50LWVtaXR0ZXInO1xuaW1wb3J0IFJlYWxIYW1tZXIgZnJvbSAnQGVnanMvaGFtbWVyanMnO1xuXG4vKipcclxuICogVXNlIHRoaXMgc3ltYm9sIHRvIGRlbGV0ZSBwcm9wZXJpZXMgaW4gZGVlcE9iamVjdEFzc2lnbi5cclxuICovXHJcbmNvbnN0IERFTEVURSA9IFN5bWJvbChcIkRFTEVURVwiKTtcclxuLyoqXHJcbiAqIFB1cmUgdmVyc2lvbiBvZiBkZWVwT2JqZWN0QXNzaWduLCBpdCBkb2Vzbid0IG1vZGlmeSBhbnkgb2YgaXQncyBhcmd1bWVudHMuXHJcbiAqXHJcbiAqIEBwYXJhbSBiYXNlIC0gVGhlIGJhc2Ugb2JqZWN0IHRoYXQgZnVsbGZpbHMgdGhlIHdob2xlIGludGVyZmFjZSBULlxyXG4gKiBAcGFyYW0gdXBkYXRlcyAtIFVwZGF0ZXMgdGhhdCBtYXkgY2hhbmdlIG9yIGRlbGV0ZSBwcm9wcy5cclxuICpcclxuICogQHJldHVybnMgQSBicmFuZCBuZXcgaW5zdGFuY2Ugd2l0aCBhbGwgdGhlIHN1cHBsaWVkIG9iamVjdHMgZGVlcGx5IG1lcmdlZC5cclxuICovXHJcbmZ1bmN0aW9uIHB1cmVEZWVwT2JqZWN0QXNzaWduKGJhc2UsIC4uLnVwZGF0ZXMpIHtcclxuICAgIHJldHVybiBkZWVwT2JqZWN0QXNzaWduKHt9LCBiYXNlLCAuLi51cGRhdGVzKTtcclxufVxyXG4vKipcclxuICogRGVlcCB2ZXJzaW9uIG9mIG9iamVjdCBhc3NpZ24gd2l0aCBhZGRpdGlvbmFsIGRlbGV0aW5nIGJ5IHRoZSBERUxFVEUgc3ltYm9sLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWVzIC0gT2JqZWN0cyB0byBiZSBkZWVwbHkgbWVyZ2VkLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUaGUgZmlyc3Qgb2JqZWN0IGZyb20gdmFsdWVzLlxyXG4gKi9cclxuZnVuY3Rpb24gZGVlcE9iamVjdEFzc2lnbiguLi52YWx1ZXMpIHtcclxuICAgIGNvbnN0IG1lcmdlZCA9IGRlZXBPYmplY3RBc3NpZ25Ob25lbnRyeSguLi52YWx1ZXMpO1xyXG4gICAgc3RyaXBEZWxldGUobWVyZ2VkKTtcclxuICAgIHJldHVybiBtZXJnZWQ7XHJcbn1cclxuLyoqXHJcbiAqIERlZXAgdmVyc2lvbiBvZiBvYmplY3QgYXNzaWduIHdpdGggYWRkaXRpb25hbCBkZWxldGluZyBieSB0aGUgREVMRVRFIHN5bWJvbC5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhpcyBkb2Vzbid0IHN0cmlwIHRoZSBERUxFVEUgc3ltYm9scyBzbyB0aGV5IG1heSBlbmQgdXAgaW4gdGhlIGZpbmFsIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIHZhbHVlcyAtIE9iamVjdHMgdG8gYmUgZGVlcGx5IG1lcmdlZC5cclxuICpcclxuICogQHJldHVybnMgVGhlIGZpcnN0IG9iamVjdCBmcm9tIHZhbHVlcy5cclxuICovXHJcbmZ1bmN0aW9uIGRlZXBPYmplY3RBc3NpZ25Ob25lbnRyeSguLi52YWx1ZXMpIHtcclxuICAgIGlmICh2YWx1ZXMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZXNbMF07XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh2YWx1ZXMubGVuZ3RoID4gMikge1xyXG4gICAgICAgIHJldHVybiBkZWVwT2JqZWN0QXNzaWduTm9uZW50cnkoZGVlcE9iamVjdEFzc2lnbih2YWx1ZXNbMF0sIHZhbHVlc1sxXSksIC4uLnZhbHVlcy5zbGljZSgyKSk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhID0gdmFsdWVzWzBdO1xyXG4gICAgY29uc3QgYiA9IHZhbHVlc1sxXTtcclxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoYikpIHtcclxuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChiLCBwcm9wKSkgO1xyXG4gICAgICAgIGVsc2UgaWYgKGJbcHJvcF0gPT09IERFTEVURSkge1xyXG4gICAgICAgICAgICBkZWxldGUgYVtwcm9wXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYVtwcm9wXSAhPT0gbnVsbCAmJlxyXG4gICAgICAgICAgICBiW3Byb3BdICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgIHR5cGVvZiBhW3Byb3BdID09PSBcIm9iamVjdFwiICYmXHJcbiAgICAgICAgICAgIHR5cGVvZiBiW3Byb3BdID09PSBcIm9iamVjdFwiICYmXHJcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGFbcHJvcF0pICYmXHJcbiAgICAgICAgICAgICFBcnJheS5pc0FycmF5KGJbcHJvcF0pKSB7XHJcbiAgICAgICAgICAgIGFbcHJvcF0gPSBkZWVwT2JqZWN0QXNzaWduTm9uZW50cnkoYVtwcm9wXSwgYltwcm9wXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBhW3Byb3BdID0gY2xvbmUoYltwcm9wXSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuLyoqXHJcbiAqIERlZXAgY2xvbmUgZ2l2ZW4gb2JqZWN0IG9yIGFycmF5LiBJbiBjYXNlIG9mIHByaW1pdGl2ZSBzaW1wbHkgcmV0dXJuLlxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIEFueXRoaW5nLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBEZWVwIGNsb25lZCBvYmplY3QvYXJyYXkgb3IgdW5jaGFuZ2VkIGEuXHJcbiAqL1xyXG5mdW5jdGlvbiBjbG9uZShhKSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xyXG4gICAgICAgIHJldHVybiBhLm1hcCgodmFsdWUpID0+IGNsb25lKHZhbHVlKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiBhICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIGRlZXBPYmplY3RBc3NpZ25Ob25lbnRyeSh7fSwgYSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gYTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogU3RyaXAgREVMRVRFIGZyb20gZ2l2ZW4gb2JqZWN0LlxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIE9iamVjdCB3aGljaCBtYXkgY29udGFpbiBERUxFVEUgYnV0IHdvbid0IGFmdGVyIHRoaXMgaXMgZXhlY3V0ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBzdHJpcERlbGV0ZShhKSB7XHJcbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoYSkpIHtcclxuICAgICAgICBpZiAoYVtwcm9wXSA9PT0gREVMRVRFKSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBhW3Byb3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgYVtwcm9wXSA9PT0gXCJvYmplY3RcIiAmJiBhW3Byb3BdICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHN0cmlwRGVsZXRlKGFbcHJvcF0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogU2VlZGFibGUsIGZhc3QgYW5kIHJlYXNvbmFibHkgZ29vZCAobm90IGNyeXB0byBidXQgbW9yZSB0aGFuIG9rYXkgZm9yIG91clxyXG4gKiBuZWVkcykgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEFkYXB0ZWQgZnJvbSB7QGxpbmsgaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTEwNDI5MTAwNzM2L2h0dHA6Ly9iYWFnb2UuY29tOjgwL2VuL1JhbmRvbU11c2luZ3MvamF2YXNjcmlwdH0uXHJcbiAqIE9yaWdpbmFsIGFsZ29yaXRobSBjcmVhdGVkIGJ5IEpvaGFubmVzIEJhYWfDuGUgXFw8YmFhZ29lXFxAYmFhZ29lLmNvbVxcPiBpbiAyMDEwLlxyXG4gKi9cclxuLyoqXHJcbiAqIENyZWF0ZSBhIHNlZWRlZCBwc2V1ZG8gcmFuZG9tIGdlbmVyYXRvciBiYXNlZCBvbiBBbGVhIGJ5IEpvaGFubmVzIEJhYWfDuGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBzZWVkIC0gQWxsIHN1cHBsaWVkIGFyZ3VtZW50cyB3aWxsIGJlIHVzZWQgYXMgYSBzZWVkLiBJbiBjYXNlIG5vdGhpbmdcclxuICogaXMgc3VwcGxpZWQgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIHVzZWQgdG8gc2VlZCB0aGUgZ2VuZXJhdG9yLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIHJlYWR5IHRvIHVzZSBzZWVkZWQgZ2VuZXJhdG9yLlxyXG4gKi9cclxuZnVuY3Rpb24gQWxlYSguLi5zZWVkKSB7XHJcbiAgICByZXR1cm4gQWxlYUltcGxlbWVudGF0aW9uKHNlZWQubGVuZ3RoID8gc2VlZCA6IFtEYXRlLm5vdygpXSk7XHJcbn1cclxuLyoqXHJcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIFtbQWxlYV1dIHdpdGhvdXQgdXNlciBpbnB1dCB2YWxpZGF0aW9uLlxyXG4gKlxyXG4gKiBAcGFyYW0gc2VlZCAtIFRoZSBkYXRhIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNlZWQgdGhlIGdlbmVyYXRvci5cclxuICpcclxuICogQHJldHVybnMgQSByZWFkeSB0byB1c2Ugc2VlZGVkIGdlbmVyYXRvci5cclxuICovXHJcbmZ1bmN0aW9uIEFsZWFJbXBsZW1lbnRhdGlvbihzZWVkKSB7XHJcbiAgICBsZXQgW3MwLCBzMSwgczJdID0gbWFzaFNlZWQoc2VlZCk7XHJcbiAgICBsZXQgYyA9IDE7XHJcbiAgICBjb25zdCByYW5kb20gPSAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdCA9IDIwOTE2MzkgKiBzMCArIGMgKiAyLjMyODMwNjQzNjUzODY5NjNlLTEwOyAvLyAyXi0zMlxyXG4gICAgICAgIHMwID0gczE7XHJcbiAgICAgICAgczEgPSBzMjtcclxuICAgICAgICByZXR1cm4gKHMyID0gdCAtIChjID0gdCB8IDApKTtcclxuICAgIH07XHJcbiAgICByYW5kb20udWludDMyID0gKCkgPT4gcmFuZG9tKCkgKiAweDEwMDAwMDAwMDsgLy8gMl4zMlxyXG4gICAgcmFuZG9tLmZyYWN0NTMgPSAoKSA9PiByYW5kb20oKSArICgocmFuZG9tKCkgKiAweDIwMDAwMCkgfCAwKSAqIDEuMTEwMjIzMDI0NjI1MTU2NWUtMTY7IC8vIDJeLTUzXHJcbiAgICByYW5kb20uYWxnb3JpdGhtID0gXCJBbGVhXCI7XHJcbiAgICByYW5kb20uc2VlZCA9IHNlZWQ7XHJcbiAgICByYW5kb20udmVyc2lvbiA9IFwiMC45XCI7XHJcbiAgICByZXR1cm4gcmFuZG9tO1xyXG59XHJcbi8qKlxyXG4gKiBUdXJuIGFyYml0cmFyeSBkYXRhIGludG8gdmFsdWVzIFtbQWxlYUltcGxlbWVudGF0aW9uXV0gY2FuIHVzZSB0byBnZW5lcmF0ZVxyXG4gKiByYW5kb20gbnVtYmVycy5cclxuICpcclxuICogQHBhcmFtIHNlZWQgLSBBcmJpdHJhcnkgZGF0YSB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgc2VlZC5cclxuICpcclxuICogQHJldHVybnMgVGhyZWUgbnVtYmVycyB0byB1c2UgYXMgaW5pdGlhbCB2YWx1ZXMgZm9yIFtbQWxlYUltcGxlbWVudGF0aW9uXV0uXHJcbiAqL1xyXG5mdW5jdGlvbiBtYXNoU2VlZCguLi5zZWVkKSB7XHJcbiAgICBjb25zdCBtYXNoID0gTWFzaCgpO1xyXG4gICAgbGV0IHMwID0gbWFzaChcIiBcIik7XHJcbiAgICBsZXQgczEgPSBtYXNoKFwiIFwiKTtcclxuICAgIGxldCBzMiA9IG1hc2goXCIgXCIpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWVkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgczAgLT0gbWFzaChzZWVkW2ldKTtcclxuICAgICAgICBpZiAoczAgPCAwKSB7XHJcbiAgICAgICAgICAgIHMwICs9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHMxIC09IG1hc2goc2VlZFtpXSk7XHJcbiAgICAgICAgaWYgKHMxIDwgMCkge1xyXG4gICAgICAgICAgICBzMSArPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzMiAtPSBtYXNoKHNlZWRbaV0pO1xyXG4gICAgICAgIGlmIChzMiA8IDApIHtcclxuICAgICAgICAgICAgczIgKz0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW3MwLCBzMSwgczJdO1xyXG59XHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBuZXcgbWFzaCBmdW5jdGlvbi5cclxuICpcclxuICogQHJldHVybnMgQSBub25wdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYXJiaXRyYXJ5IFtbTWFzaGFibGVdXSBkYXRhIGFuZCB0dXJuc1xyXG4gKiB0aGVtIGludG8gbnVtYmVycy5cclxuICovXHJcbmZ1bmN0aW9uIE1hc2goKSB7XHJcbiAgICBsZXQgbiA9IDB4ZWZjODI0OWQ7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBjb25zdCBzdHJpbmcgPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbiArPSBzdHJpbmcuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgICAgbGV0IGggPSAwLjAyNTE5NjAzMjgyNDE2OTM4ICogbjtcclxuICAgICAgICAgICAgbiA9IGggPj4+IDA7XHJcbiAgICAgICAgICAgIGggLT0gbjtcclxuICAgICAgICAgICAgaCAqPSBuO1xyXG4gICAgICAgICAgICBuID0gaCA+Pj4gMDtcclxuICAgICAgICAgICAgaCAtPSBuO1xyXG4gICAgICAgICAgICBuICs9IGggKiAweDEwMDAwMDAwMDsgLy8gMl4zMlxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKG4gPj4+IDApICogMi4zMjgzMDY0MzY1Mzg2OTYzZS0xMDsgLy8gMl4tMzJcclxuICAgIH07XHJcbn1cblxuLyoqXG4gKiBTZXR1cCBhIG1vY2sgaGFtbWVyLmpzIG9iamVjdCwgZm9yIHVuaXQgdGVzdGluZy5cbiAqXG4gKiBJbnNwaXJhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL3ViZXIvZGVjay5nbC9wdWxsLzY1OFxuICpcbiAqIEByZXR1cm5zIHt7b246IG5vb3AsIG9mZjogbm9vcCwgZGVzdHJveTogbm9vcCwgZW1pdDogbm9vcCwgZ2V0OiBnZXR9fVxuICovXG5mdW5jdGlvbiBoYW1tZXJNb2NrKCkge1xuICBjb25zdCBub29wID0gKCkgPT4ge307XG5cbiAgcmV0dXJuIHtcbiAgICBvbjogbm9vcCxcbiAgICBvZmY6IG5vb3AsXG4gICAgZGVzdHJveTogbm9vcCxcbiAgICBlbWl0OiBub29wLFxuXG4gICAgZ2V0KCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0OiBub29wLFxuICAgICAgfTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBIYW1tZXIgPVxuICB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiXG4gICAgPyB3aW5kb3cuSGFtbWVyIHx8IFJlYWxIYW1tZXJcbiAgICA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gaGFtbWVyLmpzIGlzIG9ubHkgYXZhaWxhYmxlIGluIGEgYnJvd3Nlciwgbm90IGluIG5vZGUuanMuIFJlcGxhY2luZyBpdCB3aXRoIGEgbW9jayBvYmplY3QuXG4gICAgICAgIHJldHVybiBoYW1tZXJNb2NrKCk7XG4gICAgICB9O1xuXG4vKipcbiAqIFR1cm4gYW4gZWxlbWVudCBpbnRvIGFuIGNsaWNrVG9Vc2UgZWxlbWVudC5cbiAqIFdoZW4gbm90IGFjdGl2ZSwgdGhlIGVsZW1lbnQgaGFzIGEgdHJhbnNwYXJlbnQgb3ZlcmxheS4gV2hlbiB0aGUgb3ZlcmxheSBpc1xuICogY2xpY2tlZCwgdGhlIG1vZGUgaXMgY2hhbmdlZCB0byBhY3RpdmUuXG4gKiBXaGVuIGFjdGl2ZSwgdGhlIGVsZW1lbnQgaXMgZGlzcGxheWVkIHdpdGggYSBibHVlIGJvcmRlciBhcm91bmQgaXQsIGFuZFxuICogdGhlIGludGVyYWN0aXZlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IGNhbiBiZSB1c2VkLiBXaGVuIGNsaWNrZWQgb3V0c2lkZVxuICogdGhlIGVsZW1lbnQsIHRoZSBlbGVtZW50cyBtb2RlIGlzIGNoYW5nZWQgdG8gaW5hY3RpdmUuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXJcbiAqIEBjbGFzcyBBY3RpdmF0b3JcbiAqL1xuZnVuY3Rpb24gQWN0aXZhdG9yKGNvbnRhaW5lcikge1xuICB0aGlzLl9jbGVhbnVwUXVldWUgPSBbXTtcblxuICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gIHRoaXMuX2RvbSA9IHtcbiAgICBjb250YWluZXIsXG4gICAgb3ZlcmxheTogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgfTtcblxuICB0aGlzLl9kb20ub3ZlcmxheS5jbGFzc0xpc3QuYWRkKFwidmlzLW92ZXJsYXlcIik7XG5cbiAgdGhpcy5fZG9tLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLl9kb20ub3ZlcmxheSk7XG4gIHRoaXMuX2NsZWFudXBRdWV1ZS5wdXNoKCgpID0+IHtcbiAgICB0aGlzLl9kb20ub3ZlcmxheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2RvbS5vdmVybGF5KTtcbiAgfSk7XG5cbiAgY29uc3QgaGFtbWVyID0gSGFtbWVyKHRoaXMuX2RvbS5vdmVybGF5KTtcbiAgaGFtbWVyLm9uKFwidGFwXCIsIHRoaXMuX29uVGFwT3ZlcmxheS5iaW5kKHRoaXMpKTtcbiAgdGhpcy5fY2xlYW51cFF1ZXVlLnB1c2goKCkgPT4ge1xuICAgIGhhbW1lci5kZXN0cm95KCk7XG4gICAgLy8gRklYTUU6IGNsZWFuaW5nIHVwIGhhbW1lciBpbnN0YW5jZXMgZG9lc24ndCB3b3JrIChUaW1lbGluZSBub3QgcmVtb3ZlZFxuICAgIC8vIGZyb20gbWVtb3J5KVxuICB9KTtcblxuICAvLyBibG9jayBhbGwgdG91Y2ggZXZlbnRzIChleGNlcHQgdGFwKVxuICBjb25zdCBldmVudHMgPSBbXG4gICAgXCJ0YXBcIixcbiAgICBcImRvdWJsZXRhcFwiLFxuICAgIFwicHJlc3NcIixcbiAgICBcInBpbmNoXCIsXG4gICAgXCJwYW5cIixcbiAgICBcInBhbnN0YXJ0XCIsXG4gICAgXCJwYW5tb3ZlXCIsXG4gICAgXCJwYW5lbmRcIixcbiAgXTtcbiAgZXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgaGFtbWVyLm9uKGV2ZW50LCAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBhdHRhY2ggYSBjbGljayBldmVudCB0byB0aGUgd2luZG93LCBpbiBvcmRlciB0byBkZWFjdGl2YXRlIHdoZW4gY2xpY2tpbmcgb3V0c2lkZSB0aGUgdGltZWxpbmVcbiAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LmJvZHkpIHtcbiAgICB0aGlzLl9vbkNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoIV9oYXNQYXJlbnQoZXZlbnQudGFyZ2V0LCBjb250YWluZXIpKSB7XG4gICAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5fb25DbGljayk7XG4gICAgdGhpcy5fY2xlYW51cFF1ZXVlLnB1c2goKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5fb25DbGljayk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBwcmVwYXJlIGVzY2FwZSBrZXkgbGlzdGVuZXIgZm9yIGRlYWN0aXZhdGluZyB3aGVuIGFjdGl2ZVxuICB0aGlzLl9lc2NMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFwia2V5XCIgaW4gZXZlbnRcbiAgICAgICAgPyBldmVudC5rZXkgPT09IFwiRXNjYXBlXCJcbiAgICAgICAgOiBldmVudC5rZXlDb2RlID09PSAyNyAvKiB0aGUga2V5Q29kZSBpcyBmb3IgSUUxMSAqL1xuICAgICkge1xuICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgfVxuICB9O1xufVxuXG4vLyB0dXJuIGludG8gYW4gZXZlbnQgZW1pdHRlclxuRW1pdHRlcihBY3RpdmF0b3IucHJvdG90eXBlKTtcblxuLy8gVGhlIGN1cnJlbnRseSBhY3RpdmUgYWN0aXZhdG9yXG5BY3RpdmF0b3IuY3VycmVudCA9IG51bGw7XG5cbi8qKlxuICogRGVzdHJveSB0aGUgYWN0aXZhdG9yLiBDbGVhbnMgdXAgYWxsIGNyZWF0ZWQgRE9NIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAqL1xuQWN0aXZhdG9yLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmRlYWN0aXZhdGUoKTtcblxuICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuX2NsZWFudXBRdWV1ZS5zcGxpY2UoMCkucmV2ZXJzZSgpKSB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBY3RpdmF0ZSB0aGUgZWxlbWVudFxuICogT3ZlcmxheSBpcyBoaWRkZW4sIGVsZW1lbnQgaXMgZGVjb3JhdGVkIHdpdGggYSBibHVlIHNoYWRvdyBib3JkZXJcbiAqL1xuQWN0aXZhdG9yLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gd2UgYWxsb3cgb25seSBvbmUgYWN0aXZlIGFjdGl2YXRvciBhdCBhIHRpbWVcbiAgaWYgKEFjdGl2YXRvci5jdXJyZW50KSB7XG4gICAgQWN0aXZhdG9yLmN1cnJlbnQuZGVhY3RpdmF0ZSgpO1xuICB9XG4gIEFjdGl2YXRvci5jdXJyZW50ID0gdGhpcztcblxuICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gIHRoaXMuX2RvbS5vdmVybGF5LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgdGhpcy5fZG9tLmNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwidmlzLWFjdGl2ZVwiKTtcblxuICB0aGlzLmVtaXQoXCJjaGFuZ2VcIik7XG4gIHRoaXMuZW1pdChcImFjdGl2YXRlXCIpO1xuXG4gIC8vIHVnbHkgaGFjazogYmluZCBFU0MgYWZ0ZXIgZW1pdHRpbmcgdGhlIGV2ZW50cywgYXMgdGhlIE5ldHdvcmsgcmViaW5kcyBhbGxcbiAgLy8ga2V5Ym9hcmQgZXZlbnRzIG9uIGEgJ2NoYW5nZScgZXZlbnRcbiAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLl9lc2NMaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIERlYWN0aXZhdGUgdGhlIGVsZW1lbnRcbiAqIE92ZXJsYXkgaXMgZGlzcGxheWVkIG9uIHRvcCBvZiB0aGUgZWxlbWVudFxuICovXG5BY3RpdmF0b3IucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIHRoaXMuX2RvbS5vdmVybGF5LnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gIHRoaXMuX2RvbS5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcInZpcy1hY3RpdmVcIik7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5fZXNjTGlzdGVuZXIpO1xuXG4gIHRoaXMuZW1pdChcImNoYW5nZVwiKTtcbiAgdGhpcy5lbWl0KFwiZGVhY3RpdmF0ZVwiKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIGEgdGFwIGV2ZW50OiBhY3RpdmF0ZSB0aGUgY29udGFpbmVyXG4gKlxuICogQHBhcmFtIHtFdmVudH0gIGV2ZW50ICAgVGhlIGV2ZW50XG4gKiBAcHJpdmF0ZVxuICovXG5BY3RpdmF0b3IucHJvdG90eXBlLl9vblRhcE92ZXJsYXkgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgLy8gYWN0aXZhdGUgdGhlIGNvbnRhaW5lclxuICB0aGlzLmFjdGl2YXRlKCk7XG4gIGV2ZW50LnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xufTtcblxuLyoqXG4gKiBUZXN0IHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIHRoZSByZXF1ZXN0ZWQgcGFyZW50IGVsZW1lbnQgc29tZXdoZXJlIGluXG4gKiBpdHMgY2hhaW4gb2YgcGFyZW50IG5vZGVzLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHBhcmVudFxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSB3aGVuIHRoZSBwYXJlbnQgaXMgZm91bmQgc29tZXdoZXJlIGluIHRoZVxuICogICAgICAgICAgICAgICAgICAgIGNoYWluIG9mIHBhcmVudCBub2Rlcy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9oYXNQYXJlbnQoZWxlbWVudCwgcGFyZW50KSB7XG4gIHdoaWxlIChlbGVtZW50KSB7XG4gICAgaWYgKGVsZW1lbnQgPT09IHBhcmVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xyXG4vLyBwYXJzZSBBU1AuTmV0IERhdGUgcGF0dGVybixcclxuLy8gZm9yIGV4YW1wbGUgJy9EYXRlKDExOTg5MDg3MTcwNTYpLycgb3IgJy9EYXRlKDExOTg5MDg3MTcwNTYtMDcwMCkvJ1xyXG4vLyBjb2RlIGZyb20gaHR0cDovL21vbWVudGpzLmNvbS9cclxuY29uc3QgQVNQRGF0ZVJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2k7XHJcbi8vIENvbG9yIFJFc1xyXG5jb25zdCBmdWxsSGV4UkUgPSAvXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pO1xyXG5jb25zdCBzaG9ydEhleFJFID0gL14jPyhbYS1mXFxkXSkoW2EtZlxcZF0pKFthLWZcXGRdKSQvaTtcclxuY29uc3QgcmdiUkUgPSAvXnJnYlxcKCAqKDE/XFxkezEsMn18MlswLTRdXFxkfDI1WzAtNV0pICosICooMT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkgKiwgKigxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSAqXFwpJC9pO1xyXG5jb25zdCByZ2JhUkUgPSAvXnJnYmFcXCggKigxP1xcZHsxLDJ9fDJbMC00XVxcZHwyNVswLTVdKSAqLCAqKDE/XFxkezEsMn18MlswLTRdXFxkfDI1WzAtNV0pICosICooMT9cXGR7MSwyfXwyWzAtNF1cXGR8MjVbMC01XSkgKiwgKihbMDFdfDA/XFwuXFxkKykgKlxcKSQvaTtcclxuLyoqXHJcbiAqIFRlc3Qgd2hldGhlciBnaXZlbiBvYmplY3QgaXMgYSBudW1iZXIuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSAtIElucHV0IHZhbHVlIG9mIHVua25vd24gdHlwZS5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBudW1iZXIsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiO1xyXG59XHJcbi8qKlxyXG4gKiBSZW1vdmUgZXZlcnl0aGluZyBpbiB0aGUgRE9NIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIERPTW9iamVjdCAtIE5vZGUgd2hvc2UgY2hpbGQgbm9kZXMgd2lsbCBiZSByZWN1cnNpdmVseSBkZWxldGVkLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVjdXJzaXZlRE9NRGVsZXRlKERPTW9iamVjdCkge1xyXG4gICAgaWYgKERPTW9iamVjdCkge1xyXG4gICAgICAgIHdoaWxlIChET01vYmplY3QuaGFzQ2hpbGROb2RlcygpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gRE9Nb2JqZWN0LmZpcnN0Q2hpbGQ7XHJcbiAgICAgICAgICAgIGlmIChjaGlsZCkge1xyXG4gICAgICAgICAgICAgICAgcmVjdXJzaXZlRE9NRGVsZXRlKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIERPTW9iamVjdC5yZW1vdmVDaGlsZChjaGlsZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFRlc3Qgd2hldGhlciBnaXZlbiBvYmplY3QgaXMgYSBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSB2YWx1ZSAtIElucHV0IHZhbHVlIG9mIHVua25vd24gdHlwZS5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xyXG59XHJcbi8qKlxyXG4gKiBUZXN0IHdoZXRoZXIgZ2l2ZW4gb2JqZWN0IGlzIGEgb2JqZWN0IChub3QgcHJpbWl0aXZlIG9yIG51bGwpLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgLSBJbnB1dCB2YWx1ZSBvZiB1bmtub3duIHR5cGUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgbm90IG51bGwgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbDtcclxufVxyXG4vKipcclxuICogVGVzdCB3aGV0aGVyIGdpdmVuIG9iamVjdCBpcyBhIERhdGUsIG9yIGEgU3RyaW5nIGNvbnRhaW5pbmcgYSBEYXRlLlxyXG4gKlxyXG4gKiBAcGFyYW0gdmFsdWUgLSBJbnB1dCB2YWx1ZSBvZiB1bmtub3duIHR5cGUuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgRGF0ZSBpbnN0YW5jZSBvciBzdHJpbmcgZGF0ZSByZXByZXNlbnRhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNEYXRlKHZhbHVlKSB7XHJcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcclxuICAgICAgICAvLyB0ZXN0IHdoZXRoZXIgdGhpcyBzdHJpbmcgY29udGFpbnMgYSBkYXRlXHJcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBBU1BEYXRlUmVnZXguZXhlYyh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKG1hdGNoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmICghaXNOYU4oRGF0ZS5wYXJzZSh2YWx1ZSkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxufVxyXG4vKipcclxuICogQ29weSBwcm9wZXJ0eSBmcm9tIGIgdG8gYSBpZiBwcm9wZXJ0eSBwcmVzZW50IGluIGEuXHJcbiAqIElmIHByb3BlcnR5IGluIGIgZXhwbGljaXRseSBzZXQgdG8gbnVsbCwgZGVsZXRlIGl0IGlmIGBhbGxvd0RlbGV0aW9uYCBzZXQuXHJcbiAqXHJcbiAqIEludGVybmFsIGhlbHBlciByb3V0aW5lLCBzaG91bGQgbm90IGJlIGV4cG9ydGVkLiBOb3QgYWRkZWQgdG8gYGV4cG9ydHNgIGZvciB0aGF0IHJlYXNvbi5cclxuICpcclxuICogQHBhcmFtIGEgLSBUYXJnZXQgb2JqZWN0LlxyXG4gKiBAcGFyYW0gYiAtIFNvdXJjZSBvYmplY3QuXHJcbiAqIEBwYXJhbSBwcm9wIC0gTmFtZSBvZiBwcm9wZXJ0eSB0byBjb3B5IGZyb20gYiB0byBhLlxyXG4gKiBAcGFyYW0gYWxsb3dEZWxldGlvbiAtIElmIHRydWUsIGRlbGV0ZSBwcm9wZXJ0eSBpbiBhIGlmIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaW4gYi5cclxuICovXHJcbmZ1bmN0aW9uIGNvcHlPckRlbGV0ZShhLCBiLCBwcm9wLCBhbGxvd0RlbGV0aW9uKSB7XHJcbiAgICBsZXQgZG9EZWxldGlvbiA9IGZhbHNlO1xyXG4gICAgaWYgKGFsbG93RGVsZXRpb24gPT09IHRydWUpIHtcclxuICAgICAgICBkb0RlbGV0aW9uID0gYltwcm9wXSA9PT0gbnVsbCAmJiBhW3Byb3BdICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgICBpZiAoZG9EZWxldGlvbikge1xyXG4gICAgICAgIGRlbGV0ZSBhW3Byb3BdO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgYVtwcm9wXSA9IGJbcHJvcF07IC8vIFJlbWVtYmVyLCB0aGlzIGlzIGEgcmVmZXJlbmNlIGNvcHkhXHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIEZpbGwgYW4gb2JqZWN0IHdpdGggYSBwb3NzaWJseSBwYXJ0aWFsbHkgZGVmaW5lZCBvdGhlciBvYmplY3QuXHJcbiAqXHJcbiAqIE9ubHkgY29waWVzIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgYWxyZWFkeSBwcmVzZW50IGluIGEuXHJcbiAqIFRoYXQgbWVhbnMgYW4gb2JqZWN0IGlzIG5vdCBjcmVhdGVkIG9uIGEgcHJvcGVydHkgaWYgb25seSB0aGUgYiBvYmplY3QgaGFzIGl0LlxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIFRoZSBvYmplY3QgdGhhdCB3aWxsIGhhdmUgaXQncyBwcm9wZXJ0aWVzIHVwZGF0ZWQuXHJcbiAqIEBwYXJhbSBiIC0gVGhlIG9iamVjdCB3aXRoIHByb3BlcnR5IHVwZGF0ZXMuXHJcbiAqIEBwYXJhbSBhbGxvd0RlbGV0aW9uIC0gSWYgdHJ1ZSwgZGVsZXRlIHByb3BlcnRpZXMgaW4gYSB0aGF0IGFyZSBleHBsaWNpdGx5IHNldCB0byBudWxsIGluIGIuXHJcbiAqL1xyXG5mdW5jdGlvbiBmaWxsSWZEZWZpbmVkKGEsIGIsIGFsbG93RGVsZXRpb24gPSBmYWxzZSkge1xyXG4gICAgLy8gTk9URTogaXRlcmF0aW9uIG9mIHByb3BlcnRpZXMgb2YgYVxyXG4gICAgLy8gTk9URTogcHJvdG90eXBlIHByb3BlcnRpZXMgaXRlcmF0ZWQgb3ZlciBhcyB3ZWxsXHJcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYSkge1xyXG4gICAgICAgIGlmIChiW3Byb3BdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKGJbcHJvcF0gPT09IG51bGwgfHwgdHlwZW9mIGJbcHJvcF0gIT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IHR5cGVvZiBudWxsID09PSAnb2JqZWN0J1xyXG4gICAgICAgICAgICAgICAgY29weU9yRGVsZXRlKGEsIGIsIHByb3AsIGFsbG93RGVsZXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYVByb3AgPSBhW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYlByb3AgPSBiW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGFQcm9wKSAmJiBpc09iamVjdChiUHJvcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWxsSWZEZWZpbmVkKGFQcm9wLCBiUHJvcCwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENvcHkgdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyB0byBhXHJcbiAqIHRhcmdldCBvYmplY3QuIFJldHVybnMgdGhlIHRhcmdldCBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IG9iamVjdCB0byBjb3B5IHRvLlxyXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHByb3BlcnRpZXMuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSB0YXJnZXQgb2JqZWN0LlxyXG4gKi9cclxuY29uc3QgZXh0ZW5kID0gT2JqZWN0LmFzc2lnbjtcclxuLyoqXHJcbiAqIEV4dGVuZCBvYmplY3QgYSB3aXRoIHNlbGVjdGVkIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIgb3IgYSBzZXJpZXMgb2Ygb2JqZWN0cy5cclxuICpcclxuICogQHJlbWFya3NcclxuICogT25seSBwcm9wZXJ0aWVzIHdpdGggZGVmaW5lZCB2YWx1ZXMgYXJlIGNvcGllZC5cclxuICpcclxuICogQHBhcmFtIHByb3BzIC0gUHJvcGVydGllcyB0byBiZSBjb3BpZWQgdG8gYS5cclxuICogQHBhcmFtIGEgLSBUaGUgdGFyZ2V0LlxyXG4gKiBAcGFyYW0gb3RoZXJzIC0gVGhlIHNvdXJjZXMuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEFyZ3VtZW50IGEuXHJcbiAqL1xyXG5mdW5jdGlvbiBzZWxlY3RpdmVFeHRlbmQocHJvcHMsIGEsIC4uLm90aGVycykge1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BzKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkFycmF5IHdpdGggcHJvcGVydHkgbmFtZXMgZXhwZWN0ZWQgYXMgZmlyc3QgYXJndW1lbnRcIik7XHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IG90aGVyIG9mIG90aGVycykge1xyXG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcCA9IHByb3BzW3BdO1xyXG4gICAgICAgICAgICBpZiAob3RoZXIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCBwcm9wKSkge1xyXG4gICAgICAgICAgICAgICAgYVtwcm9wXSA9IG90aGVyW3Byb3BdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuLyoqXHJcbiAqIEV4dGVuZCBvYmplY3QgYSB3aXRoIHNlbGVjdGVkIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXHJcbiAqIE9ubHkgcHJvcGVydGllcyB3aXRoIGRlZmluZWQgdmFsdWVzIGFyZSBjb3BpZWQuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyByb3V0aW5lIGltcGxpZWQgdGhhdCBtdWx0aXBsZSBzb3VyY2Ugb2JqZWN0cyBjb3VsZFxyXG4gKiBiZSB1c2VkOyBob3dldmVyLCB0aGUgaW1wbGVtZW50YXRpb24gd2FzICoqd3JvbmcqKi4gU2luY2UgbXVsdGlwbGUgKFxcPjEpXHJcbiAqIHNvdXJjZXMgd2VyZW4ndCB1c2VkIGFueXdoZXJlIGluIHRoZSBgdmlzLmpzYCBjb2RlLCB0aGlzIGhhcyBiZWVuIHJlbW92ZWRcclxuICpcclxuICogQHBhcmFtIHByb3BzIC0gTmFtZXMgb2YgZmlyc3QtbGV2ZWwgcHJvcGVydGllcyB0byBjb3B5IG92ZXIuXHJcbiAqIEBwYXJhbSBhIC0gVGFyZ2V0IG9iamVjdC5cclxuICogQHBhcmFtIGIgLSBTb3VyY2Ugb2JqZWN0LlxyXG4gKiBAcGFyYW0gYWxsb3dEZWxldGlvbiAtIElmIHRydWUsIGRlbGV0ZSBwcm9wZXJ0eSBpbiBhIGlmIGV4cGxpY2l0bHkgc2V0IHRvIG51bGwgaW4gYi5cclxuICpcclxuICogQHJldHVybnMgQXJndW1lbnQgYS5cclxuICovXHJcbmZ1bmN0aW9uIHNlbGVjdGl2ZURlZXBFeHRlbmQocHJvcHMsIGEsIGIsIGFsbG93RGVsZXRpb24gPSBmYWxzZSkge1xyXG4gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIEFycmF5cyB0byBkZWVwRXh0ZW5kXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGVlcEV4dGVuZFwiKTtcclxuICAgIH1cclxuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcHJvcHMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICBjb25zdCBwcm9wID0gcHJvcHNbcF07XHJcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwcm9wKSkge1xyXG4gICAgICAgICAgICBpZiAoYltwcm9wXSAmJiBiW3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhW3Byb3BdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhW3Byb3BdID0ge307XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoYVtwcm9wXS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVlcEV4dGVuZChhW3Byb3BdLCBiW3Byb3BdLCBmYWxzZSwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5T3JEZWxldGUoYSwgYiwgcHJvcCwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiW3Byb3BdKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29weU9yRGVsZXRlKGEsIGIsIHByb3AsIGFsbG93RGVsZXRpb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuLyoqXHJcbiAqIEV4dGVuZCBvYmplY3QgYGFgIHdpdGggcHJvcGVydGllcyBvZiBvYmplY3QgYGJgLCBpZ25vcmluZyBwcm9wZXJ0aWVzIHdoaWNoXHJcbiAqIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZCB0byBiZSBleGNsdWRlZC5cclxuICpcclxuICogQHJlbWFya3NcclxuICogVGhlIHByb3BlcnRpZXMgb2YgYGJgIGFyZSBjb25zaWRlcmVkIGZvciBjb3B5aW5nLiBQcm9wZXJ0aWVzIHdoaWNoIGFyZVxyXG4gKiB0aGVtc2VsdmVzIG9iamVjdHMgYXJlIGFyZSBhbHNvIGV4dGVuZGVkLiBPbmx5IHByb3BlcnRpZXMgd2l0aCBkZWZpbmVkXHJcbiAqIHZhbHVlcyBhcmUgY29waWVkLlxyXG4gKlxyXG4gKiBAcGFyYW0gcHJvcHNUb0V4Y2x1ZGUgLSBOYW1lcyBvZiBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCAqbm90KiBiZSBjb3BpZWQuXHJcbiAqIEBwYXJhbSBhIC0gT2JqZWN0IHRvIGV4dGVuZC5cclxuICogQHBhcmFtIGIgLSBPYmplY3QgdG8gdGFrZSBwcm9wZXJ0aWVzIGZyb20gZm9yIGV4dGVuc2lvbi5cclxuICogQHBhcmFtIGFsbG93RGVsZXRpb24gLSBJZiB0cnVlLCBkZWxldGUgcHJvcGVydGllcyBpbiBhIHRoYXQgYXJlIGV4cGxpY2l0bHlcclxuICogc2V0IHRvIG51bGwgaW4gYi5cclxuICpcclxuICogQHJldHVybnMgQXJndW1lbnQgYS5cclxuICovXHJcbmZ1bmN0aW9uIHNlbGVjdGl2ZU5vdERlZXBFeHRlbmQocHJvcHNUb0V4Y2x1ZGUsIGEsIGIsIGFsbG93RGVsZXRpb24gPSBmYWxzZSkge1xyXG4gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIEFycmF5cyB0byBkZWVwRXh0ZW5kXHJcbiAgICAvLyBOT1RFOiBhcnJheSBwcm9wZXJ0aWVzIGhhdmUgYW4gZWxzZS1iZWxvdzsgYXBwYXJlbnRseSwgdGhlcmUgaXMgYSBwcm9ibGVtIGhlcmUuXHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShiKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGVlcEV4dGVuZFwiKTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgcHJvcCBpbiBiKSB7XHJcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcHJvcCkpIHtcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfSAvLyBIYW5kbGUgbG9jYWwgcHJvcGVydGllcyBvbmx5XHJcbiAgICAgICAgaWYgKHByb3BzVG9FeGNsdWRlLmluY2x1ZGVzKHByb3ApKSB7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH0gLy8gSW4gZXhjbHVzaW9uIGxpc3QsIHNraXBcclxuICAgICAgICBpZiAoYltwcm9wXSAmJiBiW3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgICAgICAgICAgaWYgKGFbcHJvcF0gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgYVtwcm9wXSA9IHt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhW3Byb3BdLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIGRlZXBFeHRlbmQoYVtwcm9wXSwgYltwcm9wXSk7IC8vIE5PVEU6IGFsbG93RGVsZXRpb24gbm90IHByb3BhZ2F0ZWQhXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb3B5T3JEZWxldGUoYSwgYiwgcHJvcCwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiW3Byb3BdKSkge1xyXG4gICAgICAgICAgICBhW3Byb3BdID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYltwcm9wXS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgYVtwcm9wXS5wdXNoKGJbcHJvcF1baV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb3B5T3JEZWxldGUoYSwgYiwgcHJvcCwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGE7XHJcbn1cclxuLyoqXHJcbiAqIERlZXAgZXh0ZW5kIGFuIG9iamVjdCBhIHdpdGggdGhlIHByb3BlcnRpZXMgb2Ygb2JqZWN0IGIuXHJcbiAqXHJcbiAqIEBwYXJhbSBhIC0gVGFyZ2V0IG9iamVjdC5cclxuICogQHBhcmFtIGIgLSBTb3VyY2Ugb2JqZWN0LlxyXG4gKiBAcGFyYW0gcHJvdG9FeHRlbmQgLSBJZiB0cnVlLCB0aGUgcHJvdG90eXBlIHZhbHVlcyB3aWxsIGFsc28gYmUgZXh0ZW5kZWQuXHJcbiAqIChUaGF0IGlzIHRoZSBvcHRpb25zIG9iamVjdHMgdGhhdCBpbmhlcml0IGZyb20gb3RoZXJzIHdpbGwgYWxzbyBnZXQgdGhlXHJcbiAqIGluaGVyaXRlZCBvcHRpb25zKS5cclxuICogQHBhcmFtIGFsbG93RGVsZXRpb24gLSBJZiB0cnVlLCB0aGUgdmFsdWVzIG9mIGZpZWxkcyB0aGF0IGFyZSBudWxsIHdpbGwgYmUgZGVsZXRlZC5cclxuICpcclxuICogQHJldHVybnMgQXJndW1lbnQgYS5cclxuICovXHJcbmZ1bmN0aW9uIGRlZXBFeHRlbmQoYSwgYiwgcHJvdG9FeHRlbmQgPSBmYWxzZSwgYWxsb3dEZWxldGlvbiA9IGZhbHNlKSB7XHJcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gYikge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcHJvcCkgfHwgcHJvdG9FeHRlbmQgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiW3Byb3BdID09PSBcIm9iamVjdFwiICYmXHJcbiAgICAgICAgICAgICAgICBiW3Byb3BdICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYltwcm9wXSkgPT09IE9iamVjdC5wcm90b3R5cGUpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhW3Byb3BdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhW3Byb3BdID0gZGVlcEV4dGVuZCh7fSwgYltwcm9wXSwgcHJvdG9FeHRlbmQpOyAvLyBOT1RFOiBhbGxvd0RlbGV0aW9uIG5vdCBwcm9wYWdhdGVkIVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGFbcHJvcF0gPT09IFwib2JqZWN0XCIgJiZcclxuICAgICAgICAgICAgICAgICAgICBhW3Byb3BdICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGFbcHJvcF0pID09PSBPYmplY3QucHJvdG90eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVlcEV4dGVuZChhW3Byb3BdLCBiW3Byb3BdLCBwcm90b0V4dGVuZCk7IC8vIE5PVEU6IGFsbG93RGVsZXRpb24gbm90IHByb3BhZ2F0ZWQhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb3B5T3JEZWxldGUoYSwgYiwgcHJvcCwgYWxsb3dEZWxldGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiW3Byb3BdKSkge1xyXG4gICAgICAgICAgICAgICAgYVtwcm9wXSA9IGJbcHJvcF0uc2xpY2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvcHlPckRlbGV0ZShhLCBiLCBwcm9wLCBhbGxvd0RlbGV0aW9uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhO1xyXG59XHJcbi8qKlxyXG4gKiBUZXN0IHdoZXRoZXIgYWxsIGVsZW1lbnRzIGluIHR3byBhcnJheXMgYXJlIGVxdWFsLlxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIEZpcnN0IGFycmF5LlxyXG4gKiBAcGFyYW0gYiAtIFNlY29uZCBhcnJheS5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBib3RoIGFycmF5cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhbmQgc2FtZSBlbGVtZW50cyAoMSA9ICcxJykuXHJcbiAqL1xyXG5mdW5jdGlvbiBlcXVhbEFycmF5KGEsIGIpIHtcclxuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgIGlmIChhW2ldICE9IGJbaV0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG59XHJcbi8qKlxyXG4gKiBHZXQgdGhlIHR5cGUgb2YgYW4gb2JqZWN0LCBmb3IgZXhhbXBsZSBleHBvcnRzLmdldFR5cGUoW10pIHJldHVybnMgJ0FycmF5Jy5cclxuICpcclxuICogQHBhcmFtIG9iamVjdCAtIElucHV0IHZhbHVlIG9mIHVua25vd24gdHlwZS5cclxuICpcclxuICogQHJldHVybnMgRGV0ZWN0ZWQgdHlwZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldFR5cGUob2JqZWN0KSB7XHJcbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIG9iamVjdDtcclxuICAgIGlmICh0eXBlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgaWYgKG9iamVjdCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCb29sZWFuKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBcIkJvb2xlYW5cIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJOdW1iZXJcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJTdHJpbmdcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJBcnJheVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gXCJEYXRlXCI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBcIk9iamVjdFwiO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgICByZXR1cm4gXCJOdW1iZXJcIjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlID09PSBcImJvb2xlYW5cIikge1xyXG4gICAgICAgIHJldHVybiBcIkJvb2xlYW5cIjtcclxuICAgIH1cclxuICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiU3RyaW5nXCI7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHlwZTtcclxufVxyXG4vKipcclxuICogVXNlZCB0byBleHRlbmQgYW4gYXJyYXkgYW5kIGNvcHkgaXQuIFRoaXMgaXMgdXNlZCB0byBwcm9wYWdhdGUgcGF0aHMgcmVjdXJzaXZlbHkuXHJcbiAqXHJcbiAqIEBwYXJhbSBhcnIgLSBGaXJzdCBwYXJ0LlxyXG4gKiBAcGFyYW0gbmV3VmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgYWFkZGVkIGludG8gdGhlIGFycmF5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBIG5ldyBhcnJheSB3aXRoIGFsbCBpdGVtcyBmcm9tIGFyciBhbmQgbmV3VmFsdWUgKHdoaWNoIGlzIGxhc3QpLlxyXG4gKi9cclxuZnVuY3Rpb24gY29weUFuZEV4dGVuZEFycmF5KGFyciwgbmV3VmFsdWUpIHtcclxuICAgIHJldHVybiBbLi4uYXJyLCBuZXdWYWx1ZV07XHJcbn1cclxuLyoqXHJcbiAqIFVzZWQgdG8gZXh0ZW5kIGFuIGFycmF5IGFuZCBjb3B5IGl0LiBUaGlzIGlzIHVzZWQgdG8gcHJvcGFnYXRlIHBhdGhzIHJlY3Vyc2l2ZWx5LlxyXG4gKlxyXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIGJlIGNvcGllZC5cclxuICpcclxuICogQHJldHVybnMgU2hhbGxvdyBjb3B5IG9mIGFyci5cclxuICovXHJcbmZ1bmN0aW9uIGNvcHlBcnJheShhcnIpIHtcclxuICAgIHJldHVybiBhcnIuc2xpY2UoKTtcclxufVxyXG4vKipcclxuICogUmV0cmlldmUgdGhlIGFic29sdXRlIGxlZnQgdmFsdWUgb2YgYSBET00gZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIGVsZW0gLSBBIGRvbSBlbGVtZW50LCBmb3IgZXhhbXBsZSBhIGRpdi5cclxuICpcclxuICogQHJldHVybnMgVGhlIGFic29sdXRlIGxlZnQgcG9zaXRpb24gb2YgdGhpcyBlbGVtZW50IGluIHRoZSBicm93c2VyIHBhZ2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRBYnNvbHV0ZUxlZnQoZWxlbSkge1xyXG4gICAgcmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcclxufVxyXG4vKipcclxuICogUmV0cmlldmUgdGhlIGFic29sdXRlIHJpZ2h0IHZhbHVlIG9mIGEgRE9NIGVsZW1lbnQuXHJcbiAqXHJcbiAqIEBwYXJhbSBlbGVtIC0gQSBkb20gZWxlbWVudCwgZm9yIGV4YW1wbGUgYSBkaXYuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSByaWdodCBwb3NpdGlvbiBvZiB0aGlzIGVsZW1lbnQgaW4gdGhlIGJyb3dzZXIgcGFnZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldEFic29sdXRlUmlnaHQoZWxlbSkge1xyXG4gICAgcmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7XHJcbn1cclxuLyoqXHJcbiAqIFJldHJpZXZlIHRoZSBhYnNvbHV0ZSB0b3AgdmFsdWUgb2YgYSBET00gZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIGVsZW0gLSBBIGRvbSBlbGVtZW50LCBmb3IgZXhhbXBsZSBhIGRpdi5cclxuICpcclxuICogQHJldHVybnMgVGhlIGFic29sdXRlIHRvcCBwb3NpdGlvbiBvZiB0aGlzIGVsZW1lbnQgaW4gdGhlIGJyb3dzZXIgcGFnZS5cclxuICovXHJcbmZ1bmN0aW9uIGdldEFic29sdXRlVG9wKGVsZW0pIHtcclxuICAgIHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcclxufVxyXG4vKipcclxuICogQWRkIGEgY2xhc3NOYW1lIHRvIHRoZSBnaXZlbiBlbGVtZW50cyBzdHlsZS5cclxuICpcclxuICogQHBhcmFtIGVsZW0gLSBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgY2xhc3NlcyB3aWxsIGJlIGFkZGVkLlxyXG4gKiBAcGFyYW0gY2xhc3NOYW1lcyAtIFNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMuXHJcbiAqL1xyXG5mdW5jdGlvbiBhZGRDbGFzc05hbWUoZWxlbSwgY2xhc3NOYW1lcykge1xyXG4gICAgbGV0IGNsYXNzZXMgPSBlbGVtLmNsYXNzTmFtZS5zcGxpdChcIiBcIik7XHJcbiAgICBjb25zdCBuZXdDbGFzc2VzID0gY2xhc3NOYW1lcy5zcGxpdChcIiBcIik7XHJcbiAgICBjbGFzc2VzID0gY2xhc3Nlcy5jb25jYXQobmV3Q2xhc3Nlcy5maWx0ZXIoZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhY2xhc3Nlcy5pbmNsdWRlcyhjbGFzc05hbWUpO1xyXG4gICAgfSkpO1xyXG4gICAgZWxlbS5jbGFzc05hbWUgPSBjbGFzc2VzLmpvaW4oXCIgXCIpO1xyXG59XHJcbi8qKlxyXG4gKiBSZW1vdmUgYSBjbGFzc05hbWUgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudHMgc3R5bGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBlbGVtIC0gVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgY2xhc3NlcyB3aWxsIGJlIHJlbW92ZWQuXHJcbiAqIEBwYXJhbSBjbGFzc05hbWVzIC0gU3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgY2xhc3Nlcy5cclxuICovXHJcbmZ1bmN0aW9uIHJlbW92ZUNsYXNzTmFtZShlbGVtLCBjbGFzc05hbWVzKSB7XHJcbiAgICBsZXQgY2xhc3NlcyA9IGVsZW0uY2xhc3NOYW1lLnNwbGl0KFwiIFwiKTtcclxuICAgIGNvbnN0IG9sZENsYXNzZXMgPSBjbGFzc05hbWVzLnNwbGl0KFwiIFwiKTtcclxuICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZpbHRlcihmdW5jdGlvbiAoY2xhc3NOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICFvbGRDbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSk7XHJcbiAgICB9KTtcclxuICAgIGVsZW0uY2xhc3NOYW1lID0gY2xhc3Nlcy5qb2luKFwiIFwiKTtcclxufVxyXG4vKipcclxuICogRm9yIGVhY2ggbWV0aG9kIGZvciBib3RoIGFycmF5cyBhbmQgb2JqZWN0cy5cclxuICogSW4gY2FzZSBvZiBhbiBhcnJheSwgdGhlIGJ1aWx0LWluIEFycmF5LmZvckVhY2goKSBpcyBhcHBsaWVkICgqKk5vLCBpdCdzIG5vdCEqKikuXHJcbiAqIEluIGNhc2Ugb2YgYW4gT2JqZWN0LCB0aGUgbWV0aG9kIGxvb3BzIG92ZXIgYWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cclxuICpcclxuICogQHBhcmFtIG9iamVjdCAtIEFuIE9iamVjdCBvciBBcnJheSB0byBiZSBpdGVyYXRlZCBvdmVyLlxyXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBBcnJheS5mb3JFYWNoLWxpa2UgY2FsbGJhY2suXHJcbiAqL1xyXG5mdW5jdGlvbiBmb3JFYWNoKG9iamVjdCwgY2FsbGJhY2spIHtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcclxuICAgICAgICAvLyBhcnJheVxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9iamVjdC5sZW5ndGg7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjYWxsYmFjayhvYmplY3RbaV0sIGksIG9iamVjdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gb2JqZWN0XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhvYmplY3Rba2V5XSwga2V5LCBvYmplY3QpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGFuIGFycmF5OiBhbGwgb2JqZWN0cyBwcm9wZXJ0aWVzIGFyZSBwdXQgaW50byB0aGUgYXJyYXkuIFRoZSByZXN1bHRpbmcgYXJyYXkgaXMgdW5vcmRlcmVkLlxyXG4gKlxyXG4gKiBAcGFyYW0gbyAtIE9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiB1bm9yZGVyZWQgdmFsdWVzLlxyXG4gKi9cclxuY29uc3QgdG9BcnJheSA9IE9iamVjdC52YWx1ZXM7XHJcbi8qKlxyXG4gKiBVcGRhdGUgYSBwcm9wZXJ0eSBpbiBhbiBvYmplY3QuXHJcbiAqXHJcbiAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHdob3NlIHByb3BlcnR5IHdpbGwgYmUgdXBkYXRlZC5cclxuICogQHBhcmFtIGtleSAtIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHVwZGF0ZWQuXHJcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBuZXcgdmFsdWUgdG8gYmUgYXNzaWduZWQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIHdhcyB1cGRhdGVkICh0cnVlKSBvciBhbHJlYWR5IHN0cmljdGx5IHRoZSBzYW1lIGluIHRoZSBvcmlnaW5hbCBvYmplY3QgKGZhbHNlKS5cclxuICovXHJcbmZ1bmN0aW9uIHVwZGF0ZVByb3BlcnR5KG9iamVjdCwga2V5LCB2YWx1ZSkge1xyXG4gICAgaWYgKG9iamVjdFtrZXldICE9PSB2YWx1ZSkge1xyXG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIFRocm90dGxlIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBiZSBvbmx5IGV4ZWN1dGVkIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZS5cclxuICpcclxuICogQHBhcmFtIGZuIC0gVGhlIG9yaWdpbmFsIGZ1bmN0aW9uLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uLlxyXG4gKi9cclxuZnVuY3Rpb24gdGhyb3R0bGUoZm4pIHtcclxuICAgIGxldCBzY2hlZHVsZWQgPSBmYWxzZTtcclxuICAgIHJldHVybiAoKSA9PiB7XHJcbiAgICAgICAgaWYgKCFzY2hlZHVsZWQpIHtcclxuICAgICAgICAgICAgc2NoZWR1bGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgZm4oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG4vKipcclxuICogQWRkIGFuZCBldmVudCBsaXN0ZW5lci4gV29ya3MgZm9yIGFsbCBicm93c2Vycy5cclxuICpcclxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBiaW5kIHRoZSBldmVudCBsaXN0ZW5lciB0by5cclxuICogQHBhcmFtIGFjdGlvbiAtIFNhbWUgYXMgRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGFjdGlvbiwg4oCULCDigJQpLlxyXG4gKiBAcGFyYW0gbGlzdGVuZXIgLSBTYW1lIGFzIEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcijigJQsIGxpc3RlbmVyLCDigJQpLlxyXG4gKiBAcGFyYW0gdXNlQ2FwdHVyZSAtIFNhbWUgYXMgRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKOKAlCwg4oCULCB1c2VDYXB0dXJlKS5cclxuICovXHJcbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgYWN0aW9uLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkge1xyXG4gICAgaWYgKGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh1c2VDYXB0dXJlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdXNlQ2FwdHVyZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWN0aW9uID09PSBcIm1vdXNld2hlZWxcIiAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKFwiRmlyZWZveFwiKSkge1xyXG4gICAgICAgICAgICBhY3Rpb24gPSBcIkRPTU1vdXNlU2Nyb2xsXCI7IC8vIEZvciBGaXJlZm94XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihhY3Rpb24sIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEBUT0RPOiBJRSB0eXBlcz8gRG9lcyBhbnlvbmUgY2FyZT9cclxuICAgICAgICBlbGVtZW50LmF0dGFjaEV2ZW50KFwib25cIiArIGFjdGlvbiwgbGlzdGVuZXIpOyAvLyBJRSBicm93c2Vyc1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJpbmQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvLlxyXG4gKiBAcGFyYW0gYWN0aW9uIC0gU2FtZSBhcyBFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoYWN0aW9uLCDigJQsIOKAlCkuXHJcbiAqIEBwYXJhbSBsaXN0ZW5lciAtIFNhbWUgYXMgRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKOKAlCwgbGlzdGVuZXIsIOKAlCkuXHJcbiAqIEBwYXJhbSB1c2VDYXB0dXJlIC0gU2FtZSBhcyBFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIo4oCULCDigJQsIHVzZUNhcHR1cmUpLlxyXG4gKi9cclxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBhY3Rpb24sIGxpc3RlbmVyLCB1c2VDYXB0dXJlKSB7XHJcbiAgICBpZiAoZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKSB7XHJcbiAgICAgICAgLy8gbm9uLUlFIGJyb3dzZXJzXHJcbiAgICAgICAgaWYgKHVzZUNhcHR1cmUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB1c2VDYXB0dXJlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhY3Rpb24gPT09IFwibW91c2V3aGVlbFwiICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5jbHVkZXMoXCJGaXJlZm94XCIpKSB7XHJcbiAgICAgICAgICAgIGFjdGlvbiA9IFwiRE9NTW91c2VTY3JvbGxcIjsgLy8gRm9yIEZpcmVmb3hcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGFjdGlvbiwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gQFRPRE86IElFIHR5cGVzPyBEb2VzIGFueW9uZSBjYXJlP1xyXG4gICAgICAgIGVsZW1lbnQuZGV0YWNoRXZlbnQoXCJvblwiICsgYWN0aW9uLCBsaXN0ZW5lcik7IC8vIElFIGJyb3dzZXJzXHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENhbmNlbHMgdGhlIGV2ZW50J3MgZGVmYXVsdCBhY3Rpb24gaWYgaXQgaXMgY2FuY2VsYWJsZSwgd2l0aG91dCBzdG9wcGluZyBmdXJ0aGVyIHByb3BhZ2F0aW9uIG9mIHRoZSBldmVudC5cclxuICpcclxuICogQHBhcmFtIGV2ZW50IC0gVGhlIGV2ZW50IHdob3NlIGRlZmF1bHQgYWN0aW9uIHNob3VsZCBiZSBwcmV2ZW50ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBwcmV2ZW50RGVmYXVsdChldmVudCkge1xyXG4gICAgaWYgKCFldmVudCkge1xyXG4gICAgICAgIGV2ZW50ID0gd2luZG93LmV2ZW50O1xyXG4gICAgfVxyXG4gICAgaWYgKCFldmVudCkgO1xyXG4gICAgZWxzZSBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBub24tSUUgYnJvd3NlcnNcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIC8vIEBUT0RPOiBJRSB0eXBlcz8gRG9lcyBhbnlvbmUgY2FyZT9cclxuICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOyAvLyBJRSBicm93c2Vyc1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBHZXQgSFRNTCBlbGVtZW50IHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50LlxyXG4gKlxyXG4gKiBAcGFyYW0gZXZlbnQgLSBUaGUgZXZlbnQuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBlbGVtZW50IG9yIG51bGwgaWYgbm90IG9idGFpbmFibGUuXHJcbiAqL1xyXG5mdW5jdGlvbiBnZXRUYXJnZXQoZXZlbnQgPSB3aW5kb3cuZXZlbnQpIHtcclxuICAgIC8vIGNvZGUgZnJvbSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2pzL2V2ZW50c19wcm9wZXJ0aWVzLmh0bWxcclxuICAgIC8vIEBUT0RPOiBFdmVudFRhcmdldCBjYW4gYmUgYWxtb3N0IGFueXRoaW5nLCBpcyBpdCBva2F5IHRvIHJldHVybiBvbmx5IEVsZW1lbnRzP1xyXG4gICAgbGV0IHRhcmdldCA9IG51bGw7XHJcbiAgICBpZiAoIWV2ZW50KSA7XHJcbiAgICBlbHNlIGlmIChldmVudC50YXJnZXQpIHtcclxuICAgICAgICB0YXJnZXQgPSBldmVudC50YXJnZXQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChldmVudC5zcmNFbGVtZW50KSB7XHJcbiAgICAgICAgdGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudDtcclxuICAgIH1cclxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0Lm5vZGVUeXBlICE9IG51bGwgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDMpIHtcclxuICAgICAgICAvLyBkZWZlYXQgU2FmYXJpIGJ1Z1xyXG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xyXG4gICAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0YXJnZXQ7XHJcbn1cclxuLyoqXHJcbiAqIENoZWNrIGlmIGdpdmVuIGVsZW1lbnQgY29udGFpbnMgZ2l2ZW4gcGFyZW50IHNvbWV3aGVyZSBpbiB0aGUgRE9NIHRyZWUuXHJcbiAqXHJcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gYmUgdGVzdGVkLlxyXG4gKiBAcGFyYW0gcGFyZW50IC0gVGhlIGFuY2VzdG9yIChub3QgbmVjZXNzYXJpbHkgcGFyZW50KSBvZiB0aGUgZWxlbWVudC5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBwYXJlbnQgaXMgYW4gYW5jZXN0b3Igb2YgdGhlIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZS5cclxuICovXHJcbmZ1bmN0aW9uIGhhc1BhcmVudChlbGVtZW50LCBwYXJlbnQpIHtcclxuICAgIGxldCBlbGVtID0gZWxlbWVudDtcclxuICAgIHdoaWxlIChlbGVtKSB7XHJcbiAgICAgICAgaWYgKGVsZW0gPT09IHBhcmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoZWxlbS5wYXJlbnROb2RlKSB7XHJcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudE5vZGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG59XHJcbmNvbnN0IG9wdGlvbiA9IHtcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCBhIHZhbHVlIGludG8gYSBib29sZWFuLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvYm9vbGVhbiwgYSBmdW5jdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGAoKCkgPT4gdW5rbm93bilgLlxyXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIElmIHRoZSB2YWx1ZSBvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiA9PSBudWxsIHRoZW4gdGhpcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIENvcnJlc3BvbmRpbmcgYm9vbGVhbiB2YWx1ZSwgaWYgbm9uZSB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiBub25lIHRoZW4gbnVsbC5cclxuICAgICAqL1xyXG4gICAgYXNCb29sZWFuKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSB8fCBudWxsO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQ29udmVydCBhIHZhbHVlIGludG8gYSBudW1iZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gYmUgY29udmVydGVkIGludG9udW1iZXIsIGEgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCBhcyBgKCgpID0+IHVua25vd24pYC5cclxuICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBJZiB0aGUgdmFsdWUgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gPT0gbnVsbCB0aGVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBDb3JyZXNwb25kaW5nICoqYm94ZWQqKiBudW1iZXIgdmFsdWUsIGlmIG5vbmUgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgbm9uZSB0aGVuIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGFzTnVtYmVyKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpIHx8IGRlZmF1bHRWYWx1ZSB8fCBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8IG51bGw7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgdmFsdWUgaW50byBhIHN0cmluZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50b3N0cmluZywgYSBmdW5jdGlvbiB3aWxsIGJlIGV4ZWN1dGVkIGFzIGAoKCkgPT4gdW5rbm93bilgLlxyXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAtIElmIHRoZSB2YWx1ZSBvciB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiA9PSBudWxsIHRoZW4gdGhpcyB3aWxsIGJlIHJldHVybmVkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIENvcnJlc3BvbmRpbmcgKipib3hlZCoqIHN0cmluZyB2YWx1ZSwgaWYgbm9uZSB0aGVuIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiBub25lIHRoZW4gbnVsbC5cclxuICAgICAqL1xyXG4gICAgYXNTdHJpbmcodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgbnVsbDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIENvbnZlcnQgYSB2YWx1ZSBpbnRvIGEgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50b3NpemUsIGEgZnVuY3Rpb24gd2lsbCBiZSBleGVjdXRlZCBhcyBgKCgpID0+IHVua25vd24pYC5cclxuICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgLSBJZiB0aGUgdmFsdWUgb3IgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gPT0gbnVsbCB0aGVuIHRoaXMgd2lsbCBiZSByZXR1cm5lZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBDb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSAobnVtYmVyICsgJ3B4JyksIGlmIG5vbmUgdGhlbiB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgbm9uZSB0aGVuIG51bGwuXHJcbiAgICAgKi9cclxuICAgIGFzU2l6ZSh2YWx1ZSwgZGVmYXVsdFZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaXNOdW1iZXIodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSArIFwicHhcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUgfHwgbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBDb252ZXJ0IGEgdmFsdWUgaW50byBhIERPTSBFbGVtZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGJlIGNvbnZlcnRlZCBpbnRvIERPTSBFbGVtZW50LCBhIGZ1bmN0aW9uIHdpbGwgYmUgZXhlY3V0ZWQgYXMgYCgoKSA9PiB1bmtub3duKWAuXHJcbiAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIC0gSWYgdGhlIHZhbHVlIG9yIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uID09IG51bGwgdGhlbiB0aGlzIHdpbGwgYmUgcmV0dXJuZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIERPTSBFbGVtZW50LCBpZiBub25lIHRoZW4gdGhlIGRlZmF1bHQgdmFsdWUsIGlmIG5vbmUgdGhlbiBudWxsLlxyXG4gICAgICovXHJcbiAgICBhc0VsZW1lbnQodmFsdWUsIGRlZmF1bHRWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IGRlZmF1bHRWYWx1ZSB8fCBudWxsO1xyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqIENvbnZlcnQgaGV4IGNvbG9yIHN0cmluZyBpbnRvIFJHQiBjb2xvciBvYmplY3QuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIHtAbGluayBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzU2MjM4MzgvcmdiLXRvLWhleC1hbmQtaGV4LXRvLXJnYn1cclxuICpcclxuICogQHBhcmFtIGhleCAtIEhleCBjb2xvciBzdHJpbmcgKDMgb3IgNiBkaWdpdHMsIHdpdGggb3Igd2l0aG91dCAjKS5cclxuICpcclxuICogQHJldHVybnMgUkdCIGNvbG9yIG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGhleFRvUkdCKGhleCkge1xyXG4gICAgbGV0IHJlc3VsdDtcclxuICAgIHN3aXRjaCAoaGV4Lmxlbmd0aCkge1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICBjYXNlIDQ6XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHNob3J0SGV4UkUuZXhlYyhoZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgICAgICByOiBwYXJzZUludChyZXN1bHRbMV0gKyByZXN1bHRbMV0sIDE2KSxcclxuICAgICAgICAgICAgICAgICAgICBnOiBwYXJzZUludChyZXN1bHRbMl0gKyByZXN1bHRbMl0sIDE2KSxcclxuICAgICAgICAgICAgICAgICAgICBiOiBwYXJzZUludChyZXN1bHRbM10gKyByZXN1bHRbM10sIDE2KSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICBjYXNlIDY6XHJcbiAgICAgICAgY2FzZSA3OlxyXG4gICAgICAgICAgICByZXN1bHQgPSBmdWxsSGV4UkUuZXhlYyhoZXgpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgICAgICA/IHtcclxuICAgICAgICAgICAgICAgICAgICByOiBwYXJzZUludChyZXN1bHRbMV0sIDE2KSxcclxuICAgICAgICAgICAgICAgICAgICBnOiBwYXJzZUludChyZXN1bHRbMl0sIDE2KSxcclxuICAgICAgICAgICAgICAgICAgICBiOiBwYXJzZUludChyZXN1bHRbM10sIDE2KSxcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBzdHJpbmcgY29sb3IgaW4gaGV4IG9yIFJHQiBmb3JtYXQgYW5kIGFkZHMgdGhlIG9wYWNpdHksIFJHQkEgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLlxyXG4gKlxyXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3Igc3RyaW5nIChoZXgsIFJHQiwgUkdCQSkuXHJcbiAqIEBwYXJhbSBvcGFjaXR5IC0gVGhlIG5ldyBvcGFjaXR5LlxyXG4gKlxyXG4gKiBAcmV0dXJucyBSR0JBIHN0cmluZywgZm9yIGV4YW1wbGUgJ3JnYmEoMjU1LCAwLCAxMjcsIDAuMyknLlxyXG4gKi9cclxuZnVuY3Rpb24gb3ZlcnJpZGVPcGFjaXR5KGNvbG9yLCBvcGFjaXR5KSB7XHJcbiAgICBpZiAoY29sb3IuaW5jbHVkZXMoXCJyZ2JhXCIpKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY29sb3IuaW5jbHVkZXMoXCJyZ2JcIikpIHtcclxuICAgICAgICBjb25zdCByZ2IgPSBjb2xvclxyXG4gICAgICAgICAgICAuc3Vic3RyKGNvbG9yLmluZGV4T2YoXCIoXCIpICsgMSlcclxuICAgICAgICAgICAgLnJlcGxhY2UoXCIpXCIsIFwiXCIpXHJcbiAgICAgICAgICAgIC5zcGxpdChcIixcIik7XHJcbiAgICAgICAgcmV0dXJuIFwicmdiYShcIiArIHJnYlswXSArIFwiLFwiICsgcmdiWzFdICsgXCIsXCIgKyByZ2JbMl0gKyBcIixcIiArIG9wYWNpdHkgKyBcIilcIjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJnYiA9IGhleFRvUkdCKGNvbG9yKTtcclxuICAgICAgICBpZiAocmdiID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFwicmdiYShcIiArIHJnYi5yICsgXCIsXCIgKyByZ2IuZyArIFwiLFwiICsgcmdiLmIgKyBcIixcIiArIG9wYWNpdHkgKyBcIilcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlcnQgUkdCIFxcPDAsIDI1NVxcPiBpbnRvIGhleCBjb2xvciBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSByZWQgLSBSZWQgY2hhbm5lbC5cclxuICogQHBhcmFtIGdyZWVuIC0gR3JlZW4gY2hhbm5lbC5cclxuICogQHBhcmFtIGJsdWUgLSBCbHVlIGNoYW5uZWwuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEhleCBjb2xvciBzdHJpbmcgKGZvciBleGFtcGxlOiAnIzBhY2RjMCcpLlxyXG4gKi9cclxuZnVuY3Rpb24gUkdCVG9IZXgocmVkLCBncmVlbiwgYmx1ZSkge1xyXG4gICAgcmV0dXJuIChcIiNcIiArICgoMSA8PCAyNCkgKyAocmVkIDw8IDE2KSArIChncmVlbiA8PCA4KSArIGJsdWUpLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XHJcbn1cclxuLyoqXHJcbiAqIFBhcnNlIGEgY29sb3IgcHJvcGVydHkgaW50byBhbiBvYmplY3Qgd2l0aCBib3JkZXIsIGJhY2tncm91bmQsIGFuZCBoaWdobGlnaHQgY29sb3JzLlxyXG4gKlxyXG4gKiBAcGFyYW0gaW5wdXRDb2xvciAtIFNob3J0aGFuZCBjb2xvciBzdHJpbmcgb3IgaW5wdXQgY29sb3Igb2JqZWN0LlxyXG4gKiBAcGFyYW0gZGVmYXVsdENvbG9yIC0gRnVsbCBjb2xvciBvYmplY3QgdG8gZmlsbCBpbiBtaXNzaW5nIHZhbHVlcyBpbiBpbnB1dENvbG9yLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBDb2xvciBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBwYXJzZUNvbG9yKGlucHV0Q29sb3IsIGRlZmF1bHRDb2xvcikge1xyXG4gICAgaWYgKGlzU3RyaW5nKGlucHV0Q29sb3IpKSB7XHJcbiAgICAgICAgbGV0IGNvbG9yU3RyID0gaW5wdXRDb2xvcjtcclxuICAgICAgICBpZiAoaXNWYWxpZFJHQihjb2xvclN0cikpIHtcclxuICAgICAgICAgICAgY29uc3QgcmdiID0gY29sb3JTdHJcclxuICAgICAgICAgICAgICAgIC5zdWJzdHIoNClcclxuICAgICAgICAgICAgICAgIC5zdWJzdHIoMCwgY29sb3JTdHIubGVuZ3RoIC0gNSlcclxuICAgICAgICAgICAgICAgIC5zcGxpdChcIixcIilcclxuICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29sb3JTdHIgPSBSR0JUb0hleChyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlzVmFsaWRIZXgoY29sb3JTdHIpID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhzdiA9IGhleFRvSFNWKGNvbG9yU3RyKTtcclxuICAgICAgICAgICAgY29uc3QgbGlnaHRlckNvbG9ySFNWID0ge1xyXG4gICAgICAgICAgICAgICAgaDogaHN2LmgsXHJcbiAgICAgICAgICAgICAgICBzOiBoc3YucyAqIDAuOCxcclxuICAgICAgICAgICAgICAgIHY6IE1hdGgubWluKDEsIGhzdi52ICogMS4wMiksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IGRhcmtlckNvbG9ySFNWID0ge1xyXG4gICAgICAgICAgICAgICAgaDogaHN2LmgsXHJcbiAgICAgICAgICAgICAgICBzOiBNYXRoLm1pbigxLCBoc3YucyAqIDEuMjUpLFxyXG4gICAgICAgICAgICAgICAgdjogaHN2LnYgKiAwLjgsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGNvbnN0IGRhcmtlckNvbG9ySGV4ID0gSFNWVG9IZXgoZGFya2VyQ29sb3JIU1YuaCwgZGFya2VyQ29sb3JIU1YucywgZGFya2VyQ29sb3JIU1Yudik7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpZ2h0ZXJDb2xvckhleCA9IEhTVlRvSGV4KGxpZ2h0ZXJDb2xvckhTVi5oLCBsaWdodGVyQ29sb3JIU1YucywgbGlnaHRlckNvbG9ySFNWLnYpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogY29sb3JTdHIsXHJcbiAgICAgICAgICAgICAgICBib3JkZXI6IGRhcmtlckNvbG9ySGV4LFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogbGlnaHRlckNvbG9ySGV4LFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogZGFya2VyQ29sb3JIZXgsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaG92ZXI6IHtcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaWdodGVyQ29sb3JIZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBkYXJrZXJDb2xvckhleCxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogY29sb3JTdHIsXHJcbiAgICAgICAgICAgICAgICBib3JkZXI6IGNvbG9yU3RyLFxyXG4gICAgICAgICAgICAgICAgaGlnaGxpZ2h0OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogY29sb3JTdHIsXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyOiBjb2xvclN0cixcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBob3Zlcjoge1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGNvbG9yU3RyLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlcjogY29sb3JTdHIsXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChkZWZhdWx0Q29sb3IpIHtcclxuICAgICAgICAgICAgY29uc3QgY29sb3IgPSB7XHJcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBpbnB1dENvbG9yLmJhY2tncm91bmQgfHwgZGVmYXVsdENvbG9yLmJhY2tncm91bmQsXHJcbiAgICAgICAgICAgICAgICBib3JkZXI6IGlucHV0Q29sb3IuYm9yZGVyIHx8IGRlZmF1bHRDb2xvci5ib3JkZXIsXHJcbiAgICAgICAgICAgICAgICBoaWdobGlnaHQ6IGlzU3RyaW5nKGlucHV0Q29sb3IuaGlnaGxpZ2h0KVxyXG4gICAgICAgICAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IGlucHV0Q29sb3IuaGlnaGxpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBpbnB1dENvbG9yLmhpZ2hsaWdodCxcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IChpbnB1dENvbG9yLmhpZ2hsaWdodCAmJiBpbnB1dENvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kKSB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdENvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IChpbnB1dENvbG9yLmhpZ2hsaWdodCAmJiBpbnB1dENvbG9yLmhpZ2hsaWdodC5ib3JkZXIpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3IuaGlnaGxpZ2h0LmJvcmRlcixcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaG92ZXI6IGlzU3RyaW5nKGlucHV0Q29sb3IuaG92ZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogaW5wdXRDb2xvci5ob3ZlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogaW5wdXRDb2xvci5ob3ZlcixcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogKGlucHV0Q29sb3IuaG92ZXIgJiYgaW5wdXRDb2xvci5ob3Zlci5ib3JkZXIpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3IuaG92ZXIuYm9yZGVyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAoaW5wdXRDb2xvci5ob3ZlciAmJiBpbnB1dENvbG9yLmhvdmVyLmJhY2tncm91bmQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29sb3IuaG92ZXIuYmFja2dyb3VuZCxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICByZXR1cm4gY29sb3I7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBjb2xvciA9IHtcclxuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGlucHV0Q29sb3IuYmFja2dyb3VuZCB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBib3JkZXI6IGlucHV0Q29sb3IuYm9yZGVyIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGhpZ2hsaWdodDogaXNTdHJpbmcoaW5wdXRDb2xvci5oaWdobGlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogaW5wdXRDb2xvci5oaWdobGlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IGlucHV0Q29sb3IuaGlnaGxpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICA6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogKGlucHV0Q29sb3IuaGlnaGxpZ2h0ICYmIGlucHV0Q29sb3IuaGlnaGxpZ2h0LmJhY2tncm91bmQpIHx8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogKGlucHV0Q29sb3IuaGlnaGxpZ2h0ICYmIGlucHV0Q29sb3IuaGlnaGxpZ2h0LmJvcmRlcikgfHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgaG92ZXI6IGlzU3RyaW5nKGlucHV0Q29sb3IuaG92ZXIpXHJcbiAgICAgICAgICAgICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogaW5wdXRDb2xvci5ob3ZlcixcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogaW5wdXRDb2xvci5ob3ZlcixcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogKGlucHV0Q29sb3IuaG92ZXIgJiYgaW5wdXRDb2xvci5ob3Zlci5ib3JkZXIpIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogKGlucHV0Q29sb3IuaG92ZXIgJiYgaW5wdXRDb2xvci5ob3Zlci5iYWNrZ3JvdW5kKSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgcmV0dXJuIGNvbG9yO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4vKipcclxuICogQ29udmVydCBSR0IgXFw8MCwgMjU1XFw+IGludG8gSFNWIG9iamVjdC5cclxuICpcclxuICogQHJlbWFya3NcclxuICoge0BsaW5rIGh0dHA6Ly93d3cuamF2YXNjcmlwdGVyLm5ldC9mYXEvcmdiMmhzdi5odG19XHJcbiAqXHJcbiAqIEBwYXJhbSByZWQgLSBSZWQgY2hhbm5lbC5cclxuICogQHBhcmFtIGdyZWVuIC0gR3JlZW4gY2hhbm5lbC5cclxuICogQHBhcmFtIGJsdWUgLSBCbHVlIGNoYW5uZWwuXHJcbiAqXHJcbiAqIEByZXR1cm5zIEhTViBjb2xvciBvYmplY3QuXHJcbiAqL1xyXG5mdW5jdGlvbiBSR0JUb0hTVihyZWQsIGdyZWVuLCBibHVlKSB7XHJcbiAgICByZWQgPSByZWQgLyAyNTU7XHJcbiAgICBncmVlbiA9IGdyZWVuIC8gMjU1O1xyXG4gICAgYmx1ZSA9IGJsdWUgLyAyNTU7XHJcbiAgICBjb25zdCBtaW5SR0IgPSBNYXRoLm1pbihyZWQsIE1hdGgubWluKGdyZWVuLCBibHVlKSk7XHJcbiAgICBjb25zdCBtYXhSR0IgPSBNYXRoLm1heChyZWQsIE1hdGgubWF4KGdyZWVuLCBibHVlKSk7XHJcbiAgICAvLyBCbGFjay1ncmF5LXdoaXRlXHJcbiAgICBpZiAobWluUkdCID09PSBtYXhSR0IpIHtcclxuICAgICAgICByZXR1cm4geyBoOiAwLCBzOiAwLCB2OiBtaW5SR0IgfTtcclxuICAgIH1cclxuICAgIC8vIENvbG9ycyBvdGhlciB0aGFuIGJsYWNrLWdyYXktd2hpdGU6XHJcbiAgICBjb25zdCBkID0gcmVkID09PSBtaW5SR0IgPyBncmVlbiAtIGJsdWUgOiBibHVlID09PSBtaW5SR0IgPyByZWQgLSBncmVlbiA6IGJsdWUgLSByZWQ7XHJcbiAgICBjb25zdCBoID0gcmVkID09PSBtaW5SR0IgPyAzIDogYmx1ZSA9PT0gbWluUkdCID8gMSA6IDU7XHJcbiAgICBjb25zdCBodWUgPSAoNjAgKiAoaCAtIGQgLyAobWF4UkdCIC0gbWluUkdCKSkpIC8gMzYwO1xyXG4gICAgY29uc3Qgc2F0dXJhdGlvbiA9IChtYXhSR0IgLSBtaW5SR0IpIC8gbWF4UkdCO1xyXG4gICAgY29uc3QgdmFsdWUgPSBtYXhSR0I7XHJcbiAgICByZXR1cm4geyBoOiBodWUsIHM6IHNhdHVyYXRpb24sIHY6IHZhbHVlIH07XHJcbn1cclxuY29uc3QgY3NzVXRpbCA9IHtcclxuICAgIC8vIHNwbGl0IGEgc3RyaW5nIHdpdGggY3NzIHN0eWxlcyBpbnRvIGFuIG9iamVjdCB3aXRoIGtleS92YWx1ZXNcclxuICAgIHNwbGl0KGNzc1RleHQpIHtcclxuICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTtcclxuICAgICAgICBjc3NUZXh0LnNwbGl0KFwiO1wiKS5mb3JFYWNoKChzdHlsZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc3R5bGUudHJpbSgpICE9IFwiXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gc3R5bGUuc3BsaXQoXCI6XCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gcGFydHNbMF0udHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1sxXS50cmltKCk7XHJcbiAgICAgICAgICAgICAgICBzdHlsZXNba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0eWxlcztcclxuICAgIH0sXHJcbiAgICAvLyBidWlsZCBhIGNzcyB0ZXh0IHN0cmluZyBmcm9tIGFuIG9iamVjdCB3aXRoIGtleS92YWx1ZXNcclxuICAgIGpvaW4oc3R5bGVzKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHN0eWxlcylcclxuICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoa2V5KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBrZXkgKyBcIjogXCIgKyBzdHlsZXNba2V5XTtcclxuICAgICAgICB9KVxyXG4gICAgICAgICAgICAuam9pbihcIjsgXCIpO1xyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqIEFwcGVuZCBhIHN0cmluZyB3aXRoIGNzcyBzdHlsZXMgdG8gYW4gZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0aGF0IHdpbGwgcmVjZWl2ZSBuZXcgc3R5bGVzLlxyXG4gKiBAcGFyYW0gY3NzVGV4dCAtIFRoZSBzdHlsZXMgdG8gYmUgYXBwZW5kZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiBhZGRDc3NUZXh0KGVsZW1lbnQsIGNzc1RleHQpIHtcclxuICAgIGNvbnN0IGN1cnJlbnRTdHlsZXMgPSBjc3NVdGlsLnNwbGl0KGVsZW1lbnQuc3R5bGUuY3NzVGV4dCk7XHJcbiAgICBjb25zdCBuZXdTdHlsZXMgPSBjc3NVdGlsLnNwbGl0KGNzc1RleHQpO1xyXG4gICAgY29uc3Qgc3R5bGVzID0ge1xyXG4gICAgICAgIC4uLmN1cnJlbnRTdHlsZXMsXHJcbiAgICAgICAgLi4ubmV3U3R5bGVzLFxyXG4gICAgfTtcclxuICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGNzc1V0aWwuam9pbihzdHlsZXMpO1xyXG59XHJcbi8qKlxyXG4gKiBSZW1vdmUgYSBzdHJpbmcgd2l0aCBjc3Mgc3R5bGVzIGZyb20gYW4gZWxlbWVudC5cclxuICpcclxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHN0eWxlcyBzaG91bGQgYmUgcmVtb3ZlZC5cclxuICogQHBhcmFtIGNzc1RleHQgLSBUaGUgc3R5bGVzIHRvIGJlIHJlbW92ZWQuXHJcbiAqL1xyXG5mdW5jdGlvbiByZW1vdmVDc3NUZXh0KGVsZW1lbnQsIGNzc1RleHQpIHtcclxuICAgIGNvbnN0IHN0eWxlcyA9IGNzc1V0aWwuc3BsaXQoZWxlbWVudC5zdHlsZS5jc3NUZXh0KTtcclxuICAgIGNvbnN0IHJlbW92ZVN0eWxlcyA9IGNzc1V0aWwuc3BsaXQoY3NzVGV4dCk7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBpbiByZW1vdmVTdHlsZXMpIHtcclxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlbW92ZVN0eWxlcywga2V5KSkge1xyXG4gICAgICAgICAgICBkZWxldGUgc3R5bGVzW2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gY3NzVXRpbC5qb2luKHN0eWxlcyk7XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlcnQgSFNWIFxcPDAsIDFcXD4gaW50byBSR0IgY29sb3Igb2JqZWN0LlxyXG4gKlxyXG4gKiBAcmVtYXJrc1xyXG4gKiB7QGxpbmsgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vbWppamFja3Nvbi81MzExMjU2fVxyXG4gKlxyXG4gKiBAcGFyYW0gaCAtIEh1ZS5cclxuICogQHBhcmFtIHMgLSBTYXR1cmF0aW9uLlxyXG4gKiBAcGFyYW0gdiAtIFZhbHVlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBSR0IgY29sb3Igb2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gSFNWVG9SR0IoaCwgcywgdikge1xyXG4gICAgbGV0IHI7XHJcbiAgICBsZXQgZztcclxuICAgIGxldCBiO1xyXG4gICAgY29uc3QgaSA9IE1hdGguZmxvb3IoaCAqIDYpO1xyXG4gICAgY29uc3QgZiA9IGggKiA2IC0gaTtcclxuICAgIGNvbnN0IHAgPSB2ICogKDEgLSBzKTtcclxuICAgIGNvbnN0IHEgPSB2ICogKDEgLSBmICogcyk7XHJcbiAgICBjb25zdCB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpO1xyXG4gICAgc3dpdGNoIChpICUgNikge1xyXG4gICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgKHIgPSB2KSwgKGcgPSB0KSwgKGIgPSBwKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgICAociA9IHEpLCAoZyA9IHYpLCAoYiA9IHApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICAgIChyID0gcCksIChnID0gdiksIChiID0gdCk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgICAgKHIgPSBwKSwgKGcgPSBxKSwgKGIgPSB2KTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSA0OlxyXG4gICAgICAgICAgICAociA9IHQpLCAoZyA9IHApLCAoYiA9IHYpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDU6XHJcbiAgICAgICAgICAgIChyID0gdiksIChnID0gcCksIChiID0gcSk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICByOiBNYXRoLmZsb29yKHIgKiAyNTUpLFxyXG4gICAgICAgIGc6IE1hdGguZmxvb3IoZyAqIDI1NSksXHJcbiAgICAgICAgYjogTWF0aC5mbG9vcihiICogMjU1KSxcclxuICAgIH07XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlcnQgSFNWIFxcPDAsIDFcXD4gaW50byBoZXggY29sb3Igc3RyaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gaCAtIEh1ZS5cclxuICogQHBhcmFtIHMgLSBTYXR1cmF0aW9uLlxyXG4gKiBAcGFyYW0gdiAtIFZhbHVlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBIZXggY29sb3Igc3RyaW5nLlxyXG4gKi9cclxuZnVuY3Rpb24gSFNWVG9IZXgoaCwgcywgdikge1xyXG4gICAgY29uc3QgcmdiID0gSFNWVG9SR0IoaCwgcywgdik7XHJcbiAgICByZXR1cm4gUkdCVG9IZXgocmdiLnIsIHJnYi5nLCByZ2IuYik7XHJcbn1cclxuLyoqXHJcbiAqIENvbnZlcnQgaGV4IGNvbG9yIHN0cmluZyBpbnRvIEhTViBcXDwwLCAxXFw+LlxyXG4gKlxyXG4gKiBAcGFyYW0gaGV4IC0gSGV4IGNvbG9yIHN0cmluZy5cclxuICpcclxuICogQHJldHVybnMgSFNWIGNvbG9yIG9iamVjdC5cclxuICovXHJcbmZ1bmN0aW9uIGhleFRvSFNWKGhleCkge1xyXG4gICAgY29uc3QgcmdiID0gaGV4VG9SR0IoaGV4KTtcclxuICAgIGlmICghcmdiKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgJyR7aGV4fScgaXMgbm90IGEgdmFsaWQgY29sb3IuYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gUkdCVG9IU1YocmdiLnIsIHJnYi5nLCByZ2IuYik7XHJcbn1cclxuLyoqXHJcbiAqIFZhbGlkYXRlIGhleCBjb2xvciBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSBoZXggLSBVbmtub3duIHN0cmluZyB0aGF0IG1heSBjb250YWluIGEgY29sb3IuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNWYWxpZEhleChoZXgpIHtcclxuICAgIGNvbnN0IGlzT2sgPSAvKF4jWzAtOUEtRl17Nn0kKXwoXiNbMC05QS1GXXszfSQpL2kudGVzdChoZXgpO1xyXG4gICAgcmV0dXJuIGlzT2s7XHJcbn1cclxuLyoqXHJcbiAqIFZhbGlkYXRlIFJHQiBjb2xvciBzdHJpbmcuXHJcbiAqXHJcbiAqIEBwYXJhbSByZ2IgLSBVbmtub3duIHN0cmluZyB0aGF0IG1heSBjb250YWluIGEgY29sb3IuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIHN0cmluZyBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNWYWxpZFJHQihyZ2IpIHtcclxuICAgIHJldHVybiByZ2JSRS50ZXN0KHJnYik7XHJcbn1cclxuLyoqXHJcbiAqIFZhbGlkYXRlIFJHQkEgY29sb3Igc3RyaW5nLlxyXG4gKlxyXG4gKiBAcGFyYW0gcmdiYSAtIFVua25vd24gc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gYSBjb2xvci5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIHZhbGlkLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc1ZhbGlkUkdCQShyZ2JhKSB7XHJcbiAgICByZXR1cm4gcmdiYVJFLnRlc3QocmdiYSk7XHJcbn1cclxuLyoqXHJcbiAqIFRoaXMgcmVjdXJzaXZlbHkgcmVkaXJlY3RzIHRoZSBwcm90b3R5cGUgb2YgSlNPTiBvYmplY3RzIHRvIHRoZSByZWZlcmVuY2VPYmplY3QuXHJcbiAqIFRoaXMgaXMgdXNlZCBmb3IgZGVmYXVsdCBvcHRpb25zLlxyXG4gKlxyXG4gKiBAcGFyYW0gZmllbGRzIC0gTmFtZXMgb2YgcHJvcGVydGllcyB0byBiZSBicmlkZ2VkLlxyXG4gKiBAcGFyYW0gcmVmZXJlbmNlT2JqZWN0IC0gVGhlIG9yaWdpbmFsIG9iamVjdC5cclxuICpcclxuICogQHJldHVybnMgQSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSB0aGUgcmVmZXJlbmNlT2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gc2VsZWN0aXZlQnJpZGdlT2JqZWN0KGZpZWxkcywgcmVmZXJlbmNlT2JqZWN0KSB7XHJcbiAgICBpZiAocmVmZXJlbmNlT2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiByZWZlcmVuY2VPYmplY3QgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAvLyAhISEgdHlwZW9mIG51bGwgPT09ICdvYmplY3QnXHJcbiAgICAgICAgY29uc3Qgb2JqZWN0VG8gPSBPYmplY3QuY3JlYXRlKHJlZmVyZW5jZU9iamVjdCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZWZlcmVuY2VPYmplY3QsIGZpZWxkc1tpXSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlT2JqZWN0W2ZpZWxkc1tpXV0gPT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9iamVjdFRvW2ZpZWxkc1tpXV0gPSBicmlkZ2VPYmplY3QocmVmZXJlbmNlT2JqZWN0W2ZpZWxkc1tpXV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvYmplY3RUbztcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG59XHJcbi8qKlxyXG4gKiBUaGlzIHJlY3Vyc2l2ZWx5IHJlZGlyZWN0cyB0aGUgcHJvdG90eXBlIG9mIEpTT04gb2JqZWN0cyB0byB0aGUgcmVmZXJlbmNlT2JqZWN0LlxyXG4gKiBUaGlzIGlzIHVzZWQgZm9yIGRlZmF1bHQgb3B0aW9ucy5cclxuICpcclxuICogQHBhcmFtIHJlZmVyZW5jZU9iamVjdCAtIFRoZSBvcmlnaW5hbCBvYmplY3QuXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBFbGVtZW50IGlmIHRoZSByZWZlcmVuY2VPYmplY3QgaXMgYW4gRWxlbWVudCwgb3IgYSBuZXcgb2JqZWN0IGluaGVyaXRpbmcgZnJvbSB0aGUgcmVmZXJlbmNlT2JqZWN0LlxyXG4gKi9cclxuZnVuY3Rpb24gYnJpZGdlT2JqZWN0KHJlZmVyZW5jZU9iamVjdCkge1xyXG4gICAgaWYgKHJlZmVyZW5jZU9iamVjdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVmZXJlbmNlT2JqZWN0ICE9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAocmVmZXJlbmNlT2JqZWN0IGluc3RhbmNlb2YgRWxlbWVudCkge1xyXG4gICAgICAgIC8vIEF2b2lkIGJyaWRnaW5nIERPTSBvYmplY3RzXHJcbiAgICAgICAgcmV0dXJuIHJlZmVyZW5jZU9iamVjdDtcclxuICAgIH1cclxuICAgIGNvbnN0IG9iamVjdFRvID0gT2JqZWN0LmNyZWF0ZShyZWZlcmVuY2VPYmplY3QpO1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlZmVyZW5jZU9iamVjdCkge1xyXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVmZXJlbmNlT2JqZWN0LCBpKSkge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlZmVyZW5jZU9iamVjdFtpXSA9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBvYmplY3RUb1tpXSA9IGJyaWRnZU9iamVjdChyZWZlcmVuY2VPYmplY3RbaV0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iamVjdFRvO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHN0YWJsZSBzb3J0IGltcGxlbWVudGF0aW9uLCB2ZXJ5IGZhc3QgZm9yIHByZXNvcnRlZCBkYXRhLlxyXG4gKlxyXG4gKiBAcGFyYW0gYSAtIFRoZSBhcnJheSB0byBiZSBzb3J0ZWQgKGluLXBsYWNlKS5cclxuICogQHBhcmFtIGNvbXBhcmUgLSBBbiBvcmRlciBjb21wYXJhdG9yLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnQgYS5cclxuICovXHJcbmZ1bmN0aW9uIGluc2VydFNvcnQoYSwgY29tcGFyZSkge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgayA9IGFbaV07XHJcbiAgICAgICAgbGV0IGo7XHJcbiAgICAgICAgZm9yIChqID0gaTsgaiA+IDAgJiYgY29tcGFyZShrLCBhW2ogLSAxXSkgPCAwOyBqLS0pIHtcclxuICAgICAgICAgICAgYVtqXSA9IGFbaiAtIDFdO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhW2pdID0gaztcclxuICAgIH1cclxuICAgIHJldHVybiBhO1xyXG59XHJcbi8qKlxyXG4gKiBUaGlzIGlzIHVzZWQgdG8gc2V0IHRoZSBvcHRpb25zIG9mIHN1Ym9iamVjdHMgaW4gdGhlIG9wdGlvbnMgb2JqZWN0LlxyXG4gKlxyXG4gKiBBIHJlcXVpcmVtZW50IG9mIHRoZXNlIHN1Ym9iamVjdHMgaXMgdGhhdCB0aGV5IGhhdmUgYW4gJ2VuYWJsZWQnIGVsZW1lbnRcclxuICogd2hpY2ggaXMgb3B0aW9uYWwgZm9yIHRoZSB1c2VyIGJ1dCBtYW5kYXRvcnkgZm9yIHRoZSBwcm9ncmFtLlxyXG4gKlxyXG4gKiBUaGUgYWRkZWQgdmFsdWUgaGVyZSBvZiB0aGUgbWVyZ2UgaXMgdGhhdCBvcHRpb24gJ2VuYWJsZWQnIGlzIHNldCBhcyByZXF1aXJlZC5cclxuICpcclxuICogQHBhcmFtIG1lcmdlVGFyZ2V0IC0gRWl0aGVyIHRoaXMub3B0aW9ucyBvciB0aGUgb3B0aW9ucyB1c2VkIGZvciB0aGUgZ3JvdXBzLlxyXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXHJcbiAqIEBwYXJhbSBvcHRpb24gLSBPcHRpb24ga2V5IGluIHRoZSBvcHRpb25zIGFyZ3VtZW50LlxyXG4gKiBAcGFyYW0gZ2xvYmFsT3B0aW9ucyAtIEdsb2JhbCBvcHRpb25zLCBwYXNzZWQgaW4gdG8gZGV0ZXJtaW5lIHZhbHVlIG9mIG9wdGlvbiAnZW5hYmxlZCcuXHJcbiAqL1xyXG5mdW5jdGlvbiBtZXJnZU9wdGlvbnMobWVyZ2VUYXJnZXQsIG9wdGlvbnMsIG9wdGlvbiwgZ2xvYmFsT3B0aW9ucyA9IHt9KSB7XHJcbiAgICAvLyBMb2NhbCBoZWxwZXJzXHJcbiAgICBjb25zdCBpc1ByZXNlbnQgPSBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiBvYmogIT09IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICBjb25zdCBpc09iamVjdCA9IGZ1bmN0aW9uIChvYmopIHtcclxuICAgICAgICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCI7XHJcbiAgICB9O1xyXG4gICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM0NDkxMjg3LzEyMjM1MzFcclxuICAgIGNvbnN0IGlzRW1wdHkgPSBmdW5jdGlvbiAob2JqKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCB4IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgeCkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH07XHJcbiAgICAvLyBHdWFyZHNcclxuICAgIGlmICghaXNPYmplY3QobWVyZ2VUYXJnZXQpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIG1lcmdlVGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0XCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc09iamVjdChvcHRpb25zKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciBvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xyXG4gICAgfVxyXG4gICAgaWYgKCFpc1ByZXNlbnQob3B0aW9uKSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciBvcHRpb24gbXVzdCBoYXZlIGEgdmFsdWVcIik7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzT2JqZWN0KGdsb2JhbE9wdGlvbnMpKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIGdsb2JhbE9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7XHJcbiAgICB9XHJcbiAgICAvL1xyXG4gICAgLy8gQWN0dWFsIG1lcmdlIHJvdXRpbmUsIHNlcGFyYXRlZCBmcm9tIG1haW4gbG9naWNcclxuICAgIC8vIE9ubHkgYSBzaW5nbGUgbGV2ZWwgb2Ygb3B0aW9ucyBpcyBtZXJnZWQuIERlZXBlciBsZXZlbHMgYXJlIHJlZidkLiBUaGlzIG1heSBhY3R1YWxseSBiZSBhbiBpc3N1ZS5cclxuICAgIC8vXHJcbiAgICBjb25zdCBkb01lcmdlID0gZnVuY3Rpb24gKHRhcmdldCwgb3B0aW9ucywgb3B0aW9uKSB7XHJcbiAgICAgICAgaWYgKCFpc09iamVjdCh0YXJnZXRbb3B0aW9uXSkpIHtcclxuICAgICAgICAgICAgdGFyZ2V0W29wdGlvbl0gPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3JjID0gb3B0aW9uc1tvcHRpb25dO1xyXG4gICAgICAgIGNvbnN0IGRzdCA9IHRhcmdldFtvcHRpb25dO1xyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBpbiBzcmMpIHtcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIHByb3ApKSB7XHJcbiAgICAgICAgICAgICAgICBkc3RbcHJvcF0gPSBzcmNbcHJvcF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLy8gTG9jYWwgaW5pdGlhbGl6YXRpb25cclxuICAgIGNvbnN0IHNyY09wdGlvbiA9IG9wdGlvbnNbb3B0aW9uXTtcclxuICAgIGNvbnN0IGdsb2JhbFBhc3NlZCA9IGlzT2JqZWN0KGdsb2JhbE9wdGlvbnMpICYmICFpc0VtcHR5KGdsb2JhbE9wdGlvbnMpO1xyXG4gICAgY29uc3QgZ2xvYmFsT3B0aW9uID0gZ2xvYmFsUGFzc2VkID8gZ2xvYmFsT3B0aW9uc1tvcHRpb25dIDogdW5kZWZpbmVkO1xyXG4gICAgY29uc3QgZ2xvYmFsRW5hYmxlZCA9IGdsb2JhbE9wdGlvbiA/IGdsb2JhbE9wdGlvbi5lbmFibGVkIDogdW5kZWZpbmVkO1xyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIC8vIE1haW4gcm91dGluZVxyXG4gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAgIGlmIChzcmNPcHRpb24gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkb1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBzcmNPcHRpb24gPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgICAgaWYgKCFpc09iamVjdChtZXJnZVRhcmdldFtvcHRpb25dKSkge1xyXG4gICAgICAgICAgICBtZXJnZVRhcmdldFtvcHRpb25dID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG1lcmdlVGFyZ2V0W29wdGlvbl0uZW5hYmxlZCA9IHNyY09wdGlvbjtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoc3JjT3B0aW9uID09PSBudWxsICYmICFpc09iamVjdChtZXJnZVRhcmdldFtvcHRpb25dKSkge1xyXG4gICAgICAgIC8vIElmIHBvc3NpYmxlLCBleHBsaWNpdCBjb3B5IGZyb20gZ2xvYmFsc1xyXG4gICAgICAgIGlmIChpc1ByZXNlbnQoZ2xvYmFsT3B0aW9uKSkge1xyXG4gICAgICAgICAgICBtZXJnZVRhcmdldFtvcHRpb25dID0gT2JqZWN0LmNyZWF0ZShnbG9iYWxPcHRpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGRvXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFpc09iamVjdChzcmNPcHRpb24pKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy9cclxuICAgIC8vIEVuc3VyZSB0aGF0ICdlbmFibGVkJyBpcyBwcm9wZXJseSBzZXQuIEl0IGlzIHJlcXVpcmVkIGludGVybmFsbHlcclxuICAgIC8vIE5vdGUgdGhhdCB0aGUgdmFsdWUgZnJvbSBvcHRpb25zIHdpbGwgYWx3YXlzIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgdmFsdWVcclxuICAgIC8vXHJcbiAgICBsZXQgZW5hYmxlZCA9IHRydWU7IC8vIGRlZmF1bHQgdmFsdWVcclxuICAgIGlmIChzcmNPcHRpb24uZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZW5hYmxlZCA9IHNyY09wdGlvbi5lbmFibGVkO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgLy8gVGFrZSBmcm9tIGdsb2JhbHMsIGlmIHByZXNlbnRcclxuICAgICAgICBpZiAoZ2xvYmFsRW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGVuYWJsZWQgPSBnbG9iYWxPcHRpb24uZW5hYmxlZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBkb01lcmdlKG1lcmdlVGFyZ2V0LCBvcHRpb25zLCBvcHRpb24pO1xyXG4gICAgbWVyZ2VUYXJnZXRbb3B0aW9uXS5lbmFibGVkID0gZW5hYmxlZDtcclxufVxyXG4vKipcclxuICogVGhpcyBmdW5jdGlvbiBkb2VzIGEgYmluYXJ5IHNlYXJjaCBmb3IgYSB2aXNpYmxlIGl0ZW0gaW4gYSBzb3J0ZWQgbGlzdC4gSWYgd2UgZmluZCBhIHZpc2libGUgaXRlbSwgdGhlIGNvZGUgdGhhdCB1c2VzXHJcbiAqIHRoaXMgZnVuY3Rpb24gd2lsbCB0aGVuIGl0ZXJhdGUgaW4gYm90aCBkaXJlY3Rpb25zIG92ZXIgdGhpcyBzb3J0ZWQgbGlzdCB0byBmaW5kIGFsbCB2aXNpYmxlIGl0ZW1zLlxyXG4gKlxyXG4gKiBAcGFyYW0gb3JkZXJlZEl0ZW1zIC0gSXRlbXMgb3JkZXJlZCBieSBzdGFydC5cclxuICogQHBhcmFtIGNvbXBhcmF0b3IgLSAtMSBpcyBsb3dlciwgMCBpcyBlcXVhbCwgMSBpcyBoaWdoZXIuXHJcbiAqIEBwYXJhbSBmaWVsZCAtIFByb3BlcnR5IG5hbWUgb24gYW4gaXRlbSAoVGhhdCBpcyBpdGVtW2ZpZWxkXSkuXHJcbiAqIEBwYXJhbSBmaWVsZDIgLSBTZWNvbmQgcHJvcGVydHkgbmFtZSBvbiBhbiBpdGVtIChUaGF0IGlzIGl0ZW1bZmllbGRdW2ZpZWxkMl0pLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBJbmRleCBvZiB0aGUgZm91bmQgaXRlbSBvciAtMSBpZiBub3RoaW5nIHdhcyBmb3VuZC5cclxuICovXHJcbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaEN1c3RvbShvcmRlcmVkSXRlbXMsIGNvbXBhcmF0b3IsIGZpZWxkLCBmaWVsZDIpIHtcclxuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSAxMDAwMDtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IGxvdyA9IDA7XHJcbiAgICBsZXQgaGlnaCA9IG9yZGVyZWRJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgd2hpbGUgKGxvdyA8PSBoaWdoICYmIGl0ZXJhdGlvbiA8IG1heEl0ZXJhdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBtaWRkbGUgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBvcmRlcmVkSXRlbXNbbWlkZGxlXTtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IGZpZWxkMiA9PT0gdW5kZWZpbmVkID8gaXRlbVtmaWVsZF0gOiBpdGVtW2ZpZWxkXVtmaWVsZDJdO1xyXG4gICAgICAgIGNvbnN0IHNlYXJjaFJlc3VsdCA9IGNvbXBhcmF0b3IodmFsdWUpO1xyXG4gICAgICAgIGlmIChzZWFyY2hSZXN1bHQgPT0gMCkge1xyXG4gICAgICAgICAgICAvLyBqaWhhYSwgZm91bmQgYSB2aXNpYmxlIGl0ZW0hXHJcbiAgICAgICAgICAgIHJldHVybiBtaWRkbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHNlYXJjaFJlc3VsdCA9PSAtMSkge1xyXG4gICAgICAgICAgICAvLyBpdCBpcyB0b28gc21hbGwgLS0+IGluY3JlYXNlIGxvd1xyXG4gICAgICAgICAgICBsb3cgPSBtaWRkbGUgKyAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gaXQgaXMgdG9vIGJpZyAtLT4gZGVjcmVhc2UgaGlnaFxyXG4gICAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gLTE7XHJcbn1cclxuLyoqXHJcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggZm9yIGEgc3BlY2lmaWMgdmFsdWUgaW4gYSBzb3J0ZWQgYXJyYXkuXHJcbiAqIElmIGl0IGRvZXMgbm90IGV4aXN0IGJ1dCBpcyBpbiBiZXR3ZWVuIG9mIHR3byB2YWx1ZXMsIHdlIHJldHVybiBlaXRoZXIgdGhlXHJcbiAqIG9uZSBiZWZvcmUgb3IgdGhlIG9uZSBhZnRlciwgZGVwZW5kaW5nIG9uIHVzZXIgaW5wdXQgSWYgaXQgaXMgZm91bmQsIHdlXHJcbiAqIHJldHVybiB0aGUgaW5kZXgsIGVsc2UgLTEuXHJcbiAqXHJcbiAqIEBwYXJhbSBvcmRlcmVkSXRlbXMgLSBTb3J0ZWQgYXJyYXkuXHJcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgc2VhcmNoZWQgdmFsdWUuXHJcbiAqIEBwYXJhbSBmaWVsZCAtIE5hbWUgb2YgdGhlIHByb3BlcnR5IGluIGl0ZW1zIHRvIGJlIHNlYXJjaGVkLlxyXG4gKiBAcGFyYW0gc2lkZVByZWZlcmVuY2UgLSBJZiB0aGUgdGFyZ2V0IGlzIGJldHdlZW4gdHdvIHZhbHVlcywgc2hvdWxkIHRoZSBpbmRleCBvZiB0aGUgYmVmb3JlIG9yIHRoZSBhZnRlciBiZSByZXR1cm5lZD9cclxuICogQHBhcmFtIGNvbXBhcmF0b3IgLSBBbiBvcHRpb25hbCBjb21wYXJhdG9yLCByZXR1cm5pbmcgLTEsIDAsIDEgZm9yIFxcPCwgPT09LCBcXD4uXHJcbiAqXHJcbiAqIEByZXR1cm5zIFRoZSBpbmRleCBvZiBmb3VuZCB2YWx1ZSBvciAtMSBpZiBub3RoaW5nIHdhcyBmb3VuZC5cclxuICovXHJcbmZ1bmN0aW9uIGJpbmFyeVNlYXJjaFZhbHVlKG9yZGVyZWRJdGVtcywgdGFyZ2V0LCBmaWVsZCwgc2lkZVByZWZlcmVuY2UsIGNvbXBhcmF0b3IpIHtcclxuICAgIGNvbnN0IG1heEl0ZXJhdGlvbnMgPSAxMDAwMDtcclxuICAgIGxldCBpdGVyYXRpb24gPSAwO1xyXG4gICAgbGV0IGxvdyA9IDA7XHJcbiAgICBsZXQgaGlnaCA9IG9yZGVyZWRJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IHByZXZWYWx1ZTtcclxuICAgIGxldCB2YWx1ZTtcclxuICAgIGxldCBuZXh0VmFsdWU7XHJcbiAgICBsZXQgbWlkZGxlO1xyXG4gICAgY29tcGFyYXRvciA9XHJcbiAgICAgICAgY29tcGFyYXRvciAhPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyBjb21wYXJhdG9yXHJcbiAgICAgICAgICAgIDogZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhID09IGIgPyAwIDogYSA8IGIgPyAtMSA6IDE7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICB3aGlsZSAobG93IDw9IGhpZ2ggJiYgaXRlcmF0aW9uIDwgbWF4SXRlcmF0aW9ucykge1xyXG4gICAgICAgIC8vIGdldCBhIG5ldyBndWVzc1xyXG4gICAgICAgIG1pZGRsZSA9IE1hdGguZmxvb3IoMC41ICogKGhpZ2ggKyBsb3cpKTtcclxuICAgICAgICBwcmV2VmFsdWUgPSBvcmRlcmVkSXRlbXNbTWF0aC5tYXgoMCwgbWlkZGxlIC0gMSldW2ZpZWxkXTtcclxuICAgICAgICB2YWx1ZSA9IG9yZGVyZWRJdGVtc1ttaWRkbGVdW2ZpZWxkXTtcclxuICAgICAgICBuZXh0VmFsdWUgPVxyXG4gICAgICAgICAgICBvcmRlcmVkSXRlbXNbTWF0aC5taW4ob3JkZXJlZEl0ZW1zLmxlbmd0aCAtIDEsIG1pZGRsZSArIDEpXVtmaWVsZF07XHJcbiAgICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIHRhcmdldCkgPT0gMCkge1xyXG4gICAgICAgICAgICAvLyB3ZSBmb3VuZCB0aGUgdGFyZ2V0XHJcbiAgICAgICAgICAgIHJldHVybiBtaWRkbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbXBhcmF0b3IocHJldlZhbHVlLCB0YXJnZXQpIDwgMCAmJlxyXG4gICAgICAgICAgICBjb21wYXJhdG9yKHZhbHVlLCB0YXJnZXQpID4gMCkge1xyXG4gICAgICAgICAgICAvLyB0YXJnZXQgaXMgaW4gYmV0d2VlbiBvZiB0aGUgcHJldmlvdXMgYW5kIHRoZSBjdXJyZW50XHJcbiAgICAgICAgICAgIHJldHVybiBzaWRlUHJlZmVyZW5jZSA9PSBcImJlZm9yZVwiID8gTWF0aC5tYXgoMCwgbWlkZGxlIC0gMSkgOiBtaWRkbGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGNvbXBhcmF0b3IodmFsdWUsIHRhcmdldCkgPCAwICYmXHJcbiAgICAgICAgICAgIGNvbXBhcmF0b3IobmV4dFZhbHVlLCB0YXJnZXQpID4gMCkge1xyXG4gICAgICAgICAgICAvLyB0YXJnZXQgaXMgaW4gYmV0d2VlbiBvZiB0aGUgY3VycmVudCBhbmQgdGhlIG5leHRcclxuICAgICAgICAgICAgcmV0dXJuIHNpZGVQcmVmZXJlbmNlID09IFwiYmVmb3JlXCJcclxuICAgICAgICAgICAgICAgID8gbWlkZGxlXHJcbiAgICAgICAgICAgICAgICA6IE1hdGgubWluKG9yZGVyZWRJdGVtcy5sZW5ndGggLSAxLCBtaWRkbGUgKyAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGRpZG50IGZpbmQgdGhlIHRhcmdldCwgd2UgbmVlZCB0byBjaGFuZ2Ugb3VyIGJvdW5kYXJpZXMuXHJcbiAgICAgICAgICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCB0YXJnZXQpIDwgMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaXQgaXMgdG9vIHNtYWxsIC0tPiBpbmNyZWFzZSBsb3dcclxuICAgICAgICAgICAgICAgIGxvdyA9IG1pZGRsZSArIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpdCBpcyB0b28gYmlnIC0tPiBkZWNyZWFzZSBoaWdoXHJcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkZGxlIC0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpdGVyYXRpb24rKztcclxuICAgIH1cclxuICAgIC8vIGRpZG50IGZpbmQgYW55dGhpbmcuIFJldHVybiAtMS5cclxuICAgIHJldHVybiAtMTtcclxufVxyXG4vKlxyXG4gKiBFYXNpbmcgRnVuY3Rpb25zLlxyXG4gKiBPbmx5IGNvbnNpZGVyaW5nIHRoZSB0IHZhbHVlIGZvciB0aGUgcmFuZ2UgWzAsIDFdID0+IFswLCAxXS5cclxuICpcclxuICogSW5zcGlyYXRpb246IGZyb20gaHR0cDovL2dpem1hLmNvbS9lYXNpbmcvXHJcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2dyZS8xNjUwMjk0XHJcbiAqL1xyXG5jb25zdCBlYXNpbmdGdW5jdGlvbnMgPSB7XHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIG5vIGVhc2luZyBhbmQgbm8gYWNjZWxlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0IC0gVGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBWYWx1ZSBhdCB0aW1lIHQuXHJcbiAgICAgKi9cclxuICAgIGxpbmVhcih0KSB7XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2NlbGVyYXRlIGZyb20gemVybyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlSW5RdWFkKHQpIHtcclxuICAgICAgICByZXR1cm4gdCAqIHQ7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNlbGVyYXRlIHRvIHplcm8gdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHQgLSBUaW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFZhbHVlIGF0IHRpbWUgdC5cclxuICAgICAqL1xyXG4gICAgZWFzZU91dFF1YWQodCkge1xyXG4gICAgICAgIHJldHVybiB0ICogKDIgLSB0KTtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VsZXJhdGUgdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0IC0gVGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBWYWx1ZSBhdCB0aW1lIHQuXHJcbiAgICAgKi9cclxuICAgIGVhc2VJbk91dFF1YWQodCkge1xyXG4gICAgICAgIHJldHVybiB0IDwgMC41ID8gMiAqIHQgKiB0IDogLTEgKyAoNCAtIDIgKiB0KSAqIHQ7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2NlbGVyYXRlIGZyb20gemVybyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlSW5DdWJpYyh0KSB7XHJcbiAgICAgICAgcmV0dXJuIHQgKiB0ICogdDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIERlY2VsZXJhdGUgdG8gemVybyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlT3V0Q3ViaWModCkge1xyXG4gICAgICAgIHJldHVybiAtLXQgKiB0ICogdCArIDE7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2NlbGVyYXRlIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlSW5PdXRDdWJpYyh0KSB7XHJcbiAgICAgICAgcmV0dXJuIHQgPCAwLjUgPyA0ICogdCAqIHQgKiB0IDogKHQgLSAxKSAqICgyICogdCAtIDIpICogKDIgKiB0IC0gMikgKyAxO1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQWNjZWxlcmF0ZSBmcm9tIHplcm8gdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHQgLSBUaW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFZhbHVlIGF0IHRpbWUgdC5cclxuICAgICAqL1xyXG4gICAgZWFzZUluUXVhcnQodCkge1xyXG4gICAgICAgIHJldHVybiB0ICogdCAqIHQgKiB0O1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogRGVjZWxlcmF0ZSB0byB6ZXJvIHZlbG9jaXR5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0IC0gVGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBWYWx1ZSBhdCB0aW1lIHQuXHJcbiAgICAgKi9cclxuICAgIGVhc2VPdXRRdWFydCh0KSB7XHJcbiAgICAgICAgcmV0dXJuIDEgLSAtLXQgKiB0ICogdCAqIHQ7XHJcbiAgICB9LFxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2NlbGVyYXRlIHVudGlsIGhhbGZ3YXksIHRoZW4gZGVjZWxlcmF0ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlSW5PdXRRdWFydCh0KSB7XHJcbiAgICAgICAgcmV0dXJuIHQgPCAwLjUgPyA4ICogdCAqIHQgKiB0ICogdCA6IDEgLSA4ICogLS10ICogdCAqIHQgKiB0O1xyXG4gICAgfSxcclxuICAgIC8qKlxyXG4gICAgICogQWNjZWxlcmF0ZSBmcm9tIHplcm8gdmVsb2NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHQgLSBUaW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFZhbHVlIGF0IHRpbWUgdC5cclxuICAgICAqL1xyXG4gICAgZWFzZUluUXVpbnQodCkge1xyXG4gICAgICAgIHJldHVybiB0ICogdCAqIHQgKiB0ICogdDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIERlY2VsZXJhdGUgdG8gemVybyB2ZWxvY2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdCAtIFRpbWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVmFsdWUgYXQgdGltZSB0LlxyXG4gICAgICovXHJcbiAgICBlYXNlT3V0UXVpbnQodCkge1xyXG4gICAgICAgIHJldHVybiAxICsgLS10ICogdCAqIHQgKiB0ICogdDtcclxuICAgIH0sXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VsZXJhdGUgdW50aWwgaGFsZndheSwgdGhlbiBkZWNlbGVyYXRlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB0IC0gVGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBWYWx1ZSBhdCB0aW1lIHQuXHJcbiAgICAgKi9cclxuICAgIGVhc2VJbk91dFF1aW50KHQpIHtcclxuICAgICAgICByZXR1cm4gdCA8IDAuNSA/IDE2ICogdCAqIHQgKiB0ICogdCAqIHQgOiAxICsgMTYgKiAtLXQgKiB0ICogdCAqIHQgKiB0O1xyXG4gICAgfSxcclxufTtcclxuLyoqXHJcbiAqIEV4cGVyaW1lbnRhbHkgY29tcHV0ZSB0aGUgd2lkdGggb2YgdGhlIHNjcm9sbGJhciBmb3IgdGhpcyBicm93c2VyLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUaGUgd2lkdGggaW4gcGl4ZWxzLlxyXG4gKi9cclxuZnVuY3Rpb24gZ2V0U2Nyb2xsQmFyV2lkdGgoKSB7XHJcbiAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJwXCIpO1xyXG4gICAgaW5uZXIuc3R5bGUud2lkdGggPSBcIjEwMCVcIjtcclxuICAgIGlubmVyLnN0eWxlLmhlaWdodCA9IFwiMjAwcHhcIjtcclxuICAgIGNvbnN0IG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgIG91dGVyLnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xyXG4gICAgb3V0ZXIuc3R5bGUudG9wID0gXCIwcHhcIjtcclxuICAgIG91dGVyLnN0eWxlLmxlZnQgPSBcIjBweFwiO1xyXG4gICAgb3V0ZXIuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XHJcbiAgICBvdXRlci5zdHlsZS53aWR0aCA9IFwiMjAwcHhcIjtcclxuICAgIG91dGVyLnN0eWxlLmhlaWdodCA9IFwiMTUwcHhcIjtcclxuICAgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcclxuICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKTtcclxuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3V0ZXIpO1xyXG4gICAgY29uc3QgdzEgPSBpbm5lci5vZmZzZXRXaWR0aDtcclxuICAgIG91dGVyLnN0eWxlLm92ZXJmbG93ID0gXCJzY3JvbGxcIjtcclxuICAgIGxldCB3MiA9IGlubmVyLm9mZnNldFdpZHRoO1xyXG4gICAgaWYgKHcxID09IHcyKSB7XHJcbiAgICAgICAgdzIgPSBvdXRlci5jbGllbnRXaWR0aDtcclxuICAgIH1cclxuICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQob3V0ZXIpO1xyXG4gICAgcmV0dXJuIHcxIC0gdzI7XHJcbn1cclxuLy8gQFRPRE86IFRoaXMgZG9lc24ndCB3b3JrIHByb3Blcmx5LlxyXG4vLyBJdCB3b3JrcyBvbmx5IGZvciBzaW5nbGUgcHJvcGVydHkgb2JqZWN0cyxcclxuLy8gb3RoZXJ3aXNlIGl0IGNvbWJpbmVzIGFsbCBvZiB0aGUgdHlwZXMgaW4gYSB1bmlvbi5cclxuLy8gZXhwb3J0IGZ1bmN0aW9uIHRvcE1vc3Q8SzEgZXh0ZW5kcyBzdHJpbmcsIFYxPiAoXHJcbi8vICAgcGlsZTogUmVjb3JkPEsxLCB1bmRlZmluZWQgfCBWMT5bXSxcclxuLy8gICBhY2Nlc3NvcnM6IEsxIHwgW0sxXVxyXG4vLyApOiB1bmRlZmluZWQgfCBWMVxyXG4vLyBleHBvcnQgZnVuY3Rpb24gdG9wTW9zdDxLMSBleHRlbmRzIHN0cmluZywgSzIgZXh0ZW5kcyBzdHJpbmcsIFYxLCBWMj4gKFxyXG4vLyAgIHBpbGU6IFJlY29yZDxLMSwgdW5kZWZpbmVkIHwgVjEgfCBSZWNvcmQ8SzIsIHVuZGVmaW5lZCB8IFYyPj5bXSxcclxuLy8gICBhY2Nlc3NvcnM6IFtLMSwgSzJdXHJcbi8vICk6IHVuZGVmaW5lZCB8IFYxIHwgVjJcclxuLy8gZXhwb3J0IGZ1bmN0aW9uIHRvcE1vc3Q8SzEgZXh0ZW5kcyBzdHJpbmcsIEsyIGV4dGVuZHMgc3RyaW5nLCBLMyBleHRlbmRzIHN0cmluZywgVjEsIFYyLCBWMz4gKFxyXG4vLyAgIHBpbGU6IFJlY29yZDxLMSwgdW5kZWZpbmVkIHwgVjEgfCBSZWNvcmQ8SzIsIHVuZGVmaW5lZCB8IFYyIHwgUmVjb3JkPEszLCB1bmRlZmluZWQgfCBWMz4+PltdLFxyXG4vLyAgIGFjY2Vzc29yczogW0sxLCBLMiwgSzNdXHJcbi8vICk6IHVuZGVmaW5lZCB8IFYxIHwgVjIgfCBWM1xyXG4vKipcclxuICogR2V0IHRoZSB0b3AgbW9zdCBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGEgcGlsZSBvZiBvYmplY3RzLlxyXG4gKlxyXG4gKiBAcGFyYW0gcGlsZSAtIEFycmF5IG9mIG9iamVjdHMsIG5vIHJlcXVpcmVkIGZvcm1hdC5cclxuICogQHBhcmFtIGFjY2Vzc29ycyAtIEFycmF5IG9mIHByb3BlcnR5IG5hbWVzLlxyXG4gKiBGb3IgZXhhbXBsZSBgb2JqZWN0Wydmb28nXVsnYmFyJ11gIOKGkiBgWydmb28nLCAnYmFyJ11gLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgd2l0aCBnaXZlbiBhY2Nlc3NvcnMgcGF0aCBmcm9tIHRoZSBmaXJzdCBwaWxlIGl0ZW0gd2hlcmUgaXQncyBub3QgdW5kZWZpbmVkLlxyXG4gKi9cclxuZnVuY3Rpb24gdG9wTW9zdChwaWxlLCBhY2Nlc3NvcnMpIHtcclxuICAgIGxldCBjYW5kaWRhdGU7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWNjZXNzb3JzKSkge1xyXG4gICAgICAgIGFjY2Vzc29ycyA9IFthY2Nlc3NvcnNdO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBtZW1iZXIgb2YgcGlsZSkge1xyXG4gICAgICAgIGlmIChtZW1iZXIpIHtcclxuICAgICAgICAgICAgY2FuZGlkYXRlID0gbWVtYmVyW2FjY2Vzc29yc1swXV07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgYWNjZXNzb3JzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlW2FjY2Vzc29yc1tpXV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZTtcclxufVxuXG5jb25zdCBodG1sQ29sb3JzID0ge1xuICBibGFjazogXCIjMDAwMDAwXCIsXG4gIG5hdnk6IFwiIzAwMDA4MFwiLFxuICBkYXJrYmx1ZTogXCIjMDAwMDhCXCIsXG4gIG1lZGl1bWJsdWU6IFwiIzAwMDBDRFwiLFxuICBibHVlOiBcIiMwMDAwRkZcIixcbiAgZGFya2dyZWVuOiBcIiMwMDY0MDBcIixcbiAgZ3JlZW46IFwiIzAwODAwMFwiLFxuICB0ZWFsOiBcIiMwMDgwODBcIixcbiAgZGFya2N5YW46IFwiIzAwOEI4QlwiLFxuICBkZWVwc2t5Ymx1ZTogXCIjMDBCRkZGXCIsXG4gIGRhcmt0dXJxdW9pc2U6IFwiIzAwQ0VEMVwiLFxuICBtZWRpdW1zcHJpbmdncmVlbjogXCIjMDBGQTlBXCIsXG4gIGxpbWU6IFwiIzAwRkYwMFwiLFxuICBzcHJpbmdncmVlbjogXCIjMDBGRjdGXCIsXG4gIGFxdWE6IFwiIzAwRkZGRlwiLFxuICBjeWFuOiBcIiMwMEZGRkZcIixcbiAgbWlkbmlnaHRibHVlOiBcIiMxOTE5NzBcIixcbiAgZG9kZ2VyYmx1ZTogXCIjMUU5MEZGXCIsXG4gIGxpZ2h0c2VhZ3JlZW46IFwiIzIwQjJBQVwiLFxuICBmb3Jlc3RncmVlbjogXCIjMjI4QjIyXCIsXG4gIHNlYWdyZWVuOiBcIiMyRThCNTdcIixcbiAgZGFya3NsYXRlZ3JheTogXCIjMkY0RjRGXCIsXG4gIGxpbWVncmVlbjogXCIjMzJDRDMyXCIsXG4gIG1lZGl1bXNlYWdyZWVuOiBcIiMzQ0IzNzFcIixcbiAgdHVycXVvaXNlOiBcIiM0MEUwRDBcIixcbiAgcm95YWxibHVlOiBcIiM0MTY5RTFcIixcbiAgc3RlZWxibHVlOiBcIiM0NjgyQjRcIixcbiAgZGFya3NsYXRlYmx1ZTogXCIjNDgzRDhCXCIsXG4gIG1lZGl1bXR1cnF1b2lzZTogXCIjNDhEMUNDXCIsXG4gIGluZGlnbzogXCIjNEIwMDgyXCIsXG4gIGRhcmtvbGl2ZWdyZWVuOiBcIiM1NTZCMkZcIixcbiAgY2FkZXRibHVlOiBcIiM1RjlFQTBcIixcbiAgY29ybmZsb3dlcmJsdWU6IFwiIzY0OTVFRFwiLFxuICBtZWRpdW1hcXVhbWFyaW5lOiBcIiM2NkNEQUFcIixcbiAgZGltZ3JheTogXCIjNjk2OTY5XCIsXG4gIHNsYXRlYmx1ZTogXCIjNkE1QUNEXCIsXG4gIG9saXZlZHJhYjogXCIjNkI4RTIzXCIsXG4gIHNsYXRlZ3JheTogXCIjNzA4MDkwXCIsXG4gIGxpZ2h0c2xhdGVncmF5OiBcIiM3Nzg4OTlcIixcbiAgbWVkaXVtc2xhdGVibHVlOiBcIiM3QjY4RUVcIixcbiAgbGF3bmdyZWVuOiBcIiM3Q0ZDMDBcIixcbiAgY2hhcnRyZXVzZTogXCIjN0ZGRjAwXCIsXG4gIGFxdWFtYXJpbmU6IFwiIzdGRkZENFwiLFxuICBtYXJvb246IFwiIzgwMDAwMFwiLFxuICBwdXJwbGU6IFwiIzgwMDA4MFwiLFxuICBvbGl2ZTogXCIjODA4MDAwXCIsXG4gIGdyYXk6IFwiIzgwODA4MFwiLFxuICBza3libHVlOiBcIiM4N0NFRUJcIixcbiAgbGlnaHRza3libHVlOiBcIiM4N0NFRkFcIixcbiAgYmx1ZXZpb2xldDogXCIjOEEyQkUyXCIsXG4gIGRhcmtyZWQ6IFwiIzhCMDAwMFwiLFxuICBkYXJrbWFnZW50YTogXCIjOEIwMDhCXCIsXG4gIHNhZGRsZWJyb3duOiBcIiM4QjQ1MTNcIixcbiAgZGFya3NlYWdyZWVuOiBcIiM4RkJDOEZcIixcbiAgbGlnaHRncmVlbjogXCIjOTBFRTkwXCIsXG4gIG1lZGl1bXB1cnBsZTogXCIjOTM3MEQ4XCIsXG4gIGRhcmt2aW9sZXQ6IFwiIzk0MDBEM1wiLFxuICBwYWxlZ3JlZW46IFwiIzk4RkI5OFwiLFxuICBkYXJrb3JjaGlkOiBcIiM5OTMyQ0NcIixcbiAgeWVsbG93Z3JlZW46IFwiIzlBQ0QzMlwiLFxuICBzaWVubmE6IFwiI0EwNTIyRFwiLFxuICBicm93bjogXCIjQTUyQTJBXCIsXG4gIGRhcmtncmF5OiBcIiNBOUE5QTlcIixcbiAgbGlnaHRibHVlOiBcIiNBREQ4RTZcIixcbiAgZ3JlZW55ZWxsb3c6IFwiI0FERkYyRlwiLFxuICBwYWxldHVycXVvaXNlOiBcIiNBRkVFRUVcIixcbiAgbGlnaHRzdGVlbGJsdWU6IFwiI0IwQzRERVwiLFxuICBwb3dkZXJibHVlOiBcIiNCMEUwRTZcIixcbiAgZmlyZWJyaWNrOiBcIiNCMjIyMjJcIixcbiAgZGFya2dvbGRlbnJvZDogXCIjQjg4NjBCXCIsXG4gIG1lZGl1bW9yY2hpZDogXCIjQkE1NUQzXCIsXG4gIHJvc3licm93bjogXCIjQkM4RjhGXCIsXG4gIGRhcmtraGFraTogXCIjQkRCNzZCXCIsXG4gIHNpbHZlcjogXCIjQzBDMEMwXCIsXG4gIG1lZGl1bXZpb2xldHJlZDogXCIjQzcxNTg1XCIsXG4gIGluZGlhbnJlZDogXCIjQ0Q1QzVDXCIsXG4gIHBlcnU6IFwiI0NEODUzRlwiLFxuICBjaG9jb2xhdGU6IFwiI0QyNjkxRVwiLFxuICB0YW46IFwiI0QyQjQ4Q1wiLFxuICBsaWdodGdyZXk6IFwiI0QzRDNEM1wiLFxuICBwYWxldmlvbGV0cmVkOiBcIiNEODcwOTNcIixcbiAgdGhpc3RsZTogXCIjRDhCRkQ4XCIsXG4gIG9yY2hpZDogXCIjREE3MEQ2XCIsXG4gIGdvbGRlbnJvZDogXCIjREFBNTIwXCIsXG4gIGNyaW1zb246IFwiI0RDMTQzQ1wiLFxuICBnYWluc2Jvcm86IFwiI0RDRENEQ1wiLFxuICBwbHVtOiBcIiNEREEwRERcIixcbiAgYnVybHl3b29kOiBcIiNERUI4ODdcIixcbiAgbGlnaHRjeWFuOiBcIiNFMEZGRkZcIixcbiAgbGF2ZW5kZXI6IFwiI0U2RTZGQVwiLFxuICBkYXJrc2FsbW9uOiBcIiNFOTk2N0FcIixcbiAgdmlvbGV0OiBcIiNFRTgyRUVcIixcbiAgcGFsZWdvbGRlbnJvZDogXCIjRUVFOEFBXCIsXG4gIGxpZ2h0Y29yYWw6IFwiI0YwODA4MFwiLFxuICBraGFraTogXCIjRjBFNjhDXCIsXG4gIGFsaWNlYmx1ZTogXCIjRjBGOEZGXCIsXG4gIGhvbmV5ZGV3OiBcIiNGMEZGRjBcIixcbiAgYXp1cmU6IFwiI0YwRkZGRlwiLFxuICBzYW5keWJyb3duOiBcIiNGNEE0NjBcIixcbiAgd2hlYXQ6IFwiI0Y1REVCM1wiLFxuICBiZWlnZTogXCIjRjVGNURDXCIsXG4gIHdoaXRlc21va2U6IFwiI0Y1RjVGNVwiLFxuICBtaW50Y3JlYW06IFwiI0Y1RkZGQVwiLFxuICBnaG9zdHdoaXRlOiBcIiNGOEY4RkZcIixcbiAgc2FsbW9uOiBcIiNGQTgwNzJcIixcbiAgYW50aXF1ZXdoaXRlOiBcIiNGQUVCRDdcIixcbiAgbGluZW46IFwiI0ZBRjBFNlwiLFxuICBsaWdodGdvbGRlbnJvZHllbGxvdzogXCIjRkFGQUQyXCIsXG4gIG9sZGxhY2U6IFwiI0ZERjVFNlwiLFxuICByZWQ6IFwiI0ZGMDAwMFwiLFxuICBmdWNoc2lhOiBcIiNGRjAwRkZcIixcbiAgbWFnZW50YTogXCIjRkYwMEZGXCIsXG4gIGRlZXBwaW5rOiBcIiNGRjE0OTNcIixcbiAgb3JhbmdlcmVkOiBcIiNGRjQ1MDBcIixcbiAgdG9tYXRvOiBcIiNGRjYzNDdcIixcbiAgaG90cGluazogXCIjRkY2OUI0XCIsXG4gIGNvcmFsOiBcIiNGRjdGNTBcIixcbiAgZGFya29yYW5nZTogXCIjRkY4QzAwXCIsXG4gIGxpZ2h0c2FsbW9uOiBcIiNGRkEwN0FcIixcbiAgb3JhbmdlOiBcIiNGRkE1MDBcIixcbiAgbGlnaHRwaW5rOiBcIiNGRkI2QzFcIixcbiAgcGluazogXCIjRkZDMENCXCIsXG4gIGdvbGQ6IFwiI0ZGRDcwMFwiLFxuICBwZWFjaHB1ZmY6IFwiI0ZGREFCOVwiLFxuICBuYXZham93aGl0ZTogXCIjRkZERUFEXCIsXG4gIG1vY2Nhc2luOiBcIiNGRkU0QjVcIixcbiAgYmlzcXVlOiBcIiNGRkU0QzRcIixcbiAgbWlzdHlyb3NlOiBcIiNGRkU0RTFcIixcbiAgYmxhbmNoZWRhbG1vbmQ6IFwiI0ZGRUJDRFwiLFxuICBwYXBheWF3aGlwOiBcIiNGRkVGRDVcIixcbiAgbGF2ZW5kZXJibHVzaDogXCIjRkZGMEY1XCIsXG4gIHNlYXNoZWxsOiBcIiNGRkY1RUVcIixcbiAgY29ybnNpbGs6IFwiI0ZGRjhEQ1wiLFxuICBsZW1vbmNoaWZmb246IFwiI0ZGRkFDRFwiLFxuICBmbG9yYWx3aGl0ZTogXCIjRkZGQUYwXCIsXG4gIHNub3c6IFwiI0ZGRkFGQVwiLFxuICB5ZWxsb3c6IFwiI0ZGRkYwMFwiLFxuICBsaWdodHllbGxvdzogXCIjRkZGRkUwXCIsXG4gIGl2b3J5OiBcIiNGRkZGRjBcIixcbiAgd2hpdGU6IFwiI0ZGRkZGRlwiLFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gW3BpeGVsUmF0aW89MV1cbiAqL1xuY2xhc3MgQ29sb3JQaWNrZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtwaXhlbFJhdGlvPTFdXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwaXhlbFJhdGlvID0gMSkge1xuICAgIHRoaXMucGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG4gICAgdGhpcy5nZW5lcmF0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNlbnRlckNvb3JkaW5hdGVzID0geyB4OiAyODkgLyAyLCB5OiAyODkgLyAyIH07XG4gICAgdGhpcy5yID0gMjg5ICogMC40OTtcbiAgICB0aGlzLmNvbG9yID0geyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhOiAxLjAgfTtcbiAgICB0aGlzLmh1ZUNpcmNsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluaXRpYWxDb2xvciA9IHsgcjogMjU1LCBnOiAyNTUsIGI6IDI1NSwgYTogMS4wIH07XG4gICAgdGhpcy5wcmV2aW91c0NvbG9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbGllZCA9IGZhbHNlO1xuXG4gICAgLy8gYm91bmQgYnlcbiAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gKCkgPT4ge307XG4gICAgdGhpcy5jbG9zZUNhbGxiYWNrID0gKCkgPT4ge307XG5cbiAgICAvLyBjcmVhdGUgYWxsIERPTSBlbGVtZW50c1xuICAgIHRoaXMuX2NyZWF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgaW5zZXJ0cyB0aGUgY29sb3JQaWNrZXIgaW50byBhIGRpdiBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXJcbiAgICovXG4gIGluc2VydFRvKGNvbnRhaW5lcikge1xuICAgIGlmICh0aGlzLmhhbW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhhbW1lci5kZXN0cm95KCk7XG4gICAgICB0aGlzLmhhbW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSk7XG4gICAgdGhpcy5fYmluZEhhbW1lcigpO1xuXG4gICAgdGhpcy5fc2V0U2l6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBvbiBhcHBseSBhbmQgc2F2ZS4gQmluZCBpdCB0byB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNldFVwZGF0ZUNhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIHVwZGF0ZSBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi5cIlxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdGhlIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIG9uIGFwcGx5IGFuZCBzYXZlLiBCaW5kIGl0IHRvIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgc2V0Q2xvc2VDYWxsYmFjayhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5jbG9zZUNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIGNsb3NpbmcgY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24uXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzQ29sb3JTdHJpbmcoY29sb3IpIHtcbiAgICBpZiAodHlwZW9mIGNvbG9yID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gaHRtbENvbG9yc1tjb2xvcl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY29sb3Igb2YgdGhlIGNvbG9yUGlja2VyXG4gICAqIFN1cHBvcnRlZCBmb3JtYXRzOlxuICAgKiAncmVkJyAgICAgICAgICAgICAgICAgICAtLT4gSFRNTCBjb2xvciBzdHJpbmdcbiAgICogJyNmZmZmZmYnICAgICAgICAgICAgICAgLS0+IGhleCBzdHJpbmdcbiAgICogJ3JnYigyNTUsMjU1LDI1NSknICAgICAgLS0+IHJnYiBzdHJpbmdcbiAgICogJ3JnYmEoMjU1LDI1NSwyNTUsMS4wKScgLS0+IHJnYmEgc3RyaW5nXG4gICAqIHtyOjI1NSxnOjI1NSxiOjI1NX0gICAgIC0tPiByZ2Igb2JqZWN0XG4gICAqIHtyOjI1NSxnOjI1NSxiOjI1NSxhOjEuMH0gLS0+IHJnYmEgb2JqZWN0XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBjb2xvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXRJbml0aWFsPXRydWVdXG4gICAqL1xuICBzZXRDb2xvcihjb2xvciwgc2V0SW5pdGlhbCA9IHRydWUpIHtcbiAgICBpZiAoY29sb3IgPT09IFwibm9uZVwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJnYmE7XG5cbiAgICAvLyBpZiBhIGh0bWwgY29sb3Igc2hvcnRoYW5kIGlzIHVzZWQsIGNvbnZlcnQgdG8gaGV4XG4gICAgY29uc3QgaHRtbENvbG9yID0gdGhpcy5faXNDb2xvclN0cmluZyhjb2xvcik7XG4gICAgaWYgKGh0bWxDb2xvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb2xvciA9IGh0bWxDb2xvcjtcbiAgICB9XG5cbiAgICAvLyBjaGVjayBmb3JtYXRcbiAgICBpZiAoaXNTdHJpbmcoY29sb3IpID09PSB0cnVlKSB7XG4gICAgICBpZiAoaXNWYWxpZFJHQihjb2xvcikgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgcmdiYUFycmF5ID0gY29sb3JcbiAgICAgICAgICAuc3Vic3RyKDQpXG4gICAgICAgICAgLnN1YnN0cigwLCBjb2xvci5sZW5ndGggLSA1KVxuICAgICAgICAgIC5zcGxpdChcIixcIik7XG4gICAgICAgIHJnYmEgPSB7IHI6IHJnYmFBcnJheVswXSwgZzogcmdiYUFycmF5WzFdLCBiOiByZ2JhQXJyYXlbMl0sIGE6IDEuMCB9O1xuICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkUkdCQShjb2xvcikgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgcmdiYUFycmF5ID0gY29sb3JcbiAgICAgICAgICAuc3Vic3RyKDUpXG4gICAgICAgICAgLnN1YnN0cigwLCBjb2xvci5sZW5ndGggLSA2KVxuICAgICAgICAgIC5zcGxpdChcIixcIik7XG4gICAgICAgIHJnYmEgPSB7XG4gICAgICAgICAgcjogcmdiYUFycmF5WzBdLFxuICAgICAgICAgIGc6IHJnYmFBcnJheVsxXSxcbiAgICAgICAgICBiOiByZ2JhQXJyYXlbMl0sXG4gICAgICAgICAgYTogcmdiYUFycmF5WzNdLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChpc1ZhbGlkSGV4KGNvbG9yKSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb25zdCByZ2JPYmogPSBoZXhUb1JHQihjb2xvcik7XG4gICAgICAgIHJnYmEgPSB7IHI6IHJnYk9iai5yLCBnOiByZ2JPYmouZywgYjogcmdiT2JqLmIsIGE6IDEuMCB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbG9yLnIgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGNvbG9yLmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGNvbG9yLmIgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBhbHBoYSA9IGNvbG9yLmEgIT09IHVuZGVmaW5lZCA/IGNvbG9yLmEgOiBcIjEuMFwiO1xuICAgICAgICAgIHJnYmEgPSB7IHI6IGNvbG9yLnIsIGc6IGNvbG9yLmcsIGI6IGNvbG9yLmIsIGE6IGFscGhhIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZXQgY29sb3JcbiAgICBpZiAocmdiYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVW5rbm93biBjb2xvciBwYXNzZWQgdG8gdGhlIGNvbG9yUGlja2VyLiBTdXBwb3J0ZWQgYXJlIHN0cmluZ3M6IHJnYiwgaGV4LCByZ2JhLiBPYmplY3Q6IHJnYiAoe3I6cixnOmcsYjpiLFthOmFdfSkuIFN1cHBsaWVkOiBcIiArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29sb3IpXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXRDb2xvcihyZ2JhLCBzZXRJbml0aWFsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdGhpcyBzaG93cyB0aGUgY29sb3IgcGlja2VyLlxuICAgKiBUaGUgaHVlIGNpcmNsZSBpcyBjb25zdHJ1Y3RlZCBvbmNlIGFuZCBzdG9yZWQuXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICh0aGlzLmNsb3NlQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jbG9zZUNhbGxiYWNrKCk7XG4gICAgICB0aGlzLmNsb3NlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5hcHBsaWVkID0gZmFsc2U7XG4gICAgdGhpcy5mcmFtZS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgIHRoaXMuX2dlbmVyYXRlSHVlQ2lyY2xlKCk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBwaWNrZXIuIElzIGNhbGxlZCBieSB0aGUgY2FuY2VsIGJ1dHRvbi5cbiAgICogT3B0aW9uYWwgYm9vbGVhbiB0byBzdG9yZSB0aGUgcHJldmlvdXMgY29sb3IgZm9yIGVhc3kgYWNjZXNzIGxhdGVyIG9uLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzdG9yZVByZXZpb3VzPXRydWVdXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGlkZShzdG9yZVByZXZpb3VzID0gdHJ1ZSkge1xuICAgIC8vIHN0b3JlIHRoZSBwcmV2aW91cyBjb2xvciBmb3IgbmV4dCB0aW1lO1xuICAgIGlmIChzdG9yZVByZXZpb3VzID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnByZXZpb3VzQ29sb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbG9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHBsaWVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuaW5pdGlhbENvbG9yKTtcbiAgICB9XG5cbiAgICB0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgIC8vIGNhbGwgdGhlIGNsb3NpbmcgY2FsbGJhY2ssIHJlc3RvcmluZyB0aGUgb25jbGljayBtZXRob2QuXG4gICAgLy8gdGhpcyBpcyBpbiBhIHNldFRpbWVvdXQgYmVjYXVzZSBpdCB3aWxsIHRyaWdnZXIgdGhlIHNob3cgYWdhaW4gYmVmb3JlIHRoZSBjbGljayBpcyBkb25lLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2xvc2VDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2xvc2VDYWxsYmFjaygpO1xuICAgICAgICB0aGlzLmNsb3NlQ2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogYm91bmQgdG8gdGhlIHNhdmUgYnV0dG9uLiBTYXZlcyBhbmQgaGlkZXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2F2ZSgpIHtcbiAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuY29sb3IpO1xuICAgIHRoaXMuYXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMuX2hpZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb3VuZCB0byBhcHBseSBidXR0b24uIFNhdmVzIGJ1dCBkb2VzIG5vdCBjbG9zZS4gSXMgdW5kb25lIGJ5IHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FwcGx5KCkge1xuICAgIHRoaXMuYXBwbGllZCA9IHRydWU7XG4gICAgdGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmNvbG9yKTtcbiAgICB0aGlzLl91cGRhdGVQaWNrZXIodGhpcy5jb2xvcik7XG4gIH1cblxuICAvKipcbiAgICogbG9hZCB0aGUgY29sb3IgZnJvbSB0aGUgcHJldmlvdXMgc2Vzc2lvbi5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9sb2FkTGFzdCgpIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c0NvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0Q29sb3IodGhpcy5wcmV2aW91c0NvbG9yLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFsZXJ0KFwiVGhlcmUgaXMgbm8gbGFzdCBjb2xvciB0byBsb2FkLi4uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBzZXQgdGhlIGNvbG9yLCBwbGFjZSB0aGUgcGlja2VyXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByZ2JhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NldEluaXRpYWw9dHJ1ZV1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRDb2xvcihyZ2JhLCBzZXRJbml0aWFsID0gdHJ1ZSkge1xuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIGNvbG9yXG4gICAgaWYgKHNldEluaXRpYWwgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuaW5pdGlhbENvbG9yID0gT2JqZWN0LmFzc2lnbih7fSwgcmdiYSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb2xvciA9IHJnYmE7XG4gICAgY29uc3QgaHN2ID0gUkdCVG9IU1YocmdiYS5yLCByZ2JhLmcsIHJnYmEuYik7XG5cbiAgICBjb25zdCBhbmdsZUNvbnZlcnQgPSAyICogTWF0aC5QSTtcbiAgICBjb25zdCByYWRpdXMgPSB0aGlzLnIgKiBoc3YucztcbiAgICBjb25zdCB4ID1cbiAgICAgIHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCArIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlQ29udmVydCAqIGhzdi5oKTtcbiAgICBjb25zdCB5ID1cbiAgICAgIHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSArIHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlQ29udmVydCAqIGhzdi5oKTtcblxuICAgIHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0ID1cbiAgICAgIHggLSAwLjUgKiB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50V2lkdGggKyBcInB4XCI7XG4gICAgdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLnRvcCA9XG4gICAgICB5IC0gMC41ICogdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCArIFwicHhcIjtcblxuICAgIHRoaXMuX3VwZGF0ZVBpY2tlcihyZ2JhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBib3VuZCB0byBvcGFjaXR5IGNvbnRyb2xcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0T3BhY2l0eSh2YWx1ZSkge1xuICAgIHRoaXMuY29sb3IuYSA9IHZhbHVlIC8gMTAwO1xuICAgIHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBib3VuZCB0byBicmlnaHRuZXNzIGNvbnRyb2xcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0QnJpZ2h0bmVzcyh2YWx1ZSkge1xuICAgIGNvbnN0IGhzdiA9IFJHQlRvSFNWKHRoaXMuY29sb3IuciwgdGhpcy5jb2xvci5nLCB0aGlzLmNvbG9yLmIpO1xuICAgIGhzdi52ID0gdmFsdWUgLyAxMDA7XG4gICAgY29uc3QgcmdiYSA9IEhTVlRvUkdCKGhzdi5oLCBoc3YucywgaHN2LnYpO1xuICAgIHJnYmFbXCJhXCJdID0gdGhpcy5jb2xvci5hO1xuICAgIHRoaXMuY29sb3IgPSByZ2JhO1xuICAgIHRoaXMuX3VwZGF0ZVBpY2tlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSB0aGUgY29sb3IgcGlja2VyLiBBIGJsYWNrIGNpcmNsZSBvdmVybGF5cyB0aGUgaHVlIGNpcmNsZSB0byBtaW1pYyB0aGUgYnJpZ2h0bmVzcyBkZWNyZWFzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcmdiYVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVBpY2tlcihyZ2JhID0gdGhpcy5jb2xvcikge1xuICAgIGNvbnN0IGhzdiA9IFJHQlRvSFNWKHJnYmEuciwgcmdiYS5nLCByZ2JhLmIpO1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgIGlmICh0aGlzLnBpeGVsUmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucGl4ZWxSYXRpbyA9XG4gICAgICAgICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvXG4gICAgICAgIChjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgICAgIGN0eC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgY3R4Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgICAgIGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgICAgIGN0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgMSk7XG4gICAgfVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLCAwLCAwLCB0aGlzLnBpeGVsUmF0aW8sIDAsIDApO1xuXG4gICAgLy8gY2xlYXIgdGhlIGNhbnZhc1xuICAgIGNvbnN0IHcgPSB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IGggPSB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG4gICAgY3R4LnB1dEltYWdlRGF0YSh0aGlzLmh1ZUNpcmNsZSwgMCwgMCk7XG4gICAgY3R4LmZpbGxTdHlsZSA9IFwicmdiYSgwLDAsMCxcIiArICgxIC0gaHN2LnYpICsgXCIpXCI7XG4gICAgY3R4LmNpcmNsZSh0aGlzLmNlbnRlckNvb3JkaW5hdGVzLngsIHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSwgdGhpcy5yKTtcbiAgICBjdHguZmlsbCgpO1xuXG4gICAgdGhpcy5icmlnaHRuZXNzUmFuZ2UudmFsdWUgPSAxMDAgKiBoc3YudjtcbiAgICB0aGlzLm9wYWNpdHlSYW5nZS52YWx1ZSA9IDEwMCAqIHJnYmEuYTtcblxuICAgIHRoaXMuaW5pdGlhbENvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICBcInJnYmEoXCIgK1xuICAgICAgdGhpcy5pbml0aWFsQ29sb3IuciArXG4gICAgICBcIixcIiArXG4gICAgICB0aGlzLmluaXRpYWxDb2xvci5nICtcbiAgICAgIFwiLFwiICtcbiAgICAgIHRoaXMuaW5pdGlhbENvbG9yLmIgK1xuICAgICAgXCIsXCIgK1xuICAgICAgdGhpcy5pbml0aWFsQ29sb3IuYSArXG4gICAgICBcIilcIjtcbiAgICB0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICBcInJnYmEoXCIgK1xuICAgICAgdGhpcy5jb2xvci5yICtcbiAgICAgIFwiLFwiICtcbiAgICAgIHRoaXMuY29sb3IuZyArXG4gICAgICBcIixcIiArXG4gICAgICB0aGlzLmNvbG9yLmIgK1xuICAgICAgXCIsXCIgK1xuICAgICAgdGhpcy5jb2xvci5hICtcbiAgICAgIFwiKVwiO1xuICB9XG5cbiAgLyoqXG4gICAqIHVzZWQgYnkgY3JlYXRlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FudmFzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldFNpemUoKSB7XG4gICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcy5zdHlsZS53aWR0aCA9IFwiMTAwJVwiO1xuICAgIHRoaXMuY29sb3JQaWNrZXJDYW52YXMuc3R5bGUuaGVpZ2h0ID0gXCIxMDAlXCI7XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLndpZHRoID0gMjg5ICogdGhpcy5waXhlbFJhdGlvO1xuICAgIHRoaXMuY29sb3JQaWNrZXJDYW52YXMuaGVpZ2h0ID0gMjg5ICogdGhpcy5waXhlbFJhdGlvO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBhbGwgZG9tIGVsZW1lbnRzXG4gICAqIFRPRE86IGNsZWFudXAsIGxvdHMgb2Ygc2ltaWxhciBkb20gZWxlbWVudHNcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGUoKSB7XG4gICAgdGhpcy5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5mcmFtZS5jbGFzc05hbWUgPSBcInZpcy1jb2xvci1waWNrZXJcIjtcblxuICAgIHRoaXMuY29sb3JQaWNrZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuY29sb3JQaWNrZXJTZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsYXNzTmFtZSA9IFwidmlzLXNlbGVjdG9yXCI7XG4gICAgdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IpO1xuXG4gICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyQ2FudmFzKTtcblxuICAgIGlmICghdGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KSB7XG4gICAgICBjb25zdCBub0NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIik7XG4gICAgICBub0NhbnZhcy5zdHlsZS5jb2xvciA9IFwicmVkXCI7XG4gICAgICBub0NhbnZhcy5zdHlsZS5mb250V2VpZ2h0ID0gXCJib2xkXCI7XG4gICAgICBub0NhbnZhcy5zdHlsZS5wYWRkaW5nID0gXCIxMHB4XCI7XG4gICAgICBub0NhbnZhcy5pbm5lclRleHQgPSBcIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiO1xuICAgICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcy5hcHBlbmRDaGlsZChub0NhbnZhcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGN0eCA9IHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICAgICAgdGhpcy5waXhlbFJhdGlvID1cbiAgICAgICAgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIC9cbiAgICAgICAgKGN0eC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgY3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgY3R4Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgY3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAxKTtcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJDYW52YXNcbiAgICAgICAgLmdldENvbnRleHQoXCIyZFwiKVxuICAgICAgICAuc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywgMCwgMCwgdGhpcy5waXhlbFJhdGlvLCAwLCAwKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyRGl2LmNsYXNzTmFtZSA9IFwidmlzLWNvbG9yXCI7XG5cbiAgICB0aGlzLm9wYWNpdHlEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMub3BhY2l0eURpdi5jbGFzc05hbWUgPSBcInZpcy1vcGFjaXR5XCI7XG5cbiAgICB0aGlzLmJyaWdodG5lc3NEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuYnJpZ2h0bmVzc0Rpdi5jbGFzc05hbWUgPSBcInZpcy1icmlnaHRuZXNzXCI7XG5cbiAgICB0aGlzLmFycm93RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmFycm93RGl2LmNsYXNzTmFtZSA9IFwidmlzLWFycm93XCI7XG5cbiAgICB0aGlzLm9wYWNpdHlSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5vcGFjaXR5UmFuZ2UudHlwZSA9IFwicmFuZ2VcIjsgLy8gTm90IHN1cHBvcnRlZCBvbiBJRTlcbiAgICAgIHRoaXMub3BhY2l0eVJhbmdlLm1pbiA9IFwiMFwiO1xuICAgICAgdGhpcy5vcGFjaXR5UmFuZ2UubWF4ID0gXCIxMDBcIjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFRPRE86IEFkZCBzb21lIGVycm9yIGhhbmRsaW5nLlxuICAgIH1cbiAgICB0aGlzLm9wYWNpdHlSYW5nZS52YWx1ZSA9IFwiMTAwXCI7XG4gICAgdGhpcy5vcGFjaXR5UmFuZ2UuY2xhc3NOYW1lID0gXCJ2aXMtcmFuZ2VcIjtcblxuICAgIHRoaXMuYnJpZ2h0bmVzc1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS50eXBlID0gXCJyYW5nZVwiOyAvLyBOb3Qgc3VwcG9ydGVkIG9uIElFOVxuICAgICAgdGhpcy5icmlnaHRuZXNzUmFuZ2UubWluID0gXCIwXCI7XG4gICAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5tYXggPSBcIjEwMFwiO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETzogQWRkIHNvbWUgZXJyb3IgaGFuZGxpbmcuXG4gICAgfVxuICAgIHRoaXMuYnJpZ2h0bmVzc1JhbmdlLnZhbHVlID0gXCIxMDBcIjtcbiAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5jbGFzc05hbWUgPSBcInZpcy1yYW5nZVwiO1xuXG4gICAgdGhpcy5vcGFjaXR5RGl2LmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eVJhbmdlKTtcbiAgICB0aGlzLmJyaWdodG5lc3NEaXYuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzUmFuZ2UpO1xuXG4gICAgY29uc3QgbWUgPSB0aGlzO1xuICAgIHRoaXMub3BhY2l0eVJhbmdlLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuX3NldE9wYWNpdHkodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLm9wYWNpdHlSYW5nZS5vbmlucHV0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuX3NldE9wYWNpdHkodGhpcy52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1lLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy5icmlnaHRuZXNzUmFuZ2Uub25pbnB1dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1lLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpO1xuICAgIH07XG5cbiAgICB0aGlzLmJyaWdodG5lc3NMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5icmlnaHRuZXNzTGFiZWwuY2xhc3NOYW1lID0gXCJ2aXMtbGFiZWwgdmlzLWJyaWdodG5lc3NcIjtcbiAgICB0aGlzLmJyaWdodG5lc3NMYWJlbC5pbm5lclRleHQgPSBcImJyaWdodG5lc3M6XCI7XG5cbiAgICB0aGlzLm9wYWNpdHlMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5vcGFjaXR5TGFiZWwuY2xhc3NOYW1lID0gXCJ2aXMtbGFiZWwgdmlzLW9wYWNpdHlcIjtcbiAgICB0aGlzLm9wYWNpdHlMYWJlbC5pbm5lclRleHQgPSBcIm9wYWNpdHk6XCI7XG5cbiAgICB0aGlzLm5ld0NvbG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLm5ld0NvbG9yRGl2LmNsYXNzTmFtZSA9IFwidmlzLW5ldy1jb2xvclwiO1xuICAgIHRoaXMubmV3Q29sb3JEaXYuaW5uZXJUZXh0ID0gXCJuZXdcIjtcblxuICAgIHRoaXMuaW5pdGlhbENvbG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmluaXRpYWxDb2xvckRpdi5jbGFzc05hbWUgPSBcInZpcy1pbml0aWFsLWNvbG9yXCI7XG4gICAgdGhpcy5pbml0aWFsQ29sb3JEaXYuaW5uZXJUZXh0ID0gXCJpbml0aWFsXCI7XG5cbiAgICB0aGlzLmNhbmNlbEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5jYW5jZWxCdXR0b24uY2xhc3NOYW1lID0gXCJ2aXMtYnV0dG9uIHZpcy1jYW5jZWxcIjtcbiAgICB0aGlzLmNhbmNlbEJ1dHRvbi5pbm5lclRleHQgPSBcImNhbmNlbFwiO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uLm9uY2xpY2sgPSB0aGlzLl9oaWRlLmJpbmQodGhpcywgZmFsc2UpO1xuXG4gICAgdGhpcy5hcHBseUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5hcHBseUJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1idXR0b24gdmlzLWFwcGx5XCI7XG4gICAgdGhpcy5hcHBseUJ1dHRvbi5pbm5lclRleHQgPSBcImFwcGx5XCI7XG4gICAgdGhpcy5hcHBseUJ1dHRvbi5vbmNsaWNrID0gdGhpcy5fYXBwbHkuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuc2F2ZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5zYXZlQnV0dG9uLmNsYXNzTmFtZSA9IFwidmlzLWJ1dHRvbiB2aXMtc2F2ZVwiO1xuICAgIHRoaXMuc2F2ZUJ1dHRvbi5pbm5lclRleHQgPSBcInNhdmVcIjtcbiAgICB0aGlzLnNhdmVCdXR0b24ub25jbGljayA9IHRoaXMuX3NhdmUuYmluZCh0aGlzKTtcblxuICAgIHRoaXMubG9hZEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5sb2FkQnV0dG9uLmNsYXNzTmFtZSA9IFwidmlzLWJ1dHRvbiB2aXMtbG9hZFwiO1xuICAgIHRoaXMubG9hZEJ1dHRvbi5pbm5lclRleHQgPSBcImxvYWQgbGFzdFwiO1xuICAgIHRoaXMubG9hZEJ1dHRvbi5vbmNsaWNrID0gdGhpcy5fbG9hZExhc3QuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckRpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFycm93RGl2KTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0xhYmVsKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0Rpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlMYWJlbCk7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlEaXYpO1xuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uZXdDb2xvckRpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmluaXRpYWxDb2xvckRpdik7XG5cbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuY2FuY2VsQnV0dG9uKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXBwbHlCdXR0b24pO1xuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zYXZlQnV0dG9uKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubG9hZEJ1dHRvbik7XG4gIH1cblxuICAvKipcbiAgICogYmluZCBoYW1tZXIgdG8gdGhlIGNvbG9yIHBpY2tlclxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2JpbmRIYW1tZXIoKSB7XG4gICAgdGhpcy5kcmFnID0ge307XG4gICAgdGhpcy5waW5jaCA9IHt9O1xuICAgIHRoaXMuaGFtbWVyID0gbmV3IEhhbW1lcih0aGlzLmNvbG9yUGlja2VyQ2FudmFzKTtcbiAgICB0aGlzLmhhbW1lci5nZXQoXCJwaW5jaFwiKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7XG5cbiAgICB0aGlzLmhhbW1lci5vbihcImhhbW1lci5pbnB1dFwiLCAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChldmVudC5pc0ZpcnN0KSB7XG4gICAgICAgIHRoaXMuX21vdmVTZWxlY3RvcihldmVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5oYW1tZXIub24oXCJ0YXBcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9tb3ZlU2VsZWN0b3IoZXZlbnQpO1xuICAgIH0pO1xuICAgIHRoaXMuaGFtbWVyLm9uKFwicGFuc3RhcnRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9tb3ZlU2VsZWN0b3IoZXZlbnQpO1xuICAgIH0pO1xuICAgIHRoaXMuaGFtbWVyLm9uKFwicGFubW92ZVwiLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX21vdmVTZWxlY3RvcihldmVudCk7XG4gICAgfSk7XG4gICAgdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl9tb3ZlU2VsZWN0b3IoZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlIHRoZSBodWUgY2lyY2xlLiBUaGlzIGlzIHJlbGF0aXZlbHkgaGVhdnkgKDIwMG1zKSBhbmQgaXMgZG9uZSBvbmx5IG9uY2Ugb24gdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2VuZXJhdGVIdWVDaXJjbGUoKSB7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkID09PSBmYWxzZSkge1xuICAgICAgY29uc3QgY3R4ID0gdGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBpZiAodGhpcy5waXhlbFJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucGl4ZWxSYXRpbyA9XG4gICAgICAgICAgKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIC9cbiAgICAgICAgICAoY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAgIGN0eC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgICBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgICBjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgICAgIGN0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgICAgICAxKTtcbiAgICAgIH1cbiAgICAgIGN0eC5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLCAwLCAwLCB0aGlzLnBpeGVsUmF0aW8sIDAsIDApO1xuXG4gICAgICAvLyBjbGVhciB0aGUgY2FudmFzXG4gICAgICBjb25zdCB3ID0gdGhpcy5jb2xvclBpY2tlckNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgIGNvbnN0IGggPSB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdywgaCk7XG5cbiAgICAgIC8vIGRyYXcgaHVlIGNpcmNsZVxuICAgICAgbGV0IHgsIHksIGh1ZSwgc2F0O1xuICAgICAgdGhpcy5jZW50ZXJDb29yZGluYXRlcyA9IHsgeDogdyAqIDAuNSwgeTogaCAqIDAuNSB9O1xuICAgICAgdGhpcy5yID0gMC40OSAqIHc7XG4gICAgICBjb25zdCBhbmdsZUNvbnZlcnQgPSAoMiAqIE1hdGguUEkpIC8gMzYwO1xuICAgICAgY29uc3QgaGZhYyA9IDEgLyAzNjA7XG4gICAgICBjb25zdCBzZmFjID0gMSAvIHRoaXMucjtcbiAgICAgIGxldCByZ2I7XG4gICAgICBmb3IgKGh1ZSA9IDA7IGh1ZSA8IDM2MDsgaHVlKyspIHtcbiAgICAgICAgZm9yIChzYXQgPSAwOyBzYXQgPCB0aGlzLnI7IHNhdCsrKSB7XG4gICAgICAgICAgeCA9IHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCArIHNhdCAqIE1hdGguc2luKGFuZ2xlQ29udmVydCAqIGh1ZSk7XG4gICAgICAgICAgeSA9IHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSArIHNhdCAqIE1hdGguY29zKGFuZ2xlQ29udmVydCAqIGh1ZSk7XG4gICAgICAgICAgcmdiID0gSFNWVG9SR0IoaHVlICogaGZhYywgc2F0ICogc2ZhYywgMSk7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9IFwicmdiKFwiICsgcmdiLnIgKyBcIixcIiArIHJnYi5nICsgXCIsXCIgKyByZ2IuYiArIFwiKVwiO1xuICAgICAgICAgIGN0eC5maWxsUmVjdCh4IC0gMC41LCB5IC0gMC41LCAyLCAyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY3R4LnN0cm9rZVN0eWxlID0gXCJyZ2JhKDAsMCwwLDEpXCI7XG4gICAgICBjdHguY2lyY2xlKHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCwgdGhpcy5jZW50ZXJDb29yZGluYXRlcy55LCB0aGlzLnIpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuXG4gICAgICB0aGlzLmh1ZUNpcmNsZSA9IGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdywgaCk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBtb3ZlIHRoZSBzZWxlY3Rvci4gVGhpcyBpcyBjYWxsZWQgYnkgaGFtbWVyIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudH0gIGV2ZW50ICAgVGhlIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbW92ZVNlbGVjdG9yKGV2ZW50KSB7XG4gICAgY29uc3QgcmVjdCA9IHRoaXMuY29sb3JQaWNrZXJEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgbGVmdCA9IGV2ZW50LmNlbnRlci54IC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHRvcCA9IGV2ZW50LmNlbnRlci55IC0gcmVjdC50b3A7XG5cbiAgICBjb25zdCBjZW50ZXJZID0gMC41ICogdGhpcy5jb2xvclBpY2tlckRpdi5jbGllbnRIZWlnaHQ7XG4gICAgY29uc3QgY2VudGVyWCA9IDAuNSAqIHRoaXMuY29sb3JQaWNrZXJEaXYuY2xpZW50V2lkdGg7XG5cbiAgICBjb25zdCB4ID0gbGVmdCAtIGNlbnRlclg7XG4gICAgY29uc3QgeSA9IHRvcCAtIGNlbnRlclk7XG5cbiAgICBjb25zdCBhbmdsZSA9IE1hdGguYXRhbjIoeCwgeSk7XG4gICAgY29uc3QgcmFkaXVzID0gMC45OCAqIE1hdGgubWluKE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwgY2VudGVyWCk7XG5cbiAgICBjb25zdCBuZXdUb3AgPSBNYXRoLmNvcyhhbmdsZSkgKiByYWRpdXMgKyBjZW50ZXJZO1xuICAgIGNvbnN0IG5ld0xlZnQgPSBNYXRoLnNpbihhbmdsZSkgKiByYWRpdXMgKyBjZW50ZXJYO1xuXG4gICAgdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLnRvcCA9XG4gICAgICBuZXdUb3AgLSAwLjUgKiB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgIHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0ID1cbiAgICAgIG5ld0xlZnQgLSAwLjUgKiB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50V2lkdGggKyBcInB4XCI7XG5cbiAgICAvLyBzZXQgY29sb3JcbiAgICBsZXQgaCA9IGFuZ2xlIC8gKDIgKiBNYXRoLlBJKTtcbiAgICBoID0gaCA8IDAgPyBoICsgMSA6IGg7XG4gICAgY29uc3QgcyA9IHJhZGl1cyAvIHRoaXMucjtcbiAgICBjb25zdCBoc3YgPSBSR0JUb0hTVih0aGlzLmNvbG9yLnIsIHRoaXMuY29sb3IuZywgdGhpcy5jb2xvci5iKTtcbiAgICBoc3YuaCA9IGg7XG4gICAgaHN2LnMgPSBzO1xuICAgIGNvbnN0IHJnYmEgPSBIU1ZUb1JHQihoc3YuaCwgaHN2LnMsIGhzdi52KTtcbiAgICByZ2JhW1wiYVwiXSA9IHRoaXMuY29sb3IuYTtcbiAgICB0aGlzLmNvbG9yID0gcmdiYTtcblxuICAgIC8vIHVwZGF0ZSBwcmV2aWV3c1xuICAgIHRoaXMuaW5pdGlhbENvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICBcInJnYmEoXCIgK1xuICAgICAgdGhpcy5pbml0aWFsQ29sb3IuciArXG4gICAgICBcIixcIiArXG4gICAgICB0aGlzLmluaXRpYWxDb2xvci5nICtcbiAgICAgIFwiLFwiICtcbiAgICAgIHRoaXMuaW5pdGlhbENvbG9yLmIgK1xuICAgICAgXCIsXCIgK1xuICAgICAgdGhpcy5pbml0aWFsQ29sb3IuYSArXG4gICAgICBcIilcIjtcbiAgICB0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICBcInJnYmEoXCIgK1xuICAgICAgdGhpcy5jb2xvci5yICtcbiAgICAgIFwiLFwiICtcbiAgICAgIHRoaXMuY29sb3IuZyArXG4gICAgICBcIixcIiArXG4gICAgICB0aGlzLmNvbG9yLmIgK1xuICAgICAgXCIsXCIgK1xuICAgICAgdGhpcy5jb2xvci5hICtcbiAgICAgIFwiKVwiO1xuICB9XG59XG5cbi8qKlxuICogV3JhcCBnaXZlbiB0ZXh0IChsYXN0IGFyZ3VtZW50KSBpbiBIVE1MIGVsZW1lbnRzIChhbGwgcHJlY2VkaW5nIGFyZ3VtZW50cykuXG4gKlxuICogQHBhcmFtIHsuLi5hbnl9IHJlc3QgLSBMaXN0IG9mIHRhZyBuYW1lcyBmb2xsb3dlZCBieSBpbm5lciB0ZXh0LlxuICpcbiAqIEByZXR1cm5zIEFuIGVsZW1lbnQgb3IgYSB0ZXh0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIHdyYXBJblRhZyguLi5yZXN0KSB7XG4gIGlmIChyZXN0Lmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudHMuXCIpO1xuICB9IGVsc2UgaWYgKHJlc3QubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJlc3RbMF0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHJlc3RbMF0pO1xuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQod3JhcEluVGFnKC4uLnJlc3Quc2xpY2UoMSkpKTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxufVxuXG4vKipcbiAqIFRoZSB3YXkgdGhpcyB3b3JrcyBpcyBmb3IgYWxsIHByb3BlcnRpZXMgb2YgdGhpcy5wb3NzaWJsZSBvcHRpb25zLCB5b3UgY2FuIHN1cHBseSB0aGUgcHJvcGVydHkgbmFtZSBpbiBhbnkgZm9ybSB0byBsaXN0IHRoZSBvcHRpb25zLlxuICogQm9vbGVhbiBvcHRpb25zIGFyZSByZWNvZ25pc2VkIGFzIEJvb2xlYW5cbiAqIE51bWJlciBvcHRpb25zIHNob3VsZCBiZSB3cml0dGVuIGFzIGFycmF5OiBbZGVmYXVsdCB2YWx1ZSwgbWluIHZhbHVlLCBtYXggdmFsdWUsIHN0ZXBzaXplXVxuICogQ29sb3JzIHNob3VsZCBiZSB3cml0dGVuIGFzIGFycmF5OiBbJ2NvbG9yJywgJyNmZmZmZmYnXVxuICogU3RyaW5ncyB3aXRoIHNob3VsZCBiZSB3cml0dGVuIGFzIGFycmF5OiBbb3B0aW9uMSwgb3B0aW9uMiwgb3B0aW9uMywgLi5dXG4gKlxuICogVGhlIG9wdGlvbnMgYXJlIG1hdGNoZWQgd2l0aCB0aGVpciBjb3VudGVycGFydHMgaW4gZWFjaCBvZiB0aGUgbW9kdWxlcyBhbmQgdGhlIHZhbHVlcyB1c2VkIGluIHRoZSBjb25maWd1cmF0aW9uIGFyZVxuICovXG5jbGFzcyBDb25maWd1cmF0b3Ige1xuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcmVudE1vZHVsZSAgICAgICAgfCB0aGUgbG9jYXRpb24gd2hlcmUgcGFyZW50TW9kdWxlLnNldE9wdGlvbnMoKSBjYW4gYmUgY2FsbGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBkZWZhdWx0Q29udGFpbmVyICAgIHwgdGhlIGRlZmF1bHQgY29udGFpbmVyIG9mIHRoZSBtb2R1bGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ3VyZU9wdGlvbnMgICAgfCB0aGUgZnVsbHkgY29uZmlndXJlZCBhbmQgcHJlZGVmaW5lZCBvcHRpb25zIHNldCBmb3VuZCBpbiBhbGxPcHRpb25zLmpzXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbFJhdGlvICAgICAgICAgIHwgY2FudmFzIHBpeGVsIHJhdGlvXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGhpZGVPcHRpb24gICAgICAgIHwgY3VzdG9tIGxvZ2ljIHRvIGR5bmFtaWNhbGx5IGhpZGUgb3B0aW9uc1xuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcGFyZW50TW9kdWxlLFxuICAgIGRlZmF1bHRDb250YWluZXIsXG4gICAgY29uZmlndXJlT3B0aW9ucyxcbiAgICBwaXhlbFJhdGlvID0gMSxcbiAgICBoaWRlT3B0aW9uID0gKCkgPT4gZmFsc2VcbiAgKSB7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnRNb2R1bGU7XG4gICAgdGhpcy5jaGFuZ2VkT3B0aW9ucyA9IFtdO1xuICAgIHRoaXMuY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lcjtcbiAgICB0aGlzLmFsbG93Q3JlYXRpb24gPSBmYWxzZTtcbiAgICB0aGlzLmhpZGVPcHRpb24gPSBoaWRlT3B0aW9uO1xuXG4gICAgdGhpcy5vcHRpb25zID0ge307XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMucG9wdXBDb3VudGVyID0gMDtcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICBmaWx0ZXI6IHRydWUsXG4gICAgICBjb250YWluZXI6IHVuZGVmaW5lZCxcbiAgICAgIHNob3dCdXR0b246IHRydWUsXG4gICAgfTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucywgdGhpcy5kZWZhdWx0T3B0aW9ucyk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMgPSBjb25maWd1cmVPcHRpb25zO1xuICAgIHRoaXMubW9kdWxlT3B0aW9ucyA9IHt9O1xuICAgIHRoaXMuZG9tRWxlbWVudHMgPSBbXTtcbiAgICB0aGlzLnBvcHVwRGl2ID0ge307XG4gICAgdGhpcy5wb3B1cExpbWl0ID0gNTtcbiAgICB0aGlzLnBvcHVwSGlzdG9yeSA9IHt9O1xuICAgIHRoaXMuY29sb3JQaWNrZXIgPSBuZXcgQ29sb3JQaWNrZXIocGl4ZWxSYXRpbyk7XG4gICAgdGhpcy53cmFwcGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlZnJlc2ggYWxsIG9wdGlvbnMuXG4gICAqIEJlY2F1c2UgYWxsIG1vZHVsZXMgcGFyc2UgdGhlaXIgb3B0aW9ucyBieSB0aGVtc2VsdmVzLCB3ZSBqdXN0IHVzZSB0aGVpciBvcHRpb25zLiBXZSBjb3B5IHRoZW0gaGVyZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHJlc2V0IHRoZSBwb3B1cCBoaXN0b3J5IGJlY2F1c2UgdGhlIGluZGljZXMgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkLlxuICAgICAgdGhpcy5wb3B1cEhpc3RvcnkgPSB7fTtcbiAgICAgIHRoaXMuX3JlbW92ZVBvcHVwKCk7XG5cbiAgICAgIGxldCBlbmFibGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZmlsdGVyID0gb3B0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZmlsdGVyID0gb3B0aW9ucy5qb2luKCk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwib3B0aW9ucyBjYW5ub3QgYmUgbnVsbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5jb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaG93QnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0J1dHRvbiA9IG9wdGlvbnMuc2hvd0J1dHRvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgZW5hYmxlZCA9IG9wdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmZpbHRlciA9IG9wdGlvbnM7XG4gICAgICAgIGVuYWJsZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5maWx0ZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIGVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vcHRpb25zLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgIH1cbiAgICB0aGlzLl9jbGVhbigpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVPcHRpb25zXG4gICAqL1xuICBzZXRNb2R1bGVPcHRpb25zKG1vZHVsZU9wdGlvbnMpIHtcbiAgICB0aGlzLm1vZHVsZU9wdGlvbnMgPSBtb2R1bGVPcHRpb25zO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5fY2xlYW4oKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyO1xuICAgICAgfVxuICAgICAgdGhpcy5fY3JlYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbGwgRE9NIGVsZW1lbnRzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlKCkge1xuICAgIHRoaXMuX2NsZWFuKCk7XG4gICAgdGhpcy5jaGFuZ2VkT3B0aW9ucyA9IFtdO1xuXG4gICAgY29uc3QgZmlsdGVyID0gdGhpcy5vcHRpb25zLmZpbHRlcjtcbiAgICBsZXQgY291bnRlciA9IDA7XG4gICAgbGV0IHNob3cgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBpbiB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWd1cmVPcHRpb25zLCBvcHRpb24pKSB7XG4gICAgICAgIHRoaXMuYWxsb3dDcmVhdGlvbiA9IGZhbHNlO1xuICAgICAgICBzaG93ID0gZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBzaG93ID0gZmlsdGVyKG9wdGlvbiwgW10pO1xuICAgICAgICAgIHNob3cgPVxuICAgICAgICAgICAgc2hvdyB8fFxuICAgICAgICAgICAgdGhpcy5faGFuZGxlT2JqZWN0KHRoaXMuY29uZmlndXJlT3B0aW9uc1tvcHRpb25dLCBbb3B0aW9uXSwgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyID09PSB0cnVlIHx8IGZpbHRlci5pbmRleE9mKG9wdGlvbikgIT09IC0xKSB7XG4gICAgICAgICAgc2hvdyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLmFsbG93Q3JlYXRpb24gPSB0cnVlO1xuXG4gICAgICAgICAgLy8gbGluZWJyZWFrIGJldHdlZW4gY2F0ZWdvcmllc1xuICAgICAgICAgIGlmIChjb3VudGVyID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbWFrZUl0ZW0oW10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhIGhlYWRlciBmb3IgdGhlIGNhdGVnb3J5XG4gICAgICAgICAgdGhpcy5fbWFrZUhlYWRlcihvcHRpb24pO1xuXG4gICAgICAgICAgLy8gZ2V0IHRoZSBzdWIgb3B0aW9uc1xuICAgICAgICAgIHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbb3B0aW9uXSwgW29wdGlvbl0pO1xuICAgICAgICB9XG4gICAgICAgIGNvdW50ZXIrKztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbWFrZUJ1dHRvbigpO1xuICAgIHRoaXMuX3B1c2goKTtcbiAgICAvL34gdGhpcy5jb2xvclBpY2tlci5pbnNlcnRUbyh0aGlzLmNvbnRhaW5lcik7XG4gIH1cblxuICAvKipcbiAgICogZHJhdyBhbGwgRE9NIGVsZW1lbnRzIG9uIHRoZSBzY3JlZW5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wdXNoKCkge1xuICAgIHRoaXMud3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy53cmFwcGVyLmNsYXNzTmFtZSA9IFwidmlzLWNvbmZpZ3VyYXRpb24td3JhcHBlclwiO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5kb21FbGVtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2hvd1BvcHVwSWZOZWVkZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZWxldGUgYWxsIERPTSBlbGVtZW50c1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NsZWFuKCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5kb21FbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53cmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tRWxlbWVudHNbaV0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndyYXBwZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy53cmFwcGVyKTtcbiAgICAgIHRoaXMud3JhcHBlciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5kb21FbGVtZW50cyA9IFtdO1xuXG4gICAgdGhpcy5fcmVtb3ZlUG9wdXAoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIGFjdHVhbE9wdGlvbnMgaWYgaXQgZXhpc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRWYWx1ZShwYXRoKSB7XG4gICAgbGV0IGJhc2UgPSB0aGlzLm1vZHVsZU9wdGlvbnM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYmFzZVtwYXRoW2ldXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJhc2UgPSBiYXNlW3BhdGhbaV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmFzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIGFsbCBvcHRpb24gZWxlbWVudHMgYXJlIHdyYXBwZWQgaW4gYW4gaXRlbVxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHBhcmFtIHtBcnJheS48RWxlbWVudD59IGRvbUVsZW1lbnRzXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFrZUl0ZW0ocGF0aCwgLi4uZG9tRWxlbWVudHMpIHtcbiAgICBpZiAodGhpcy5hbGxvd0NyZWF0aW9uID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGl0ZW0uY2xhc3NOYW1lID1cbiAgICAgICAgXCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWl0ZW0gdmlzLWNvbmZpZy1zXCIgKyBwYXRoLmxlbmd0aDtcbiAgICAgIGRvbUVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaXRlbS5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kb21FbGVtZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgcmV0dXJuIHRoaXMuZG9tRWxlbWVudHMubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBoZWFkZXIgZm9yIG1ham9yIHN1YmplY3RzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFrZUhlYWRlcihuYW1lKSB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYuY2xhc3NOYW1lID0gXCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWhlYWRlclwiO1xuICAgIGRpdi5pbm5lclRleHQgPSBuYW1lO1xuICAgIHRoaXMuX21ha2VJdGVtKFtdLCBkaXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIG1ha2UgYSBsYWJlbCwgaWYgaXQgaXMgYW4gb2JqZWN0IGxhYmVsLCBpdCBnZXRzIGRpZmZlcmVudCBzdHlsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdExhYmVsXG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlTGFiZWwobmFtZSwgcGF0aCwgb2JqZWN0TGFiZWwgPSBmYWxzZSkge1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZGl2LmNsYXNzTmFtZSA9XG4gICAgICBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctbGFiZWwgdmlzLWNvbmZpZy1zXCIgKyBwYXRoLmxlbmd0aDtcbiAgICBpZiAob2JqZWN0TGFiZWwgPT09IHRydWUpIHtcbiAgICAgIHdoaWxlIChkaXYuZmlyc3RDaGlsZCkge1xuICAgICAgICBkaXYucmVtb3ZlQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgZGl2LmFwcGVuZENoaWxkKHdyYXBJblRhZyhcImlcIiwgXCJiXCIsIG5hbWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGl2LmlubmVyVGV4dCA9IG5hbWUgKyBcIjpcIjtcbiAgICB9XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlIGEgZHJvcGRvd24gbGlzdCBmb3IgbXVsdGlwbGUgcG9zc2libGUgc3RyaW5nIG9wdG9pbnNcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlRHJvcGRvd24oYXJyLCB2YWx1ZSwgcGF0aCkge1xuICAgIGNvbnN0IHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzZWxlY3RcIik7XG4gICAgc2VsZWN0LmNsYXNzTmFtZSA9IFwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1zZWxlY3RcIjtcbiAgICBsZXQgc2VsZWN0ZWRWYWx1ZSA9IDA7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChhcnIuaW5kZXhPZih2YWx1ZSkgIT09IC0xKSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWUgPSBhcnIuaW5kZXhPZih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRpb25cIik7XG4gICAgICBvcHRpb24udmFsdWUgPSBhcnJbaV07XG4gICAgICBpZiAoaSA9PT0gc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb24uc2VsZWN0ZWQgPSBcInNlbGVjdGVkXCI7XG4gICAgICB9XG4gICAgICBvcHRpb24uaW5uZXJUZXh0ID0gYXJyW2ldO1xuICAgICAgc2VsZWN0LmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3QgbWUgPSB0aGlzO1xuICAgIHNlbGVjdC5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIG1lLl91cGRhdGUodGhpcy52YWx1ZSwgcGF0aCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fbWFrZUxhYmVsKHBhdGhbcGF0aC5sZW5ndGggLSAxXSwgcGF0aCk7XG4gICAgdGhpcy5fbWFrZUl0ZW0ocGF0aCwgbGFiZWwsIHNlbGVjdCk7XG4gIH1cblxuICAvKipcbiAgICogbWFrZSBhIHJhbmdlIG9iamVjdCBmb3IgbnVtZXJpYyBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGFyclxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFrZVJhbmdlKGFyciwgdmFsdWUsIHBhdGgpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBhcnJbMF07XG4gICAgY29uc3QgbWluID0gYXJyWzFdO1xuICAgIGNvbnN0IG1heCA9IGFyclsyXTtcbiAgICBjb25zdCBzdGVwID0gYXJyWzNdO1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIHJhbmdlLmNsYXNzTmFtZSA9IFwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1yYW5nZVwiO1xuICAgIHRyeSB7XG4gICAgICByYW5nZS50eXBlID0gXCJyYW5nZVwiOyAvLyBub3Qgc3VwcG9ydGVkIG9uIElFOVxuICAgICAgcmFuZ2UubWluID0gbWluO1xuICAgICAgcmFuZ2UubWF4ID0gbWF4O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVE9ETzogQWRkIHNvbWUgZXJyb3IgaGFuZGxpbmcuXG4gICAgfVxuICAgIHJhbmdlLnN0ZXAgPSBzdGVwO1xuXG4gICAgLy8gc2V0IHVwIHRoZSBwb3B1cCBzZXR0aW5ncyBpbiBjYXNlIHRoZXkgYXJlIG5lZWRlZC5cbiAgICBsZXQgcG9wdXBTdHJpbmcgPSBcIlwiO1xuICAgIGxldCBwb3B1cFZhbHVlID0gMDtcblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmYWN0b3IgPSAxLjI7XG4gICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlICogZmFjdG9yIDwgbWluKSB7XG4gICAgICAgIHJhbmdlLm1pbiA9IE1hdGguY2VpbCh2YWx1ZSAqIGZhY3Rvcik7XG4gICAgICAgIHBvcHVwVmFsdWUgPSByYW5nZS5taW47XG4gICAgICAgIHBvcHVwU3RyaW5nID0gXCJyYW5nZSBpbmNyZWFzZWRcIjtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgLyBmYWN0b3IgPCBtaW4pIHtcbiAgICAgICAgcmFuZ2UubWluID0gTWF0aC5jZWlsKHZhbHVlIC8gZmFjdG9yKTtcbiAgICAgICAgcG9wdXBWYWx1ZSA9IHJhbmdlLm1pbjtcbiAgICAgICAgcG9wdXBTdHJpbmcgPSBcInJhbmdlIGluY3JlYXNlZFwiO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlICogZmFjdG9yID4gbWF4ICYmIG1heCAhPT0gMSkge1xuICAgICAgICByYW5nZS5tYXggPSBNYXRoLmNlaWwodmFsdWUgKiBmYWN0b3IpO1xuICAgICAgICBwb3B1cFZhbHVlID0gcmFuZ2UubWF4O1xuICAgICAgICBwb3B1cFN0cmluZyA9IFwicmFuZ2UgaW5jcmVhc2VkXCI7XG4gICAgICB9XG4gICAgICByYW5nZS52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS52YWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC5jbGFzc05hbWUgPSBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctcmFuZ2VpbnB1dFwiO1xuICAgIGlucHV0LnZhbHVlID0gcmFuZ2UudmFsdWU7XG5cbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgcmFuZ2Uub25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpbnB1dC52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICBtZS5fdXBkYXRlKE51bWJlcih0aGlzLnZhbHVlKSwgcGF0aCk7XG4gICAgfTtcbiAgICByYW5nZS5vbmlucHV0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaW5wdXQudmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgIH07XG5cbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuX21ha2VMYWJlbChwYXRoW3BhdGgubGVuZ3RoIC0gMV0sIHBhdGgpO1xuICAgIGNvbnN0IGl0ZW1JbmRleCA9IHRoaXMuX21ha2VJdGVtKHBhdGgsIGxhYmVsLCByYW5nZSwgaW5wdXQpO1xuXG4gICAgLy8gaWYgYSBwb3B1cCBpcyBuZWVkZWQgQU5EIGl0IGhhcyBub3QgYmVlbiBzaG93biBmb3IgdGhpcyB2YWx1ZSwgc2hvdyBpdC5cbiAgICBpZiAocG9wdXBTdHJpbmcgIT09IFwiXCIgJiYgdGhpcy5wb3B1cEhpc3RvcnlbaXRlbUluZGV4XSAhPT0gcG9wdXBWYWx1ZSkge1xuICAgICAgdGhpcy5wb3B1cEhpc3RvcnlbaXRlbUluZGV4XSA9IHBvcHVwVmFsdWU7XG4gICAgICB0aGlzLl9zZXR1cFBvcHVwKHBvcHVwU3RyaW5nLCBpdGVtSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBtYWtlIGEgYnV0dG9uIG9iamVjdFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93QnV0dG9uID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBnZW5lcmF0ZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBnZW5lcmF0ZUJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctYnV0dG9uXCI7XG4gICAgICBnZW5lcmF0ZUJ1dHRvbi5pbm5lclRleHQgPSBcImdlbmVyYXRlIG9wdGlvbnNcIjtcbiAgICAgIGdlbmVyYXRlQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3ByaW50T3B0aW9ucygpO1xuICAgICAgfTtcbiAgICAgIGdlbmVyYXRlQnV0dG9uLm9ubW91c2VvdmVyID0gKCkgPT4ge1xuICAgICAgICBnZW5lcmF0ZUJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctYnV0dG9uIGhvdmVyXCI7XG4gICAgICB9O1xuICAgICAgZ2VuZXJhdGVCdXR0b24ub25tb3VzZW91dCA9ICgpID0+IHtcbiAgICAgICAgZ2VuZXJhdGVCdXR0b24uY2xhc3NOYW1lID0gXCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvblwiO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lci5jbGFzc05hbWUgPVxuICAgICAgICBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctb3B0aW9uLWNvbnRhaW5lclwiO1xuXG4gICAgICB0aGlzLmRvbUVsZW1lbnRzLnB1c2godGhpcy5vcHRpb25zQ29udGFpbmVyKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudHMucHVzaChnZW5lcmF0ZUJ1dHRvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHByZXBhcmUgdGhlIHBvcHVwXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0dXBQb3B1cChzdHJpbmcsIGluZGV4KSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSAmJlxuICAgICAgdGhpcy5hbGxvd0NyZWF0aW9uID09PSB0cnVlICYmXG4gICAgICB0aGlzLnBvcHVwQ291bnRlciA8IHRoaXMucG9wdXBMaW1pdFxuICAgICkge1xuICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGRpdi5pZCA9IFwidmlzLWNvbmZpZ3VyYXRpb24tcG9wdXBcIjtcbiAgICAgIGRpdi5jbGFzc05hbWUgPSBcInZpcy1jb25maWd1cmF0aW9uLXBvcHVwXCI7XG4gICAgICBkaXYuaW5uZXJUZXh0ID0gc3RyaW5nO1xuICAgICAgZGl2Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVBvcHVwKCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5wb3B1cENvdW50ZXIgKz0gMTtcbiAgICAgIHRoaXMucG9wdXBEaXYgPSB7IGh0bWw6IGRpdiwgaW5kZXg6IGluZGV4IH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSB0aGUgcG9wdXAgZnJvbSB0aGUgZG9tXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVtb3ZlUG9wdXAoKSB7XG4gICAgaWYgKHRoaXMucG9wdXBEaXYuaHRtbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBvcHVwRGl2Lmh0bWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHVwRGl2Lmh0bWwpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9wdXBEaXYuaGlkZVRpbWVvdXQpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucG9wdXBEaXYuZGVsZXRlVGltZW91dCk7XG4gICAgICB0aGlzLnBvcHVwRGl2ID0ge307XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHBvcHVwIGlmIGl0IGlzIG5lZWRlZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zaG93UG9wdXBJZk5lZWRlZCgpIHtcbiAgICBpZiAodGhpcy5wb3B1cERpdi5odG1sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdFbGVtZW50ID0gdGhpcy5kb21FbGVtZW50c1t0aGlzLnBvcHVwRGl2LmluZGV4XTtcbiAgICAgIGNvbnN0IHJlY3QgPSBjb3JyZXNwb25kaW5nRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucG9wdXBEaXYuaHRtbC5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgXCJweFwiO1xuICAgICAgdGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLnRvcCA9IHJlY3QudG9wIC0gMzAgKyBcInB4XCI7IC8vIDMwIGlzIHRoZSBoZWlnaHQ7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucG9wdXBEaXYuaHRtbCk7XG4gICAgICB0aGlzLnBvcHVwRGl2LmhpZGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucG9wdXBEaXYuaHRtbC5zdHlsZS5vcGFjaXR5ID0gMDtcbiAgICAgIH0sIDE1MDApO1xuICAgICAgdGhpcy5wb3B1cERpdi5kZWxldGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3JlbW92ZVBvcHVwKCk7XG4gICAgICB9LCAxODAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogbWFrZSBhIGNoZWNrYm94IGZvciBib29sZWFuIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWZhdWx0VmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VDaGVja2JveChkZWZhdWx0VmFsdWUsIHZhbHVlLCBwYXRoKSB7XG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgY2hlY2tib3gudHlwZSA9IFwiY2hlY2tib3hcIjtcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSBcInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY2hlY2tib3hcIjtcbiAgICBjaGVja2JveC5jaGVja2VkID0gZGVmYXVsdFZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjaGVja2JveC5jaGVja2VkID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gZGVmYXVsdFZhbHVlLmVuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7IHBhdGg6IHBhdGgsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHsgcGF0aDogcGF0aCwgdmFsdWU6IHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWUgPSB0aGlzO1xuICAgIGNoZWNrYm94Lm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuX3VwZGF0ZSh0aGlzLmNoZWNrZWQsIHBhdGgpO1xuICAgIH07XG5cbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuX21ha2VMYWJlbChwYXRoW3BhdGgubGVuZ3RoIC0gMV0sIHBhdGgpO1xuICAgIHRoaXMuX21ha2VJdGVtKHBhdGgsIGxhYmVsLCBjaGVja2JveCk7XG4gIH1cblxuICAvKipcbiAgICogbWFrZSBhIHRleHQgaW5wdXQgZmllbGQgZm9yIHN0cmluZyBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVmYXVsdFZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlVGV4dElucHV0KGRlZmF1bHRWYWx1ZSwgdmFsdWUsIHBhdGgpIHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBjaGVja2JveC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgY2hlY2tib3guY2xhc3NOYW1lID0gXCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXRleHRcIjtcbiAgICBjaGVja2JveC52YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh2YWx1ZSAhPT0gZGVmYXVsdFZhbHVlKSB7XG4gICAgICB0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2goeyBwYXRoOiBwYXRoLCB2YWx1ZTogdmFsdWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgbWUgPSB0aGlzO1xuICAgIGNoZWNrYm94Lm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgbWUuX3VwZGF0ZSh0aGlzLnZhbHVlLCBwYXRoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9tYWtlTGFiZWwocGF0aFtwYXRoLmxlbmd0aCAtIDFdLCBwYXRoKTtcbiAgICB0aGlzLl9tYWtlSXRlbShwYXRoLCBsYWJlbCwgY2hlY2tib3gpO1xuICB9XG5cbiAgLyoqXG4gICAqIG1ha2UgYSBjb2xvciBmaWVsZCB3aXRoIGEgY29sb3IgcGlja2VyIGZvciBjb2xvciBmaWVsZHNcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlQ29sb3JGaWVsZChhcnIsIHZhbHVlLCBwYXRoKSB7XG4gICAgY29uc3QgZGVmYXVsdENvbG9yID0gYXJyWzFdO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbG9yIDogdmFsdWU7XG5cbiAgICBpZiAodmFsdWUgIT09IFwibm9uZVwiKSB7XG4gICAgICBkaXYuY2xhc3NOYW1lID0gXCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWNvbG9yQmxvY2tcIjtcbiAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGl2LmNsYXNzTmFtZSA9IFwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1jb2xvckJsb2NrIG5vbmVcIjtcbiAgICB9XG5cbiAgICB2YWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29sb3IgOiB2YWx1ZTtcbiAgICBkaXYub25jbGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX3Nob3dDb2xvclBpY2tlcih2YWx1ZSwgZGl2LCBwYXRoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLl9tYWtlTGFiZWwocGF0aFtwYXRoLmxlbmd0aCAtIDFdLCBwYXRoKTtcbiAgICB0aGlzLl9tYWtlSXRlbShwYXRoLCBsYWJlbCwgZGl2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiB1c2VkIGJ5IHRoZSBjb2xvciBidXR0b25zIHRvIGNhbGwgdGhlIGNvbG9yIHBpY2tlci5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGRpdlxuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zaG93Q29sb3JQaWNrZXIodmFsdWUsIGRpdiwgcGF0aCkge1xuICAgIC8vIGNsZWFyIHRoZSBjYWxsYmFjayBmcm9tIHRoaXMgZGl2XG4gICAgZGl2Lm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7fTtcblxuICAgIHRoaXMuY29sb3JQaWNrZXIuaW5zZXJ0VG8oZGl2KTtcbiAgICB0aGlzLmNvbG9yUGlja2VyLnNob3coKTtcblxuICAgIHRoaXMuY29sb3JQaWNrZXIuc2V0Q29sb3IodmFsdWUpO1xuICAgIHRoaXMuY29sb3JQaWNrZXIuc2V0VXBkYXRlQ2FsbGJhY2soKGNvbG9yKSA9PiB7XG4gICAgICBjb25zdCBjb2xvclN0cmluZyA9XG4gICAgICAgIFwicmdiYShcIiArIGNvbG9yLnIgKyBcIixcIiArIGNvbG9yLmcgKyBcIixcIiArIGNvbG9yLmIgKyBcIixcIiArIGNvbG9yLmEgKyBcIilcIjtcbiAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvclN0cmluZztcbiAgICAgIHRoaXMuX3VwZGF0ZShjb2xvclN0cmluZywgcGF0aCk7XG4gICAgfSk7XG5cbiAgICAvLyBvbiBjbG9zZSBvZiB0aGUgY29sb3JwaWNrZXIsIHJlc3RvcmUgdGhlIGNhbGxiYWNrLlxuICAgIHRoaXMuY29sb3JQaWNrZXIuc2V0Q2xvc2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBkaXYub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fc2hvd0NvbG9yUGlja2VyKHZhbHVlLCBkaXYsIHBhdGgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwYXJzZSBhbiBvYmplY3QgYW5kIGRyYXcgdGhlIGNvcnJlY3QgaXRlbXNcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9ialxuICAgKiBAcGFyYW0ge0FycmF5fSBbcGF0aD1bXV0gICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGVja09ubHk9ZmFsc2VdXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhbmRsZU9iamVjdChvYmosIHBhdGggPSBbXSwgY2hlY2tPbmx5ID0gZmFsc2UpIHtcbiAgICBsZXQgc2hvdyA9IGZhbHNlO1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMub3B0aW9ucy5maWx0ZXI7XG4gICAgbGV0IHZpc2libGVJblNldCA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgc3ViT2JqIGluIG9iaikge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHN1Yk9iaikpIHtcbiAgICAgICAgc2hvdyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBvYmpbc3ViT2JqXTtcbiAgICAgICAgY29uc3QgbmV3UGF0aCA9IGNvcHlBbmRFeHRlbmRBcnJheShwYXRoLCBzdWJPYmopO1xuICAgICAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgc2hvdyA9IGZpbHRlcihzdWJPYmosIHBhdGgpO1xuXG4gICAgICAgICAgLy8gaWYgbmVlZGVkIHdlIG11c3QgZ28gZGVlcGVyIGludG8gdGhlIG9iamVjdC5cbiAgICAgICAgICBpZiAoc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIUFycmF5LmlzQXJyYXkoaXRlbSkgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGl0ZW0gIT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGl0ZW0gIT09IFwiYm9vbGVhblwiICYmXG4gICAgICAgICAgICAgIGl0ZW0gaW5zdGFuY2VvZiBPYmplY3RcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICB0aGlzLmFsbG93Q3JlYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgc2hvdyA9IHRoaXMuX2hhbmRsZU9iamVjdChpdGVtLCBuZXdQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5hbGxvd0NyZWF0aW9uID0gY2hlY2tPbmx5ID09PSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB2aXNpYmxlSW5TZXQgPSB0cnVlO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fZ2V0VmFsdWUobmV3UGF0aCk7XG5cbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQXJyYXkoaXRlbSwgdmFsdWUsIG5ld1BhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMuX21ha2VUZXh0SW5wdXQoaXRlbSwgdmFsdWUsIG5ld1BhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlQ2hlY2tib3goaXRlbSwgdmFsdWUsIG5ld1BhdGgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgLy8gc2tpcCB0aGUgb3B0aW9ucyB0aGF0IGFyZSBub3QgZW5hYmxlZFxuICAgICAgICAgICAgaWYgKCF0aGlzLmhpZGVPcHRpb24ocGF0aCwgc3ViT2JqLCB0aGlzLm1vZHVsZU9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgIC8vIGluaXRpYWxseSBjb2xsYXBzZSBvcHRpb25zIHdpdGggYW4gZGlzYWJsZWQgZW5hYmxlZCBvcHRpb24uXG4gICAgICAgICAgICAgIGlmIChpdGVtLmVuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWRQYXRoID0gY29weUFuZEV4dGVuZEFycmF5KG5ld1BhdGgsIFwiZW5hYmxlZFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmFibGVkVmFsdWUgPSB0aGlzLl9nZXRWYWx1ZShlbmFibGVkUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWRWYWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLl9tYWtlTGFiZWwoc3ViT2JqLCBuZXdQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21ha2VJdGVtKG5ld1BhdGgsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgIHZpc2libGVJblNldCA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZU9iamVjdChpdGVtLCBuZXdQYXRoKSB8fCB2aXNpYmxlSW5TZXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuX21ha2VDaGVja2JveChpdGVtLCBlbmFibGVkVmFsdWUsIG5ld1BhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX21ha2VMYWJlbChzdWJPYmosIG5ld1BhdGgsIHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21ha2VJdGVtKG5ld1BhdGgsIGxhYmVsKTtcbiAgICAgICAgICAgICAgICB2aXNpYmxlSW5TZXQgPVxuICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlT2JqZWN0KGl0ZW0sIG5ld1BhdGgpIHx8IHZpc2libGVJblNldDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZG9udCBrbm93IGhvdyB0byBoYW5kbGVcIiwgaXRlbSwgc3ViT2JqLCBuZXdQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVJblNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBoYW5kbGUgdGhlIGFycmF5IHR5cGUgb2Ygb3B0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGFyclxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlQXJyYXkoYXJyLCB2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgYXJyWzBdID09PSBcInN0cmluZ1wiICYmIGFyclswXSA9PT0gXCJjb2xvclwiKSB7XG4gICAgICB0aGlzLl9tYWtlQ29sb3JGaWVsZChhcnIsIHZhbHVlLCBwYXRoKTtcbiAgICAgIGlmIChhcnJbMV0gIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7IHBhdGg6IHBhdGgsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcnJbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuX21ha2VEcm9wZG93bihhcnIsIHZhbHVlLCBwYXRoKTtcbiAgICAgIGlmIChhcnJbMF0gIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7IHBhdGg6IHBhdGgsIHZhbHVlOiB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcnJbMF0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHRoaXMuX21ha2VSYW5nZShhcnIsIHZhbHVlLCBwYXRoKTtcbiAgICAgIGlmIChhcnJbMF0gIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7IHBhdGg6IHBhdGgsIHZhbHVlOiBOdW1iZXIodmFsdWUpIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsZWQgdG8gdXBkYXRlIHRoZSBuZXR3b3JrIHdpdGggdGhlIG5ldyBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7QXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZSh2YWx1ZSwgcGF0aCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHZhbHVlLCBwYXRoKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucGFyZW50LmJvZHkgJiZcbiAgICAgIHRoaXMucGFyZW50LmJvZHkuZW1pdHRlciAmJlxuICAgICAgdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXRcbiAgICApIHtcbiAgICAgIHRoaXMucGFyZW50LmJvZHkuZW1pdHRlci5lbWl0KFwiY29uZmlnQ2hhbmdlXCIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB0aGlzLnBhcmVudC5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgYm9vbGVhbn0gdmFsdWVcbiAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gcGF0aFxuICAgKiBAcGFyYW0ge3t9fSBvcHRpb25zT2JqXG4gICAqIEByZXR1cm5zIHt7fX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb25zdHJ1Y3RPcHRpb25zKHZhbHVlLCBwYXRoLCBvcHRpb25zT2JqID0ge30pIHtcbiAgICBsZXQgcG9pbnRlciA9IG9wdGlvbnNPYmo7XG5cbiAgICAvLyB3aGVuIGRyb3Bkb3duIGJveGVzIGNhbiBiZSBzdHJpbmcgb3IgYm9vbGVhbiwgd2UgdHlwZWNhc3QgaXQgaW50byBjb3JyZWN0IHR5cGVzXG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogdmFsdWU7XG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gXCJmYWxzZVwiID8gZmFsc2UgOiB2YWx1ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdGhbaV0gIT09IFwiZ2xvYmFsXCIpIHtcbiAgICAgICAgaWYgKHBvaW50ZXJbcGF0aFtpXV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHBvaW50ZXJbcGF0aFtpXV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSAhPT0gcGF0aC5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXJbcGF0aFtpXV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcG9pbnRlcltwYXRoW2ldXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcHRpb25zT2JqO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJpbnRPcHRpb25zKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcblxuICAgIHdoaWxlICh0aGlzLm9wdGlvbnNDb250YWluZXIuZmlyc3RDaGlsZCkge1xuICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMub3B0aW9uc0NvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLmFwcGVuZENoaWxkKFxuICAgICAgd3JhcEluVGFnKFwicHJlXCIsIFwiY29uc3Qgb3B0aW9ucyA9IFwiICsgSlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7e319IG9wdGlvbnNcbiAgICovXG4gIGdldE9wdGlvbnMoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFuZ2VkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fY29uc3RydWN0T3B0aW9ucyhcbiAgICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9uc1tpXS52YWx1ZSxcbiAgICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9uc1tpXS5wYXRoLFxuICAgICAgICBvcHRpb25zXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuXG4vKipcbiAqIFBvcHVwIGlzIGEgY2xhc3MgdG8gY3JlYXRlIGEgcG9wdXAgd2luZG93IHdpdGggc29tZSB0ZXh0XG4gKi9cbmNsYXNzIFBvcHVwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gY29udGFpbmVyICAgICAgIFRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gIG92ZXJmbG93TWV0aG9kICBIb3cgdGhlIHBvcHVwIHNob3VsZCBhY3QgdG8gb3ZlcmZsb3dpbmcgKCdmbGlwJyBvciAnY2FwJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgb3ZlcmZsb3dNZXRob2QpIHtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLm92ZXJmbG93TWV0aG9kID0gb3ZlcmZsb3dNZXRob2QgfHwgXCJjYXBcIjtcblxuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLnBhZGRpbmcgPSA1O1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZyYW1lXG4gICAgdGhpcy5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5mcmFtZS5jbGFzc05hbWUgPSBcInZpcy10b29sdGlwXCI7XG4gICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtudW1iZXJ9IHggICBIb3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBwb3B1cCB3aW5kb3dcbiAgICogQHBhcmFtIHtudW1iZXJ9IHkgICBWZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgcG9wdXAgd2luZG93XG4gICAqL1xuICBzZXRQb3NpdGlvbih4LCB5KSB7XG4gICAgdGhpcy54ID0gcGFyc2VJbnQoeCk7XG4gICAgdGhpcy55ID0gcGFyc2VJbnQoeSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb250ZW50IGZvciB0aGUgcG9wdXAgd2luZG93LiBUaGlzIGNhbiBiZSBIVE1MIGNvZGUgb3IgdGV4dC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBFbGVtZW50fSBjb250ZW50XG4gICAqL1xuICBzZXRUZXh0KGNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHdoaWxlICh0aGlzLmZyYW1lLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lLmZpcnN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RyaW5nIGNvbnRhaW5pbmcgbGl0ZXJhbCB0ZXh0LCBlbGVtZW50IGhhcyB0byBiZSB1c2VkIGZvciBIVE1MIGR1ZSB0b1xuICAgICAgLy8gWFNTIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpbm5lckhUTUwgKGkuZS4gcHJldmVudCBYU1MgYnkgYWNjaWRlbnQpLlxuICAgICAgdGhpcy5mcmFtZS5pbm5lclRleHQgPSBjb250ZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBwb3B1cCB3aW5kb3dcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbZG9TaG93XSAgICBTaG93IG9yIGhpZGUgdGhlIHdpbmRvd1xuICAgKi9cbiAgc2hvdyhkb1Nob3cpIHtcbiAgICBpZiAoZG9TaG93ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGRvU2hvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGRvU2hvdyA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMuZnJhbWUuY2xpZW50V2lkdGg7XG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSB0aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIGxldCBsZWZ0ID0gMCxcbiAgICAgICAgdG9wID0gMDtcblxuICAgICAgaWYgKHRoaXMub3ZlcmZsb3dNZXRob2QgPT0gXCJmbGlwXCIpIHtcbiAgICAgICAgbGV0IGlzTGVmdCA9IGZhbHNlLFxuICAgICAgICAgIGlzVG9wID0gdHJ1ZTsgLy8gV2hlcmUgYXJvdW5kIHRoZSBwb3NpdGlvbiBpdCdzIGxvY2F0ZWRcblxuICAgICAgICBpZiAodGhpcy55IC0gaGVpZ2h0IDwgdGhpcy5wYWRkaW5nKSB7XG4gICAgICAgICAgaXNUb3AgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnggKyB3aWR0aCA+IG1heFdpZHRoIC0gdGhpcy5wYWRkaW5nKSB7XG4gICAgICAgICAgaXNMZWZ0ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0xlZnQpIHtcbiAgICAgICAgICBsZWZ0ID0gdGhpcy54IC0gd2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGVmdCA9IHRoaXMueDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1RvcCkge1xuICAgICAgICAgIHRvcCA9IHRoaXMueSAtIGhlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3AgPSB0aGlzLnk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRvcCA9IHRoaXMueSAtIGhlaWdodDtcbiAgICAgICAgaWYgKHRvcCArIGhlaWdodCArIHRoaXMucGFkZGluZyA+IG1heEhlaWdodCkge1xuICAgICAgICAgIHRvcCA9IG1heEhlaWdodCAtIGhlaWdodCAtIHRoaXMucGFkZGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9wIDwgdGhpcy5wYWRkaW5nKSB7XG4gICAgICAgICAgdG9wID0gdGhpcy5wYWRkaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVmdCA9IHRoaXMueDtcbiAgICAgICAgaWYgKGxlZnQgKyB3aWR0aCArIHRoaXMucGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgbGVmdCA9IG1heFdpZHRoIC0gd2lkdGggLSB0aGlzLnBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnQgPCB0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgICBsZWZ0ID0gdGhpcy5wYWRkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZnJhbWUuc3R5bGUubGVmdCA9IGxlZnQgKyBcInB4XCI7XG4gICAgICB0aGlzLmZyYW1lLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHBvcHVwIHdpbmRvd1xuICAgKi9cbiAgaGlkZSgpIHtcbiAgICB0aGlzLmhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5mcmFtZS5zdHlsZS5sZWZ0ID0gXCIwXCI7XG4gICAgdGhpcy5mcmFtZS5zdHlsZS50b3AgPSBcIjBcIjtcbiAgICB0aGlzLmZyYW1lLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgcG9wdXAgd2luZG93XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTsgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET01cbiAgfVxufVxuXG5sZXQgZXJyb3JGb3VuZCA9IGZhbHNlO1xubGV0IGFsbE9wdGlvbnM7XG5cbmNvbnN0IFZBTElEQVRPUl9QUklOVF9TVFlMRSA9IFwiYmFja2dyb3VuZDogI0ZGZWVlZTsgY29sb3I6ICNkZDAwMDBcIjtcblxuLyoqXG4gKiAgVXNlZCB0byB2YWxpZGF0ZSBvcHRpb25zLlxuICovXG5jbGFzcyBWYWxpZGF0b3Ige1xuICAvKipcbiAgICogTWFpbiBmdW5jdGlvbiB0byBiZSBjYWxsZWRcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IHJlZmVyZW5jZU9wdGlvbnNcbiAgICogQHBhcmFtIHtvYmplY3R9IHN1Yk9iamVjdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHZhbGlkYXRlKG9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbnMsIHN1Yk9iamVjdCkge1xuICAgIGVycm9yRm91bmQgPSBmYWxzZTtcbiAgICBhbGxPcHRpb25zID0gcmVmZXJlbmNlT3B0aW9ucztcbiAgICBsZXQgdXNlZE9wdGlvbnMgPSByZWZlcmVuY2VPcHRpb25zO1xuICAgIGlmIChzdWJPYmplY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdXNlZE9wdGlvbnMgPSByZWZlcmVuY2VPcHRpb25zW3N1Yk9iamVjdF07XG4gICAgfVxuICAgIFZhbGlkYXRvci5wYXJzZShvcHRpb25zLCB1c2VkT3B0aW9ucywgW10pO1xuICAgIHJldHVybiBlcnJvckZvdW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgdHJhdmVyc2UgYW4gb2JqZWN0IHJlY3Vyc2l2ZWx5IGFuZCBjaGVjayBldmVyeSB2YWx1ZVxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gcmVmZXJlbmNlT3B0aW9uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHBhcnNlKG9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbnMsIHBhdGgpIHtcbiAgICBmb3IgKGNvbnN0IG9wdGlvbiBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbnMsIG9wdGlvbikpIHtcbiAgICAgICAgVmFsaWRhdG9yLmNoZWNrKG9wdGlvbiwgb3B0aW9ucywgcmVmZXJlbmNlT3B0aW9ucywgcGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGV2ZXJ5IHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0LCBjYWxsIHRoZSBwYXJzZSBmdW5jdGlvbiBvbiB0aGF0IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gcmVmZXJlbmNlT3B0aW9uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNoZWNrKG9wdGlvbiwgb3B0aW9ucywgcmVmZXJlbmNlT3B0aW9ucywgcGF0aCkge1xuICAgIGlmIChcbiAgICAgIHJlZmVyZW5jZU9wdGlvbnNbb3B0aW9uXSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICByZWZlcmVuY2VPcHRpb25zLl9fYW55X18gPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgVmFsaWRhdG9yLmdldFN1Z2dlc3Rpb24ob3B0aW9uLCByZWZlcmVuY2VPcHRpb25zLCBwYXRoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVmZXJlbmNlT3B0aW9uID0gb3B0aW9uO1xuICAgIGxldCBpc19vYmplY3QgPSB0cnVlO1xuXG4gICAgaWYgKFxuICAgICAgcmVmZXJlbmNlT3B0aW9uc1tvcHRpb25dID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlZmVyZW5jZU9wdGlvbnMuX19hbnlfXyAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICAvLyBOT1RFOiBUaGlzIG9ubHkgdHJpZ2dlcnMgaWYgdGhlIF9fYW55X18gaXMgaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUgb3B0aW9ucyBvYmplY3QuXG4gICAgICAvLyAgICAgICBUSEFUJ1MgQSBSRUFMTFkgQkFEIFBMQUNFIFRPIEFMTE9XIElUISEhIVxuICAgICAgLy8gVE9ETzogRXhhbWluZSBpZiBuZWVkZWQsIHJlbW92ZSBpZiBwb3NzaWJsZVxuXG4gICAgICAvLyBfX2FueV9fIGlzIGEgd2lsZGNhcmQuIEFueSB2YWx1ZSBpcyBhY2NlcHRlZCBhbmQgd2lsbCBiZSBmdXJ0aGVyIGFuYWx5c2VkIGJ5IHJlZmVyZW5jZS5cbiAgICAgIHJlZmVyZW5jZU9wdGlvbiA9IFwiX19hbnlfX1wiO1xuXG4gICAgICAvLyBpZiB0aGUgYW55LXN1Ymdyb3VwIGlzIG5vdCBhIHByZWRlZmluZWQgb2JqZWN0IGluIHRoZSBjb25maWd1cmF0b3IsXG4gICAgICAvLyB3ZSBkbyBub3QgbG9vayBkZWVwZXIgaW50byB0aGUgb2JqZWN0LlxuICAgICAgaXNfb2JqZWN0ID0gVmFsaWRhdG9yLmdldFR5cGUob3B0aW9uc1tvcHRpb25dKSA9PT0gXCJvYmplY3RcIjtcbiAgICB9XG5cbiAgICBsZXQgcmVmT3B0aW9uT2JqID0gcmVmZXJlbmNlT3B0aW9uc1tyZWZlcmVuY2VPcHRpb25dO1xuICAgIGlmIChpc19vYmplY3QgJiYgcmVmT3B0aW9uT2JqLl9fdHlwZV9fICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlZk9wdGlvbk9iaiA9IHJlZk9wdGlvbk9iai5fX3R5cGVfXztcbiAgICB9XG5cbiAgICBWYWxpZGF0b3IuY2hlY2tGaWVsZHMoXG4gICAgICBvcHRpb24sXG4gICAgICBvcHRpb25zLFxuICAgICAgcmVmZXJlbmNlT3B0aW9ucyxcbiAgICAgIHJlZmVyZW5jZU9wdGlvbixcbiAgICAgIHJlZk9wdGlvbk9iaixcbiAgICAgIHBhdGhcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgb3B0aW9uICAgICAgICAgICB8IHRoZSBvcHRpb24gcHJvcGVydHlcbiAgICogQHBhcmFtIHtvYmplY3R9ICBvcHRpb25zICAgICAgICAgIHwgVGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7b2JqZWN0fSAgcmVmZXJlbmNlT3B0aW9ucyB8IFRoZSByZWZlcmVuY2Ugb3B0aW9ucyBjb250YWluaW5nIGFsbCBvcHRpb25zIGFuZCB0aGVpciBhbGxvd2VkIGZvcm1hdHNcbiAgICogQHBhcmFtIHtzdHJpbmd9ICByZWZlcmVuY2VPcHRpb24gIHwgVXN1YWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIG9wdGlvbiwgZXhjZXB0IHdoZW4gaGFuZGxpbmcgYW4gX19hbnlfXyB0YWcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgcmVmT3B0aW9uT2JqICAgICB8IFRoaXMgaXMgdGhlIHR5cGUgb2JqZWN0IGZyb20gdGhlIHJlZmVyZW5jZSBvcHRpb25zXG4gICAqIEBwYXJhbSB7QXJyYXl9ICAgcGF0aCAgICAgICAgICAgICB8IHdoZXJlIGluIHRoZSBvYmplY3QgaXMgdGhlIG9wdGlvblxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgY2hlY2tGaWVsZHMoXG4gICAgb3B0aW9uLFxuICAgIG9wdGlvbnMsXG4gICAgcmVmZXJlbmNlT3B0aW9ucyxcbiAgICByZWZlcmVuY2VPcHRpb24sXG4gICAgcmVmT3B0aW9uT2JqLFxuICAgIHBhdGhcbiAgKSB7XG4gICAgY29uc3QgbG9nID0gZnVuY3Rpb24gKG1lc3NhZ2UpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiJWNcIiArIG1lc3NhZ2UgKyBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihwYXRoLCBvcHRpb24pLFxuICAgICAgICBWQUxJREFUT1JfUFJJTlRfU1RZTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9wdGlvblR5cGUgPSBWYWxpZGF0b3IuZ2V0VHlwZShvcHRpb25zW29wdGlvbl0pO1xuICAgIGNvbnN0IHJlZk9wdGlvblR5cGUgPSByZWZPcHRpb25PYmpbb3B0aW9uVHlwZV07XG5cbiAgICBpZiAocmVmT3B0aW9uVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBpZiB0aGUgdHlwZSBpcyBjb3JyZWN0LCB3ZSBjaGVjayBpZiBpdCBpcyBzdXBwb3NlZCB0byBiZSBvbmUgb2YgYSBmZXcgc2VsZWN0IHZhbHVlc1xuICAgICAgaWYgKFxuICAgICAgICBWYWxpZGF0b3IuZ2V0VHlwZShyZWZPcHRpb25UeXBlKSA9PT0gXCJhcnJheVwiICYmXG4gICAgICAgIHJlZk9wdGlvblR5cGUuaW5kZXhPZihvcHRpb25zW29wdGlvbl0pID09PSAtMVxuICAgICAgKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICAnSW52YWxpZCBvcHRpb24gZGV0ZWN0ZWQgaW4gXCInICtcbiAgICAgICAgICAgIG9wdGlvbiArXG4gICAgICAgICAgICAnXCIuJyArXG4gICAgICAgICAgICBcIiBBbGxvd2VkIHZhbHVlcyBhcmU6XCIgK1xuICAgICAgICAgICAgVmFsaWRhdG9yLnByaW50KHJlZk9wdGlvblR5cGUpICtcbiAgICAgICAgICAgICcgbm90IFwiJyArXG4gICAgICAgICAgICBvcHRpb25zW29wdGlvbl0gK1xuICAgICAgICAgICAgJ1wiLiAnXG4gICAgICAgICk7XG4gICAgICAgIGVycm9yRm91bmQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25UeXBlID09PSBcIm9iamVjdFwiICYmIHJlZmVyZW5jZU9wdGlvbiAhPT0gXCJfX2FueV9fXCIpIHtcbiAgICAgICAgcGF0aCA9IGNvcHlBbmRFeHRlbmRBcnJheShwYXRoLCBvcHRpb24pO1xuICAgICAgICBWYWxpZGF0b3IucGFyc2UoXG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dLFxuICAgICAgICAgIHJlZmVyZW5jZU9wdGlvbnNbcmVmZXJlbmNlT3B0aW9uXSxcbiAgICAgICAgICBwYXRoXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZWZPcHRpb25PYmpbXCJhbnlcIl0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gdHlwZSBvZiB0aGUgZmllbGQgaXMgaW5jb3JyZWN0IGFuZCB0aGUgZmllbGQgY2Fubm90IGJlIGFueVxuICAgICAgbG9nKFxuICAgICAgICAnSW52YWxpZCB0eXBlIHJlY2VpdmVkIGZvciBcIicgK1xuICAgICAgICAgIG9wdGlvbiArXG4gICAgICAgICAgJ1wiLiBFeHBlY3RlZDogJyArXG4gICAgICAgICAgVmFsaWRhdG9yLnByaW50KE9iamVjdC5rZXlzKHJlZk9wdGlvbk9iaikpICtcbiAgICAgICAgICBcIi4gUmVjZWl2ZWQgW1wiICtcbiAgICAgICAgICBvcHRpb25UeXBlICtcbiAgICAgICAgICAnXSBcIicgK1xuICAgICAgICAgIG9wdGlvbnNbb3B0aW9uXSArXG4gICAgICAgICAgJ1wiJ1xuICAgICAgKTtcbiAgICAgIGVycm9yRm91bmQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdCB8IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcgfCBBcnJheS48bnVtYmVyPiB8IERhdGUgfCBOb2RlIHwgTW9tZW50IHwgdW5kZWZpbmVkIHwgbnVsbH0gb2JqZWN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRUeXBlKG9iamVjdCkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2Ygb2JqZWN0O1xuXG4gICAgaWYgKHR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIGlmIChvYmplY3QgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFwibnVsbFwiO1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEJvb2xlYW4pIHtcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gXCJudW1iZXJcIjtcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIFwic3RyaW5nXCI7XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBcImFycmF5XCI7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gXCJkYXRlXCI7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0Lm5vZGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFwiZG9tXCI7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0Ll9pc0FNb21lbnRPYmplY3QgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIFwibW9tZW50XCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBwYXRoXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBnZXRTdWdnZXN0aW9uKG9wdGlvbiwgb3B0aW9ucywgcGF0aCkge1xuICAgIGNvbnN0IGxvY2FsU2VhcmNoID0gVmFsaWRhdG9yLmZpbmRJbk9wdGlvbnMob3B0aW9uLCBvcHRpb25zLCBwYXRoLCBmYWxzZSk7XG4gICAgY29uc3QgZ2xvYmFsU2VhcmNoID0gVmFsaWRhdG9yLmZpbmRJbk9wdGlvbnMob3B0aW9uLCBhbGxPcHRpb25zLCBbXSwgdHJ1ZSk7XG5cbiAgICBjb25zdCBsb2NhbFNlYXJjaFRocmVzaG9sZCA9IDg7XG4gICAgY29uc3QgZ2xvYmFsU2VhcmNoVGhyZXNob2xkID0gNDtcblxuICAgIGxldCBtc2c7XG4gICAgaWYgKGxvY2FsU2VhcmNoLmluZGV4TWF0Y2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXNnID1cbiAgICAgICAgXCIgaW4gXCIgK1xuICAgICAgICBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihsb2NhbFNlYXJjaC5wYXRoLCBvcHRpb24sIFwiXCIpICtcbiAgICAgICAgJ1BlcmhhcHMgaXQgd2FzIGluY29tcGxldGU/IERpZCB5b3UgbWVhbjogXCInICtcbiAgICAgICAgbG9jYWxTZWFyY2guaW5kZXhNYXRjaCArXG4gICAgICAgICdcIj9cXG5cXG4nO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBnbG9iYWxTZWFyY2guZGlzdGFuY2UgPD0gZ2xvYmFsU2VhcmNoVGhyZXNob2xkICYmXG4gICAgICBsb2NhbFNlYXJjaC5kaXN0YW5jZSA+IGdsb2JhbFNlYXJjaC5kaXN0YW5jZVxuICAgICkge1xuICAgICAgbXNnID1cbiAgICAgICAgXCIgaW4gXCIgK1xuICAgICAgICBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihsb2NhbFNlYXJjaC5wYXRoLCBvcHRpb24sIFwiXCIpICtcbiAgICAgICAgXCJQZXJoYXBzIGl0IHdhcyBtaXNwbGFjZWQ/IE1hdGNoaW5nIG9wdGlvbiBmb3VuZCBhdDogXCIgK1xuICAgICAgICBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihcbiAgICAgICAgICBnbG9iYWxTZWFyY2gucGF0aCxcbiAgICAgICAgICBnbG9iYWxTZWFyY2guY2xvc2VzdE1hdGNoLFxuICAgICAgICAgIFwiXCJcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxvY2FsU2VhcmNoLmRpc3RhbmNlIDw9IGxvY2FsU2VhcmNoVGhyZXNob2xkKSB7XG4gICAgICBtc2cgPVxuICAgICAgICAnLiBEaWQgeW91IG1lYW4gXCInICtcbiAgICAgICAgbG9jYWxTZWFyY2guY2xvc2VzdE1hdGNoICtcbiAgICAgICAgJ1wiPycgK1xuICAgICAgICBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihsb2NhbFNlYXJjaC5wYXRoLCBvcHRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBtc2cgPVxuICAgICAgICBcIi4gRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZTogXCIgK1xuICAgICAgICBWYWxpZGF0b3IucHJpbnQoT2JqZWN0LmtleXMob3B0aW9ucykpICtcbiAgICAgICAgVmFsaWRhdG9yLnByaW50TG9jYXRpb24ocGF0aCwgb3B0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgJyVjVW5rbm93biBvcHRpb24gZGV0ZWN0ZWQ6IFwiJyArIG9wdGlvbiArICdcIicgKyBtc2csXG4gICAgICBWQUxJREFUT1JfUFJJTlRfU1RZTEVcbiAgICApO1xuICAgIGVycm9yRm91bmQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYXZlcnNlIHRoZSBvcHRpb25zIGluIHNlYXJjaCBmb3IgYSBtYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVjdXJzaXZlPWZhbHNlXVxuICAgKiBAcmV0dXJucyB7e2Nsb3Nlc3RNYXRjaDogc3RyaW5nLCBwYXRoOiBBcnJheSwgZGlzdGFuY2U6IG51bWJlcn19XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBmaW5kSW5PcHRpb25zKG9wdGlvbiwgb3B0aW9ucywgcGF0aCwgcmVjdXJzaXZlID0gZmFsc2UpIHtcbiAgICBsZXQgbWluID0gMWU5O1xuICAgIGxldCBjbG9zZXN0TWF0Y2ggPSBcIlwiO1xuICAgIGxldCBjbG9zZXN0TWF0Y2hQYXRoID0gW107XG4gICAgY29uc3QgbG93ZXJDYXNlT3B0aW9uID0gb3B0aW9uLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGluZGV4TWF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBvcCBpbiBvcHRpb25zKSB7XG4gICAgICBsZXQgZGlzdGFuY2U7XG4gICAgICBpZiAob3B0aW9uc1tvcF0uX190eXBlX18gIT09IHVuZGVmaW5lZCAmJiByZWN1cnNpdmUgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gVmFsaWRhdG9yLmZpbmRJbk9wdGlvbnMoXG4gICAgICAgICAgb3B0aW9uLFxuICAgICAgICAgIG9wdGlvbnNbb3BdLFxuICAgICAgICAgIGNvcHlBbmRFeHRlbmRBcnJheShwYXRoLCBvcClcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG1pbiA+IHJlc3VsdC5kaXN0YW5jZSkge1xuICAgICAgICAgIGNsb3Nlc3RNYXRjaCA9IHJlc3VsdC5jbG9zZXN0TWF0Y2g7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoUGF0aCA9IHJlc3VsdC5wYXRoO1xuICAgICAgICAgIG1pbiA9IHJlc3VsdC5kaXN0YW5jZTtcbiAgICAgICAgICBpbmRleE1hdGNoID0gcmVzdWx0LmluZGV4TWF0Y2g7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcC50b0xvd2VyQ2FzZSgpLmluZGV4T2YobG93ZXJDYXNlT3B0aW9uKSAhPT0gLTEpIHtcbiAgICAgICAgICBpbmRleE1hdGNoID0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2UgPSBWYWxpZGF0b3IubGV2ZW5zaHRlaW5EaXN0YW5jZShvcHRpb24sIG9wKTtcbiAgICAgICAgaWYgKG1pbiA+IGRpc3RhbmNlKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoID0gb3A7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoUGF0aCA9IGNvcHlBcnJheShwYXRoKTtcbiAgICAgICAgICBtaW4gPSBkaXN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY2xvc2VzdE1hdGNoOiBjbG9zZXN0TWF0Y2gsXG4gICAgICBwYXRoOiBjbG9zZXN0TWF0Y2hQYXRoLFxuICAgICAgZGlzdGFuY2U6IG1pbixcbiAgICAgIGluZGV4TWF0Y2g6IGluZGV4TWF0Y2gsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBwYXRoXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcHJpbnRMb2NhdGlvbihwYXRoLCBvcHRpb24sIHByZWZpeCA9IFwiUHJvYmxlbSB2YWx1ZSBmb3VuZCBhdDogXFxuXCIpIHtcbiAgICBsZXQgc3RyID0gXCJcXG5cXG5cIiArIHByZWZpeCArIFwib3B0aW9ucyA9IHtcXG5cIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaSArIDE7IGorKykge1xuICAgICAgICBzdHIgKz0gXCIgIFwiO1xuICAgICAgfVxuICAgICAgc3RyICs9IHBhdGhbaV0gKyBcIjoge1xcblwiO1xuICAgIH1cbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdGgubGVuZ3RoICsgMTsgaisrKSB7XG4gICAgICBzdHIgKz0gXCIgIFwiO1xuICAgIH1cbiAgICBzdHIgKz0gb3B0aW9uICsgXCJcXG5cIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdGgubGVuZ3RoIC0gaTsgaisrKSB7XG4gICAgICAgIHN0ciArPSBcIiAgXCI7XG4gICAgICB9XG4gICAgICBzdHIgKz0gXCJ9XFxuXCI7XG4gICAgfVxuICAgIHJldHVybiBzdHIgKyBcIlxcblxcblwiO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwcmludChvcHRpb25zKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpXG4gICAgICAucmVwbGFjZSgvKFwiKXwoXFxbKXwoXFxdKXwoLFwiX190eXBlX19cIikvZywgXCJcIilcbiAgICAgIC5yZXBsYWNlKC8oLCkvZywgXCIsIFwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQ29tcHV0ZSB0aGUgZWRpdCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gc3RyaW5nc1xuICAgKiBodHRwOi8vZW4ud2lraWJvb2tzLm9yZy93aWtpL0FsZ29yaXRobV9JbXBsZW1lbnRhdGlvbi9TdHJpbmdzL0xldmVuc2h0ZWluX2Rpc3RhbmNlI0phdmFTY3JpcHRcbiAgICpcbiAgICogQ29weXJpZ2h0IChjKSAyMDExIEFuZHJlaSBNYWNrZW56aWVcbiAgICpcbiAgICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICpcbiAgICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gICAqXG4gICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYVxuICAgKiBAcGFyYW0ge3N0cmluZ30gYlxuICAgKiBAcmV0dXJucyB7QXJyYXkuPEFycmF5LjxudW1iZXI+Pn19XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBsZXZlbnNodGVpbkRpc3RhbmNlKGEsIGIpIHtcbiAgICBpZiAoYS5sZW5ndGggPT09IDApIHJldHVybiBiLmxlbmd0aDtcbiAgICBpZiAoYi5sZW5ndGggPT09IDApIHJldHVybiBhLmxlbmd0aDtcblxuICAgIGNvbnN0IG1hdHJpeCA9IFtdO1xuXG4gICAgLy8gaW5jcmVtZW50IGFsb25nIHRoZSBmaXJzdCBjb2x1bW4gb2YgZWFjaCByb3dcbiAgICBsZXQgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdHJpeFtpXSA9IFtpXTtcbiAgICB9XG5cbiAgICAvLyBpbmNyZW1lbnQgZWFjaCBjb2x1bW4gaW4gdGhlIGZpcnN0IHJvd1xuICAgIGxldCBqO1xuICAgIGZvciAoaiA9IDA7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgbWF0cml4WzBdW2pdID0gajtcbiAgICB9XG5cbiAgICAvLyBGaWxsIGluIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGkgPSAxOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoaiA9IDE7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoYi5jaGFyQXQoaSAtIDEpID09IGEuY2hhckF0KGogLSAxKSkge1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMV1baiAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IE1hdGgubWluKFxuICAgICAgICAgICAgbWF0cml4W2kgLSAxXVtqIC0gMV0gKyAxLCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICAgICAgIE1hdGgubWluKFxuICAgICAgICAgICAgICBtYXRyaXhbaV1baiAtIDFdICsgMSwgLy8gaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTsgLy8gZGVsZXRpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRyaXhbYi5sZW5ndGhdW2EubGVuZ3RoXTtcbiAgfVxufVxuXG5jb25zdCBBY3RpdmF0b3IkMSA9IEFjdGl2YXRvcjtcclxuY29uc3QgQ29sb3JQaWNrZXIkMSA9IENvbG9yUGlja2VyO1xyXG5jb25zdCBDb25maWd1cmF0b3IkMSA9IENvbmZpZ3VyYXRvcjtcclxuY29uc3QgSGFtbWVyJDEgPSBIYW1tZXI7XHJcbmNvbnN0IFBvcHVwJDEgPSBQb3B1cDtcclxuY29uc3QgVkFMSURBVE9SX1BSSU5UX1NUWUxFJDEgPSBWQUxJREFUT1JfUFJJTlRfU1RZTEU7XHJcbmNvbnN0IFZhbGlkYXRvciQxID0gVmFsaWRhdG9yO1xuXG5leHBvcnQgeyBBY3RpdmF0b3IkMSBhcyBBY3RpdmF0b3IsIEFsZWEsIENvbG9yUGlja2VyJDEgYXMgQ29sb3JQaWNrZXIsIENvbmZpZ3VyYXRvciQxIGFzIENvbmZpZ3VyYXRvciwgREVMRVRFLCBIU1ZUb0hleCwgSFNWVG9SR0IsIEhhbW1lciQxIGFzIEhhbW1lciwgUG9wdXAkMSBhcyBQb3B1cCwgUkdCVG9IU1YsIFJHQlRvSGV4LCBWQUxJREFUT1JfUFJJTlRfU1RZTEUkMSBhcyBWQUxJREFUT1JfUFJJTlRfU1RZTEUsIFZhbGlkYXRvciQxIGFzIFZhbGlkYXRvciwgYWRkQ2xhc3NOYW1lLCBhZGRDc3NUZXh0LCBhZGRFdmVudExpc3RlbmVyLCBiaW5hcnlTZWFyY2hDdXN0b20sIGJpbmFyeVNlYXJjaFZhbHVlLCBicmlkZ2VPYmplY3QsIGNvcHlBbmRFeHRlbmRBcnJheSwgY29weUFycmF5LCBkZWVwRXh0ZW5kLCBkZWVwT2JqZWN0QXNzaWduLCBlYXNpbmdGdW5jdGlvbnMsIGVxdWFsQXJyYXksIGV4dGVuZCwgZmlsbElmRGVmaW5lZCwgZm9yRWFjaCwgZ2V0QWJzb2x1dGVMZWZ0LCBnZXRBYnNvbHV0ZVJpZ2h0LCBnZXRBYnNvbHV0ZVRvcCwgZ2V0U2Nyb2xsQmFyV2lkdGgsIGdldFRhcmdldCwgZ2V0VHlwZSwgaGFzUGFyZW50LCBoZXhUb0hTViwgaGV4VG9SR0IsIGluc2VydFNvcnQsIGlzRGF0ZSwgaXNOdW1iZXIsIGlzT2JqZWN0LCBpc1N0cmluZywgaXNWYWxpZEhleCwgaXNWYWxpZFJHQiwgaXNWYWxpZFJHQkEsIG1lcmdlT3B0aW9ucywgb3B0aW9uLCBvdmVycmlkZU9wYWNpdHksIHBhcnNlQ29sb3IsIHByZXZlbnREZWZhdWx0LCBwdXJlRGVlcE9iamVjdEFzc2lnbiwgcmVjdXJzaXZlRE9NRGVsZXRlLCByZW1vdmVDbGFzc05hbWUsIHJlbW92ZUNzc1RleHQsIHJlbW92ZUV2ZW50TGlzdGVuZXIsIHNlbGVjdGl2ZUJyaWRnZU9iamVjdCwgc2VsZWN0aXZlRGVlcEV4dGVuZCwgc2VsZWN0aXZlRXh0ZW5kLCBzZWxlY3RpdmVOb3REZWVwRXh0ZW5kLCB0aHJvdHRsZSwgdG9BcnJheSwgdG9wTW9zdCwgdXBkYXRlUHJvcGVydHkgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZpcy11dGlsLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBybmc7XG5cbnZhciBfY3J5cHRvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY3J5cHRvXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gcm5nKCkge1xuICByZXR1cm4gX2NyeXB0by5kZWZhdWx0LnJhbmRvbUJ5dGVzKDE2KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbi8qKlxuICogQ29udmVydCBhcnJheSBvZiAxNiBieXRlIHZhbHVlcyB0byBVVUlEIHN0cmluZyBmb3JtYXQgb2YgdGhlIGZvcm06XG4gKiBYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcbiAqL1xudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9VdWlkKGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gb2Zmc2V0IHx8IDA7XG4gIHZhciBidGggPSBieXRlVG9IZXg7IC8vIGpvaW4gdXNlZCB0byBmaXggbWVtb3J5IGlzc3VlIGNhdXNlZCBieSBjb25jYXRlbmF0aW9uOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMTc1I2M0XG5cbiAgcmV0dXJuIFtidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sICctJywgYnRoW2J1ZltpKytdXSwgYnRoW2J1ZltpKytdXSwgJy0nLCBidGhbYnVmW2krK11dLCBidGhbYnVmW2krK11dLCAnLScsIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV0sIGJ0aFtidWZbaSsrXV1dLmpvaW4oJycpO1xufVxuXG52YXIgX2RlZmF1bHQgPSBieXRlc1RvVXVpZDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xuXG52YXIgX2J5dGVzVG9VdWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ieXRlc1RvVXVpZC5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8vICoqYHYxKClgIC0gR2VuZXJhdGUgdGltZS1iYXNlZCBVVUlEKipcbi8vXG4vLyBJbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vTGlvc0svVVVJRC5qc1xuLy8gYW5kIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91dWlkLmh0bWxcbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBbXTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgX3JuZy5kZWZhdWx0KSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IG5ldyBEYXRlKCkuZ2V0VGltZSgpOyAvLyBQZXIgNC4yLjEuMiwgdXNlIGNvdW50IG9mIHV1aWQncyBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBjdXJyZW50IGNsb2NrXG4gIC8vIGN5Y2xlIHRvIHNpbXVsYXRlIGhpZ2hlciByZXNvbHV0aW9uIGNsb2NrXG5cbiAgdmFyIG5zZWNzID0gb3B0aW9ucy5uc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5uc2VjcyA6IF9sYXN0TlNlY3MgKyAxOyAvLyBUaW1lIHNpbmNlIGxhc3QgdXVpZCBjcmVhdGlvbiAoaW4gbXNlY3MpXG5cbiAgdmFyIGR0ID0gbXNlY3MgLSBfbGFzdE1TZWNzICsgKG5zZWNzIC0gX2xhc3ROU2VjcykgLyAxMDAwMDsgLy8gUGVyIDQuMi4xLjIsIEJ1bXAgY2xvY2tzZXEgb24gY2xvY2sgcmVncmVzc2lvblxuXG4gIGlmIChkdCA8IDAgJiYgb3B0aW9ucy5jbG9ja3NlcSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY2xvY2tzZXEgPSBjbG9ja3NlcSArIDEgJiAweDNmZmY7XG4gIH0gLy8gUmVzZXQgbnNlY3MgaWYgY2xvY2sgcmVncmVzc2VzIChuZXcgY2xvY2tzZXEpIG9yIHdlJ3ZlIG1vdmVkIG9udG8gYSBuZXdcbiAgLy8gdGltZSBpbnRlcnZhbFxuXG5cbiAgaWYgKChkdCA8IDAgfHwgbXNlY3MgPiBfbGFzdE1TZWNzKSAmJiBvcHRpb25zLm5zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBuc2VjcyA9IDA7XG4gIH0gLy8gUGVyIDQuMi4xLjIgVGhyb3cgZXJyb3IgaWYgdG9vIG1hbnkgdXVpZHMgYXJlIHJlcXVlc3RlZFxuXG5cbiAgaWYgKG5zZWNzID49IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWNcIik7XG4gIH1cblxuICBfbGFzdE1TZWNzID0gbXNlY3M7XG4gIF9sYXN0TlNlY3MgPSBuc2VjcztcbiAgX2Nsb2Nrc2VxID0gY2xvY2tzZXE7IC8vIFBlciA0LjEuNCAtIENvbnZlcnQgZnJvbSB1bml4IGVwb2NoIHRvIEdyZWdvcmlhbiBlcG9jaFxuXG4gIG1zZWNzICs9IDEyMjE5MjkyODAwMDAwOyAvLyBgdGltZV9sb3dgXG5cbiAgdmFyIHRsID0gKChtc2VjcyAmIDB4ZmZmZmZmZikgKiAxMDAwMCArIG5zZWNzKSAlIDB4MTAwMDAwMDAwO1xuICBiW2krK10gPSB0bCA+Pj4gMjQgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gMTYgJiAweGZmO1xuICBiW2krK10gPSB0bCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsICYgMHhmZjsgLy8gYHRpbWVfbWlkYFxuXG4gIHZhciB0bWggPSBtc2VjcyAvIDB4MTAwMDAwMDAwICogMTAwMDAgJiAweGZmZmZmZmY7XG4gIGJbaSsrXSA9IHRtaCA+Pj4gOCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRtaCAmIDB4ZmY7IC8vIGB0aW1lX2hpZ2hfYW5kX3ZlcnNpb25gXG5cbiAgYltpKytdID0gdG1oID4+PiAyNCAmIDB4ZiB8IDB4MTA7IC8vIGluY2x1ZGUgdmVyc2lvblxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMTYgJiAweGZmOyAvLyBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGAgKFBlciA0LjIuMiAtIGluY2x1ZGUgdmFyaWFudClcblxuICBiW2krK10gPSBjbG9ja3NlcSA+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmID8gYnVmIDogKDAsIF9ieXRlc1RvVXVpZC5kZWZhdWx0KShiKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gdjE7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG5leHBvcnRzLlVSTCA9IGV4cG9ydHMuRE5TID0gdm9pZCAwO1xuXG52YXIgX2J5dGVzVG9VdWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ieXRlc1RvVXVpZC5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHV1aWRUb0J5dGVzKHV1aWQpIHtcbiAgLy8gTm90ZTogV2UgYXNzdW1lIHdlJ3JlIGJlaW5nIHBhc3NlZCBhIHZhbGlkIHV1aWQgc3RyaW5nXG4gIHZhciBieXRlcyA9IFtdO1xuICB1dWlkLnJlcGxhY2UoL1thLWZBLUYwLTldezJ9L2csIGZ1bmN0aW9uIChoZXgpIHtcbiAgICBieXRlcy5wdXNoKHBhcnNlSW50KGhleCwgMTYpKTtcbiAgfSk7XG4gIHJldHVybiBieXRlcztcbn1cblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IG5ldyBBcnJheShzdHIubGVuZ3RoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGJ5dGVzW2ldID0gc3RyLmNoYXJDb2RlQXQoaSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmNvbnN0IEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0cy5ETlMgPSBETlM7XG5jb25zdCBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydHMuVVJMID0gVVJMO1xuXG5mdW5jdGlvbiBfZGVmYXVsdChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICB2YXIgZ2VuZXJhdGVVVUlEID0gZnVuY3Rpb24gKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgdmFyIG9mZiA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnKSB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09ICdzdHJpbmcnKSBuYW1lc3BhY2UgPSB1dWlkVG9CeXRlcyhuYW1lc3BhY2UpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHRocm93IFR5cGVFcnJvcigndmFsdWUgbXVzdCBiZSBhbiBhcnJheSBvZiBieXRlcycpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShuYW1lc3BhY2UpIHx8IG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB0aHJvdyBUeXBlRXJyb3IoJ25hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzJyk7IC8vIFBlciA0LjNcblxuICAgIHZhciBieXRlcyA9IGhhc2hmdW5jKG5hbWVzcGFjZS5jb25jYXQodmFsdWUpKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgMTY7ICsraWR4KSB7XG4gICAgICAgIGJ1ZltvZmYgKyBpZHhdID0gYnl0ZXNbaWR4XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmIHx8ICgwLCBfYnl0ZXNUb1V1aWQuZGVmYXVsdCkoYnl0ZXMpO1xuICB9OyAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lO1xuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX2NyeXB0byA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNyeXB0b1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgYnl0ZXMgPSBCdWZmZXIuZnJvbShieXRlcywgJ3V0ZjgnKTtcbiAgfVxuXG4gIHJldHVybiBfY3J5cHRvLmRlZmF1bHQuY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKGJ5dGVzKS5kaWdlc3QoKTtcbn1cblxudmFyIF9kZWZhdWx0ID0gbWQ1O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcblxudmFyIF92ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92MzUuanNcIikpO1xuXG52YXIgX21kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9tZDUuanNcIikpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5jb25zdCB2MyA9ICgwLCBfdi5kZWZhdWx0KSgndjMnLCAweDMwLCBfbWQuZGVmYXVsdCk7XG52YXIgX2RlZmF1bHQgPSB2MztcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfcm5nID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ybmcuanNcIikpO1xuXG52YXIgX2J5dGVzVG9VdWlkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ieXRlc1RvVXVpZC5qc1wiKSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnc3RyaW5nJykge1xuICAgIGJ1ZiA9IG9wdGlvbnMgPT09ICdiaW5hcnknID8gbmV3IEFycmF5KDE2KSA6IG51bGw7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBfcm5nLmRlZmF1bHQpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgMTY7ICsraWkpIHtcbiAgICAgIGJ1ZltpICsgaWldID0gcm5kc1tpaV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCAoMCwgX2J5dGVzVG9VdWlkLmRlZmF1bHQpKHJuZHMpO1xufVxuXG52YXIgX2RlZmF1bHQgPSB2NDtcbmV4cG9ydHMuZGVmYXVsdCA9IF9kZWZhdWx0O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzLmRlZmF1bHQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG5cbnZhciBfY3J5cHRvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY3J5cHRvXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICBpZiAoQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICBieXRlcyA9IEJ1ZmZlci5mcm9tKGJ5dGVzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgYnl0ZXMgPSBCdWZmZXIuZnJvbShieXRlcywgJ3V0ZjgnKTtcbiAgfVxuXG4gIHJldHVybiBfY3J5cHRvLmRlZmF1bHQuY3JlYXRlSGFzaCgnc2hhMScpLnVwZGF0ZShieXRlcykuZGlnZXN0KCk7XG59XG5cbnZhciBfZGVmYXVsdCA9IHNoYTE7XG5leHBvcnRzLmRlZmF1bHQgPSBfZGVmYXVsdDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cy5kZWZhdWx0OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuXG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YzNS5qc1wiKSk7XG5cbnZhciBfc2hhID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zaGExLmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuY29uc3QgdjUgPSAoMCwgX3YuZGVmYXVsdCkoJ3Y1JywgMHg1MCwgX3NoYS5kZWZhdWx0KTtcbnZhciBfZGVmYXVsdCA9IHY1O1xuZXhwb3J0cy5kZWZhdWx0ID0gX2RlZmF1bHQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHMuZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInYxXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF92LmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3YyLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3YzLmRlZmF1bHQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwidjVcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3Y0LmRlZmF1bHQ7XG4gIH1cbn0pO1xuXG52YXIgX3YgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3YxLmpzXCIpKTtcblxudmFyIF92MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vdjMuanNcIikpO1xuXG52YXIgX3YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92NC5qc1wiKSk7XG5cbnZhciBfdjQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3Y1LmpzXCIpKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH0iLCIvKipcbiAqIHZpcy1kYXRhXG4gKiBodHRwOi8vdmlzanMub3JnL1xuICpcbiAqIE1hbmFnZSB1bnN0cnVjdHVyZWQgZGF0YSB1c2luZyBEYXRhU2V0LiBBZGQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBkYXRhLCBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBkYXRhLlxuICpcbiAqIEB2ZXJzaW9uIDcuMS4yXG4gKiBAZGF0ZSAgICAyMDIxLTAxLTA4VDIwOjM3OjExLjYwMVpcbiAqXG4gKiBAY29weXJpZ2h0IChjKSAyMDExLTIwMTcgQWxtZW5kZSBCLlYsIGh0dHA6Ly9hbG1lbmRlLmNvbVxuICogQGNvcHlyaWdodCAoYykgMjAxNy0yMDE5IHZpc2pzIGNvbnRyaWJ1dG9ycywgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2pzXG4gKlxuICogQGxpY2Vuc2VcbiAqIHZpcy5qcyBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIGJvdGhcbiAqXG4gKiAgIDEuIFRoZSBBcGFjaGUgMi4wIExpY2Vuc2VcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogICBhbmRcbiAqXG4gKiAgIDIuIFRoZSBNSVQgTGljZW5zZVxuICogICAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogdmlzLmpzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBlaXRoZXIgbGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBwdXJlRGVlcE9iamVjdEFzc2lnbiB9IGZyb20gJ3Zpcy11dGlsL2VzbmV4dC9lc20vdmlzLXV0aWwuanMnO1xuZXhwb3J0IHsgREVMRVRFIH0gZnJvbSAndmlzLXV0aWwvZXNuZXh0L2VzbS92aXMtdXRpbC5qcyc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuXG4vKipcclxuICogQ3JlYXRlIG5ldyBkYXRhIHBpcGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBmcm9tIC0gVGhlIHNvdXJjZSBkYXRhIHNldCBvciBkYXRhIHZpZXcuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIEV4YW1wbGUgdXNhZ2U6XHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW50ZXJmYWNlIEFwcEl0ZW0ge1xyXG4gKiAgIHdob2FtaTogc3RyaW5nO1xyXG4gKiAgIGFwcERhdGE6IHVua25vd247XHJcbiAqICAgdmlzRGF0YTogVmlzSXRlbTtcclxuICogfVxyXG4gKiBpbnRlcmZhY2UgVmlzSXRlbSB7XHJcbiAqICAgaWQ6IG51bWJlcjtcclxuICogICBsYWJlbDogc3RyaW5nO1xyXG4gKiAgIGNvbG9yOiBzdHJpbmc7XHJcbiAqICAgeDogbnVtYmVyO1xyXG4gKiAgIHk6IG51bWJlcjtcclxuICogfVxyXG4gKlxyXG4gKiBjb25zdCBkczEgPSBuZXcgRGF0YVNldDxBcHBJdGVtLCBcIndob2FtaVwiPihbXSwgeyBmaWVsZElkOiBcIndob2FtaVwiIH0pO1xyXG4gKiBjb25zdCBkczIgPSBuZXcgRGF0YVNldDxWaXNJdGVtLCBcImlkXCI+KCk7XHJcbiAqXHJcbiAqIGNvbnN0IHBpcGUgPSBjcmVhdGVOZXdEYXRhUGlwZUZyb20oZHMxKVxyXG4gKiAgIC5maWx0ZXIoKGl0ZW0pOiBib29sZWFuID0+IGl0ZW0uZW5hYmxlZCA9PT0gdHJ1ZSlcclxuICogICAubWFwPFZpc0l0ZW0sIFwiaWRcIj4oKGl0ZW0pOiBWaXNJdGVtID0+IGl0ZW0udmlzRGF0YSlcclxuICogICAudG8oZHMyKTtcclxuICpcclxuICogcGlwZS5zdGFydCgpO1xyXG4gKiBgYGBcclxuICpcclxuICogQHJldHVybnMgQSBmYWN0b3J5IHdob3NlIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwaXBlLlxyXG4gKi9cclxuZnVuY3Rpb24gY3JlYXRlTmV3RGF0YVBpcGVGcm9tKGZyb20pIHtcclxuICAgIHJldHVybiBuZXcgRGF0YVBpcGVVbmRlckNvbnN0cnVjdGlvbihmcm9tKTtcclxufVxyXG4vKipcclxuICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBpcGUuIFRoaXMgc2hvdWxkIGJlIGFjY2Vzc2libGUgb25seSB0aHJvdWdoXHJcbiAqIGBjcmVhdGVOZXdEYXRhUGlwZUZyb21gIGZyb20gdGhlIG91dHNpZGUuXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gU0kgLSBTb3VyY2UgaXRlbSB0eXBlLlxyXG4gKiBAdHlwZVBhcmFtIFNQIC0gU291cmNlIGl0ZW0gdHlwZSdzIGlkIHByb3BlcnR5IG5hbWUuXHJcbiAqIEB0eXBlUGFyYW0gVEkgLSBUYXJnZXQgaXRlbSB0eXBlLlxyXG4gKiBAdHlwZVBhcmFtIFRQIC0gVGFyZ2V0IGl0ZW0gdHlwZSdzIGlkIHByb3BlcnR5IG5hbWUuXHJcbiAqL1xyXG5jbGFzcyBTaW1wbGVEYXRhUGlwZSB7XHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZSBhIG5ldyBkYXRhIHBpcGUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIF9zb3VyY2UgLSBUaGUgZGF0YSBzZXQgb3IgZGF0YSB2aWV3IHRoYXQgd2lsbCBiZSBvYnNlcnZlZC5cclxuICAgICAqIEBwYXJhbSBfdHJhbnNmb3JtZXJzIC0gQW4gYXJyYXkgb2YgdHJhbnNmb3JtaW5nIGZ1bmN0aW9ucyB0byBiZSB1c2VkIHRvXHJcbiAgICAgKiBmaWx0ZXIgb3IgdHJhbnNmb3JtIHRoZSBpdGVtcyBpbiB0aGUgcGlwZS5cclxuICAgICAqIEBwYXJhbSBfdGFyZ2V0IC0gVGhlIGRhdGEgc2V0IG9yIGRhdGEgdmlldyB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKF9zb3VyY2UsIF90cmFuc2Zvcm1lcnMsIF90YXJnZXQpIHtcclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBfc291cmNlO1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybWVycyA9IF90cmFuc2Zvcm1lcnM7XHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gX3RhcmdldDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBCb3VuZCBsaXN0ZW5lcnMgZm9yIHVzZSB3aXRoIGBEYXRhSW50ZXJmYWNlWydvbicgfCAnb2ZmJ11gLlxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IHtcclxuICAgICAgICAgICAgYWRkOiB0aGlzLl9hZGQuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLl9yZW1vdmUuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgdXBkYXRlOiB0aGlzLl91cGRhdGUuYmluZCh0aGlzKSxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICBhbGwoKSB7XHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0LnVwZGF0ZSh0aGlzLl90cmFuc2Zvcm1JdGVtcyh0aGlzLl9zb3VyY2UuZ2V0KCkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlLm9uKFwiYWRkXCIsIHRoaXMuX2xpc3RlbmVycy5hZGQpO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZS5vbihcInJlbW92ZVwiLCB0aGlzLl9saXN0ZW5lcnMucmVtb3ZlKTtcclxuICAgICAgICB0aGlzLl9zb3VyY2Uub24oXCJ1cGRhdGVcIiwgdGhpcy5fbGlzdGVuZXJzLnVwZGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5fc291cmNlLm9mZihcImFkZFwiLCB0aGlzLl9saXN0ZW5lcnMuYWRkKTtcclxuICAgICAgICB0aGlzLl9zb3VyY2Uub2ZmKFwicmVtb3ZlXCIsIHRoaXMuX2xpc3RlbmVycy5yZW1vdmUpO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZS5vZmYoXCJ1cGRhdGVcIiwgdGhpcy5fbGlzdGVuZXJzLnVwZGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEFwcGx5IHRoZSB0cmFuc2Zvcm1lcnMgdG8gdGhlIGl0ZW1zLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtcyAtIFRoZSBpdGVtcyB0byBiZSB0cmFuc2Zvcm1lZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIF90cmFuc2Zvcm1JdGVtcyhpdGVtcykge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90cmFuc2Zvcm1lcnMucmVkdWNlKChpdGVtcywgdHJhbnNmb3JtKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oaXRlbXMpO1xyXG4gICAgICAgIH0sIGl0ZW1zKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGFuIGFkZCBldmVudC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gX25hbWUgLSBJZ25vcmVkLlxyXG4gICAgICogQHBhcmFtIHBheWxvYWQgLSBUaGUgcGF5bG9hZCBjb250YWluaW5nIHRoZSBpZHMgb2YgdGhlIGFkZGVkIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBfYWRkKF9uYW1lLCBwYXlsb2FkKSB7XHJcbiAgICAgICAgaWYgKHBheWxvYWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX3RhcmdldC5hZGQodGhpcy5fdHJhbnNmb3JtSXRlbXModGhpcy5fc291cmNlLmdldChwYXlsb2FkLml0ZW1zKSkpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBIYW5kbGUgYW4gdXBkYXRlIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBfbmFtZSAtIElnbm9yZWQuXHJcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGlkcyBvZiB0aGUgdXBkYXRlZCBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgX3VwZGF0ZShfbmFtZSwgcGF5bG9hZCkge1xyXG4gICAgICAgIGlmIChwYXlsb2FkID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl90YXJnZXQudXBkYXRlKHRoaXMuX3RyYW5zZm9ybUl0ZW1zKHRoaXMuX3NvdXJjZS5nZXQocGF5bG9hZC5pdGVtcykpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlIGEgcmVtb3ZlIGV2ZW50LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBfbmFtZSAtIElnbm9yZWQuXHJcbiAgICAgKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBwYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGRhdGEgb2YgdGhlIHJlbW92ZWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIF9yZW1vdmUoX25hbWUsIHBheWxvYWQpIHtcclxuICAgICAgICBpZiAocGF5bG9hZCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fdGFyZ2V0LnJlbW92ZSh0aGlzLl90cmFuc2Zvcm1JdGVtcyhwYXlsb2FkLm9sZERhdGEpKTtcclxuICAgIH1cclxufVxyXG4vKipcclxuICogSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBpcGUgZmFjdG9yeS4gVGhpcyBzaG91bGQgYmUgYWNjZXNzaWJsZVxyXG4gKiBvbmx5IHRocm91Z2ggYGNyZWF0ZU5ld0RhdGFQaXBlRnJvbWAgZnJvbSB0aGUgb3V0c2lkZS5cclxuICpcclxuICogQHR5cGVQYXJhbSBUSSAtIFRhcmdldCBpdGVtIHR5cGUuXHJcbiAqIEB0eXBlUGFyYW0gVFAgLSBUYXJnZXQgaXRlbSB0eXBlJ3MgaWQgcHJvcGVydHkgbmFtZS5cclxuICovXHJcbmNsYXNzIERhdGFQaXBlVW5kZXJDb25zdHJ1Y3Rpb24ge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGUgYSBuZXcgZGF0YSBwaXBlIGZhY3RvcnkuIFRoaXMgaXMgYW4gaW50ZXJuYWwgY29uc3RydWN0b3IgdGhhdFxyXG4gICAgICogc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgdGhpcyBmaWxlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBfc291cmNlIC0gVGhlIHNvdXJjZSBkYXRhIHNldCBvciBkYXRhIHZpZXcgZm9yIHRoaXMgcGlwZS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoX3NvdXJjZSkge1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IF9zb3VyY2U7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQXJyYXkgdHJhbnNmb3JtZXJzIHVzZWQgdG8gdHJhbnNmb3JtIGl0ZW1zIHdpdGhpbiB0aGUgcGlwZS4gVGhpcyBpcyB0eXBlZFxyXG4gICAgICAgICAqIGFzIGFueSBmb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eS5cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1lcnMgPSBbXTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmlsdGVyIHRoZSBpdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZpbHRlcmluZyBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBpZiBnaXZlbiBpdGVtXHJcbiAgICAgKiBzaG91bGQgYmUgcGlwZWQgYW5kIGZhbHNlIGlmIG5vdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGlzIGZhY3RvcnkgZm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZmlsdGVyKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhbnNmb3JtZXJzLnB1c2goKGlucHV0KSA9PiBpbnB1dC5maWx0ZXIoY2FsbGJhY2spKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogTWFwIGVhY2ggc291cmNlIGl0ZW0gdG8gYSBuZXcgdHlwZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIG1hcHBpbmcgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHNvdXJjZSBpdGVtIGFuZCByZXR1cm5zXHJcbiAgICAgKiBjb3JyZXNwb25kaW5nIG1hcHBlZCBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlUGFyYW0gVEkgLSBUYXJnZXQgaXRlbSB0eXBlLlxyXG4gICAgICogQHR5cGVQYXJhbSBUUCAtIFRhcmdldCBpdGVtIHR5cGUncyBpZCBwcm9wZXJ0eSBuYW1lLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoaXMgZmFjdG9yeSBmb3IgZnVydGhlciBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBtYXAoY2FsbGJhY2spIHtcclxuICAgICAgICB0aGlzLl90cmFuc2Zvcm1lcnMucHVzaCgoaW5wdXQpID0+IGlucHV0Lm1hcChjYWxsYmFjaykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBNYXAgZWFjaCBzb3VyY2UgaXRlbSB0byB6ZXJvIG9yIG1vcmUgaXRlbXMgb2YgYSBuZXcgdHlwZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIG1hcHBpbmcgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHNvdXJjZSBpdGVtIGFuZCByZXR1cm5zXHJcbiAgICAgKiBhbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIG1hcHBlZCBpdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZVBhcmFtIFRJIC0gVGFyZ2V0IGl0ZW0gdHlwZS5cclxuICAgICAqIEB0eXBlUGFyYW0gVFAgLSBUYXJnZXQgaXRlbSB0eXBlJ3MgaWQgcHJvcGVydHkgbmFtZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGlzIGZhY3RvcnkgZm9yIGZ1cnRoZXIgY29uZmlndXJhdGlvbi5cclxuICAgICAqL1xyXG4gICAgZmxhdE1hcChjYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuX3RyYW5zZm9ybWVycy5wdXNoKChpbnB1dCkgPT4gaW5wdXQuZmxhdE1hcChjYWxsYmFjaykpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBDb25uZWN0IHRoaXMgcGlwZSB0byBnaXZlbiBkYXRhIHNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGRhdGEgc2V0IHRoYXQgd2lsbCByZWNlaXZlIHRoZSBpdGVtcyBmcm9tIHRoaXMgcGlwZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgcGlwZSBjb25uZWN0ZWQgYmV0d2VlbiBnaXZlbiBkYXRhIHNldHMgYW5kIHBlcmZvcm1pbmdcclxuICAgICAqIGNvbmZpZ3VyZWQgdHJhbnNmb3JtYXRpb24gb24gdGhlIHByb2Nlc3NlZCBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgdG8odGFyZ2V0KSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRhUGlwZSh0aGlzLl9zb3VyY2UsIHRoaXMuX3RyYW5zZm9ybWVycywgdGFyZ2V0KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSB2YWx1ZSBjYW4gYmUgdXNlZCBhcyBhbiBpZC5cclxuICpcclxuICogQHBhcmFtIHZhbHVlIC0gSW5wdXQgdmFsdWUgb2YgdW5rbm93biB0eXBlLlxyXG4gKlxyXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZCBpZCwgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gKi9cclxuZnVuY3Rpb24gaXNJZCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XHJcbn1cblxuLyoqXHJcbiAqIEEgcXVldWUuXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIG1ldGhvZCBuYW1lcyB0byBiZSByZXBsYWNlZCBieSBxdWV1ZWQgdmVyc2lvbnMuXHJcbiAqL1xyXG5jbGFzcyBRdWV1ZSB7XHJcbiAgICAvKipcclxuICAgICAqIENvbnN0cnVjdCBhIG5ldyBRdWV1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFF1ZXVlIGNvbmZpZ3VyYXRpb24uXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2V4dGVuZGVkID0gbnVsbDtcclxuICAgICAgICAvLyBvcHRpb25zXHJcbiAgICAgICAgdGhpcy5kZWxheSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5tYXggPSBJbmZpbml0eTtcclxuICAgICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcXVldWUuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBRdWV1ZSBjb25maWd1cmF0aW9uLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5kZWxheSAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICB0aGlzLmRlbGF5ID0gb3B0aW9ucy5kZWxheTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubWF4ICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF4ID0gb3B0aW9ucy5tYXg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2ZsdXNoSWZOZWVkZWQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRXh0ZW5kIGFuIG9iamVjdCB3aXRoIHF1ZXVpbmcgZnVuY3Rpb25hbGl0eS5cclxuICAgICAqIFRoZSBvYmplY3Qgd2lsbCBiZSBleHRlbmRlZCB3aXRoIGEgZnVuY3Rpb24gZmx1c2gsIGFuZCB0aGUgbWV0aG9kcyBwcm92aWRlZCBpbiBvcHRpb25zLnJlcGxhY2Ugd2lsbCBiZSByZXBsYWNlZCB3aXRoIHF1ZXVlZCBvbmVzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvYmplY3QgLSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcXVldWUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBleHRlbmQob2JqZWN0LCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgcXVldWUgPSBuZXcgUXVldWUob3B0aW9ucyk7XHJcbiAgICAgICAgaWYgKG9iamVjdC5mbHVzaCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRhcmdldCBvYmplY3QgYWxyZWFkeSBoYXMgYSBwcm9wZXJ0eSBmbHVzaFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqZWN0LmZsdXNoID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBxdWV1ZS5mbHVzaCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgY29uc3QgbWV0aG9kcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogXCJmbHVzaFwiLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWw6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmVwbGFjZSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMucmVwbGFjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IG9wdGlvbnMucmVwbGFjZVtpXTtcclxuICAgICAgICAgICAgICAgIG1ldGhvZHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAvLyBAVE9ETzogYmV0dGVyIHNvbHV0aW9uP1xyXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsOiBvYmplY3RbbmFtZV0sXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIC8vIEBUT0RPOiBiZXR0ZXIgc29sdXRpb24/XHJcbiAgICAgICAgICAgICAgICBxdWV1ZS5yZXBsYWNlKG9iamVjdCwgbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcXVldWUuX2V4dGVuZGVkID0ge1xyXG4gICAgICAgICAgICBvYmplY3Q6IG9iamVjdCxcclxuICAgICAgICAgICAgbWV0aG9kczogbWV0aG9kcyxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBxdWV1ZTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRGVzdHJveSB0aGUgcXVldWUuIFRoZSBxdWV1ZSB3aWxsIGZpcnN0IGZsdXNoIGFsbCBxdWV1ZWQgYWN0aW9ucywgYW5kIGluIGNhc2UgaXQgaGFzIGV4dGVuZGVkIGFuIG9iamVjdCwgd2lsbCByZXN0b3JlIHRoZSBvcmlnaW5hbCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgICAgIGlmICh0aGlzLl9leHRlbmRlZCkge1xyXG4gICAgICAgICAgICBjb25zdCBvYmplY3QgPSB0aGlzLl9leHRlbmRlZC5vYmplY3Q7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGhvZHMgPSB0aGlzLl9leHRlbmRlZC5tZXRob2RzO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGhvZCA9IG1ldGhvZHNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kLm9yaWdpbmFsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQFRPRE86IGJldHRlciBzb2x1dGlvbj9cclxuICAgICAgICAgICAgICAgICAgICBvYmplY3RbbWV0aG9kLm5hbWVdID0gbWV0aG9kLm9yaWdpbmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQFRPRE86IGJldHRlciBzb2x1dGlvbj9cclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0W21ldGhvZC5uYW1lXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLl9leHRlbmRlZCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlIGEgbWV0aG9kIG9uIGFuIG9iamVjdCB3aXRoIGEgcXVldWVkIHZlcnNpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIG9iamVjdCAtIE9iamVjdCBoYXZpbmcgdGhlIG1ldGhvZC5cclxuICAgICAqIEBwYXJhbSBtZXRob2QgLSBUaGUgbWV0aG9kIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHJlcGxhY2Uob2JqZWN0LCBtZXRob2QpIHtcclxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXMgLS0gRnVuY3Rpb24gdGhpcyBpcyBuZWNlc3NhcnkgaW4gdGhlIGZ1bmN0aW9uIGJlbGxvdywgc28gY2xhc3MgdGhpcyBoYXMgdG8gYmUgc2F2ZWQgaW50byBhIHZhcmlhYmxlIGhlcmUuICovXHJcbiAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsID0gb2JqZWN0W21ldGhvZF07XHJcbiAgICAgICAgaWYgKCFvcmlnaW5hbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNZXRob2QgXCIgKyBtZXRob2QgKyBcIiB1bmRlZmluZWRcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG9iamVjdFttZXRob2RdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcclxuICAgICAgICAgICAgLy8gYWRkIHRoaXMgY2FsbCB0byB0aGUgcXVldWVcclxuICAgICAgICAgICAgbWUucXVldWUoe1xyXG4gICAgICAgICAgICAgICAgYXJnczogYXJncyxcclxuICAgICAgICAgICAgICAgIGZuOiBvcmlnaW5hbCxcclxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFF1ZXVlIGEgY2FsbC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZW50cnkgLSBUaGUgZnVuY3Rpb24gb3IgZW50cnkgdG8gYmUgcXVldWVkLlxyXG4gICAgICovXHJcbiAgICBxdWV1ZShlbnRyeSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHsgZm46IGVudHJ5IH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcXVldWUucHVzaChlbnRyeSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2ZsdXNoSWZOZWVkZWQoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgd2hldGhlciB0aGUgcXVldWUgbmVlZHMgdG8gYmUgZmx1c2hlZC5cclxuICAgICAqL1xyXG4gICAgX2ZsdXNoSWZOZWVkZWQoKSB7XHJcbiAgICAgICAgLy8gZmx1c2ggd2hlbiB0aGUgbWF4aW11bSBpcyBleGNlZWRlZC5cclxuICAgICAgICBpZiAodGhpcy5fcXVldWUubGVuZ3RoID4gdGhpcy5tYXgpIHtcclxuICAgICAgICAgICAgdGhpcy5mbHVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBmbHVzaCBhZnRlciBhIHBlcmlvZCBvZiBpbmFjdGl2aXR5IHdoZW4gYSBkZWxheSBpcyBjb25maWd1cmVkXHJcbiAgICAgICAgaWYgKHRoaXMuX3RpbWVvdXQgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPiAwICYmIHR5cGVvZiB0aGlzLmRlbGF5ID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZmx1c2goKTtcclxuICAgICAgICAgICAgfSwgdGhpcy5kZWxheSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGbHVzaCBhbGwgcXVldWVkIGNhbGxzXHJcbiAgICAgKi9cclxuICAgIGZsdXNoKCkge1xyXG4gICAgICAgIHRoaXMuX3F1ZXVlLnNwbGljZSgwKS5mb3JFYWNoKChlbnRyeSkgPT4ge1xyXG4gICAgICAgICAgICBlbnRyeS5mbi5hcHBseShlbnRyeS5jb250ZXh0IHx8IGVudHJ5LmZuLCBlbnRyeS5hcmdzIHx8IFtdKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogW1tEYXRhU2V0XV0gY29kZSB0aGF0IGNhbiBiZSByZXVzZWQgaW4gW1tEYXRhVmlld11dIG9yIG90aGVyIHNpbWlsYXIgaW1wbGVtZW50YXRpb25zIG9mIFtbRGF0YUludGVyZmFjZV1dLlxyXG4gKlxyXG4gKiBAdHlwZVBhcmFtIEl0ZW0gLSBJdGVtIHR5cGUgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGlkLlxyXG4gKiBAdHlwZVBhcmFtIElkUHJvcCAtIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgY29udGFpbnMgdGhlIGlkLlxyXG4gKi9cclxuY2xhc3MgRGF0YVNldFBhcnQge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlcnMgPSB7XHJcbiAgICAgICAgICAgIFwiKlwiOiBbXSxcclxuICAgICAgICAgICAgYWRkOiBbXSxcclxuICAgICAgICAgICAgcmVtb3ZlOiBbXSxcclxuICAgICAgICAgICAgdXBkYXRlOiBbXSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBvbiBpbnN0ZWFkIChQUzogRGF0YVZpZXcuc3Vic2NyaWJlID09PSBEYXRhVmlldy5vbikuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmUgPSBEYXRhU2V0UGFydC5wcm90b3R5cGUub247XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIG9mZiBpbnN0ZWFkIChQUzogRGF0YVZpZXcudW5zdWJzY3JpYmUgPT09IERhdGFWaWV3Lm9mZikuXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZSA9IERhdGFTZXRQYXJ0LnByb3RvdHlwZS5vZmY7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFRyaWdnZXIgYW4gZXZlbnRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lLlxyXG4gICAgICogQHBhcmFtIHBheWxvYWQgLSBFdmVudCBwYXlsb2FkLlxyXG4gICAgICogQHBhcmFtIHNlbmRlcklkIC0gSWQgb2YgdGhlIHNlbmRlci5cclxuICAgICAqL1xyXG4gICAgX3RyaWdnZXIoZXZlbnQsIHBheWxvYWQsIHNlbmRlcklkKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50ID09PSBcIipcIikge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdHJpZ2dlciBldmVudCAqXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBbLi4udGhpcy5fc3Vic2NyaWJlcnNbZXZlbnRdLCAuLi50aGlzLl9zdWJzY3JpYmVyc1tcIipcIl1dLmZvckVhY2goKHN1YnNjcmliZXIpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyaWJlcihldmVudCwgcGF5bG9hZCwgc2VuZGVySWQgIT0gbnVsbCA/IHNlbmRlcklkIDogbnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFN1YnNjcmliZSB0byBhbiBldmVudCwgYWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzIE5vbi1mdW5jdGlvbiBjYWxsYmFja3MgYXJlIGlnbm9yZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZS5cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxiYWNrIG1ldGhvZC5cclxuICAgICAqL1xyXG4gICAgb24oZXZlbnQsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gQFRPRE86IE1heWJlIHRocm93IGZvciBpbnZhbGlkIGNhbGxiYWNrcz9cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVW5zdWJzY3JpYmUgZnJvbSBhbiBldmVudCwgcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzIElmIHRoZSBzYW1lIGNhbGxiYWNrIHdhcyBzdWJzY3JpYmVkIG1vcmUgdGhhbiBvbmNlICoqYWxsKiogb2NjdXJlbmNlcyB3aWxsIGJlIHJlbW92ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZS5cclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxiYWNrIG1ldGhvZC5cclxuICAgICAqL1xyXG4gICAgb2ZmKGV2ZW50LCBjYWxsYmFjaykge1xyXG4gICAgICAgIHRoaXMuX3N1YnNjcmliZXJzW2V2ZW50XSA9IHRoaXMuX3N1YnNjcmliZXJzW2V2ZW50XS5maWx0ZXIoKHN1YnNjcmliZXIpID0+IHN1YnNjcmliZXIgIT09IGNhbGxiYWNrKTtcclxuICAgIH1cclxufVxuXG4vKipcclxuICogRGF0YSBzdHJlYW1cclxuICpcclxuICogQHJlbWFya3NcclxuICogW1tEYXRhU3RyZWFtXV0gb2ZmZXJzIGFuIGFsd2F5cyB1cCB0byBkYXRlIHN0cmVhbSBvZiBpdGVtcyBmcm9tIGEgW1tEYXRhU2V0XV0gb3IgW1tEYXRhVmlld11dLlxyXG4gKiBUaGF0IG1lYW5zIHRoYXQgdGhlIHN0cmVhbSBpcyBldmFsdWF0ZWQgYXQgdGhlIHRpbWUgb2YgaXRlcmF0aW9uLCBjb252ZXJzaW9uIHRvIGFub3RoZXIgZGF0YSB0eXBlIG9yIHdoZW4gW1tjYWNoZV1dIGlzIGNhbGxlZCwgbm90IHdoZW4gdGhlIFtbRGF0YVN0cmVhbV1dIHdhcyBjcmVhdGVkLlxyXG4gKiBNdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiBmb3IgZXhhbXBsZSBbW3RvSXRlbUFycmF5XV0gbWF5IHlpZWxkIGRpZmZlcmVudCByZXN1bHRzIChpZiB0aGUgZGF0YSBzb3VyY2UgbGlrZSBmb3IgZXhhbXBsZSBbW0RhdGFTZXRdXSBnZXRzIG1vZGlmaWVkKS5cclxuICpcclxuICogQHR5cGVQYXJhbSBJdGVtIC0gVGhlIGl0ZW0gdHlwZSB0aGlzIHN0cmVhbSBpcyBnb2luZyB0byB3b3JrIHdpdGguXHJcbiAqL1xyXG5jbGFzcyBEYXRhU3RyZWFtIHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgbmV3IGRhdGEgc3RyZWFtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBwYWlycyAtIFRoZSBpZCwgaXRlbSBwYWlycy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IocGFpcnMpIHtcclxuICAgICAgICB0aGlzLl9wYWlycyA9IHBhaXJzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYW4gaXRlcmFibGUgb2Yga2V5LCB2YWx1ZSBwYWlycyBmb3IgZXZlcnkgZW50cnkgaW4gdGhlIHN0cmVhbS5cclxuICAgICAqL1xyXG4gICAgKltTeW1ib2wuaXRlcmF0b3JdKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgW2lkLCBpdGVtXSBvZiB0aGlzLl9wYWlycykge1xyXG4gICAgICAgICAgICB5aWVsZCBbaWQsIGl0ZW1dO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGFuIGl0ZXJhYmxlIG9mIGtleSwgdmFsdWUgcGFpcnMgZm9yIGV2ZXJ5IGVudHJ5IGluIHRoZSBzdHJlYW0uXHJcbiAgICAgKi9cclxuICAgICplbnRyaWVzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgW2lkLCBpdGVtXSBvZiB0aGlzLl9wYWlycykge1xyXG4gICAgICAgICAgICB5aWVsZCBbaWQsIGl0ZW1dO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGFuIGl0ZXJhYmxlIG9mIGtleXMgaW4gdGhlIHN0cmVhbS5cclxuICAgICAqL1xyXG4gICAgKmtleXMoKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBbaWRdIG9mIHRoaXMuX3BhaXJzKSB7XHJcbiAgICAgICAgICAgIHlpZWxkIGlkO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGFuIGl0ZXJhYmxlIG9mIHZhbHVlcyBpbiB0aGUgc3RyZWFtLlxyXG4gICAgICovXHJcbiAgICAqdmFsdWVzKCkge1xyXG4gICAgICAgIGZvciAoY29uc3QgWywgaXRlbV0gb2YgdGhpcy5fcGFpcnMpIHtcclxuICAgICAgICAgICAgeWllbGQgaXRlbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgaWRzIGluIHRoaXMgc3RyZWFtLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBUaGUgYXJyYXkgbWF5IGNvbnRhaW4gZHVwbGljaXRpZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGFycmF5IHdpdGggYWxsIGlkcyBmcm9tIHRoaXMgc3RyZWFtLlxyXG4gICAgICovXHJcbiAgICB0b0lkQXJyYXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9wYWlyc10ubWFwKChwYWlyKSA9PiBwYWlyWzBdKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBpdGVtcyBpbiB0aGlzIHN0cmVhbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhlIGFycmF5IG1heSBjb250YWluIGR1cGxpY2l0aWVzLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBhcnJheSB3aXRoIGFsbCBpdGVtcyBmcm9tIHRoaXMgc3RyZWFtLlxyXG4gICAgICovXHJcbiAgICB0b0l0ZW1BcnJheSgpIHtcclxuICAgICAgICByZXR1cm4gWy4uLnRoaXMuX3BhaXJzXS5tYXAoKHBhaXIpID0+IHBhaXJbMV0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVudHJpZXMgaW4gdGhpcyBzdHJlYW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIFRoZSBhcnJheSBtYXkgY29udGFpbiBkdXBsaWNpdGllcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgYXJyYXkgd2l0aCBhbGwgZW50cmllcyBmcm9tIHRoaXMgc3RyZWFtLlxyXG4gICAgICovXHJcbiAgICB0b0VudHJ5QXJyYXkoKSB7XHJcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLl9wYWlyc107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhbiBvYmplY3QgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBpdGVtcyBpbiB0aGlzIHN0cmVhbSBhY2Nlc3NpYmxlIGJ5IGlkcy5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogSW4gY2FzZSBvZiBkdXBsaWNhdGUgaWRzIChjb2VyY2VkIHRvIHN0cmluZyBzbyBgNyA9PSAnNydgKSB0aGUgbGFzdCBlbmNvdXRlcmVkIGFwcGVhcnMgaW4gdGhlIHJldHVybmVkIG9iamVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgb2JqZWN0IG1hcCBvZiBhbGwgaWQg4oaSIGl0ZW0gcGFpcnMgZnJvbSB0aGlzIHN0cmVhbS5cclxuICAgICAqL1xyXG4gICAgdG9PYmplY3RNYXAoKSB7XHJcbiAgICAgICAgY29uc3QgbWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgaXRlbV0gb2YgdGhpcy5fcGFpcnMpIHtcclxuICAgICAgICAgICAgbWFwW2lkXSA9IGl0ZW07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJldHVybiBhIG1hcCBjb250YWluaW5nIGFsbCB0aGUgaXRlbXMgaW4gdGhpcyBzdHJlYW0gYWNjZXNzaWJsZSBieSBpZHMuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIG1hcCBvZiBhbGwgaWQg4oaSIGl0ZW0gcGFpcnMgZnJvbSB0aGlzIHN0cmVhbS5cclxuICAgICAqL1xyXG4gICAgdG9NYXAoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBNYXAodGhpcy5fcGFpcnMpO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgdGhlICh1bmlxdWUpIGlkcyBpbiB0aGlzIHN0cmVhbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0IG9mIGFsbCBpZHMgZnJvbSB0aGlzIHN0cmVhbS5cclxuICAgICAqL1xyXG4gICAgdG9JZFNldCgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFNldCh0aGlzLnRvSWRBcnJheSgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIHRoZSAodW5pcXVlKSBpdGVtcyBpbiB0aGlzIHN0cmVhbS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0IG9mIGFsbCBpdGVtcyBmcm9tIHRoaXMgc3RyZWFtLlxyXG4gICAgICovXHJcbiAgICB0b0l0ZW1TZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBTZXQodGhpcy50b0l0ZW1BcnJheSgpKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQ2FjaGUgdGhlIGl0ZW1zIGZyb20gdGhpcyBzdHJlYW0uXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgaXRlbXMgdG8gYmUgZmV0Y2hlZCBpbW1lZGlhdGVsbHkgYW5kIHVzZWQgKHBvc3NpYmx5IG11bHRpcGxlIHRpbWVzKSBsYXRlci5cclxuICAgICAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UgYXMgW1tEYXRhU3RyZWFtXV0gd291bGQgb3RoZXJ3aXNlIHJlZXZhbHVhdGUgZXZlcnl0aGluZyB1cG9uIGVhY2ggaXRlcmF0aW9uLlxyXG4gICAgICpcclxuICAgICAqICMjIEV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIGNvbnN0IGRzID0gbmV3IERhdGFTZXQoW+KApl0pXHJcbiAgICAgKlxyXG4gICAgICogY29uc3QgY2FjaGVkU3RyZWFtID0gZHMuc3RyZWFtKClcclxuICAgICAqICAgLmZpbHRlcijigKYpXHJcbiAgICAgKiAgIC5zb3J0KOKApilcclxuICAgICAqICAgLm1hcCjigKYpXHJcbiAgICAgKiAgIC5jYWNoZWQo4oCmKSAvLyBEYXRhIGFyZSBmZXRjaGVkLCBwcm9jZXNzZWQgYW5kIGNhY2hlZCBoZXJlLlxyXG4gICAgICpcclxuICAgICAqIGRzLmNsZWFyKClcclxuICAgICAqIGNoYWNoZWRTdHJlYW0gLy8gU3RpbGwgaGFzIGFsbCB0aGUgaXRlbXMuXHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBbW0RhdGFTdHJlYW1dXSB3aXRoIGNhY2hlZCBpdGVtcyAoZGV0YWNoZWQgZnJvbSB0aGUgb3JpZ2luYWwgW1tEYXRhU2V0XV0pLlxyXG4gICAgICovXHJcbiAgICBjYWNoZSgpIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFTdHJlYW0oWy4uLnRoaXMuX3BhaXJzXSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgZGlzdGluY3QgdmFsdWVzIG9mIGdpdmVuIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0aGF0IHBpY2tzIGFuZCBwb3NzaWJseSBjb252ZXJ0cyB0aGUgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIGRpc3RpbmN0IHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgc2V0IG9mIGFsbCBkaXN0aW5jdCBwcm9wZXJ0aWVzLlxyXG4gICAgICovXHJcbiAgICBkaXN0aW5jdChjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IHNldCA9IG5ldyBTZXQoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgaXRlbV0gb2YgdGhpcy5fcGFpcnMpIHtcclxuICAgICAgICAgICAgc2V0LmFkZChjYWxsYmFjayhpdGVtLCBpZCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2V0O1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWx0ZXIgdGhlIGl0ZW1zIG9mIHRoZSBzdHJlYW0uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGFuIGl0ZW0gd2lsbCBiZSBpbmNsdWRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBkYXRhIHN0cmVhbSB3aXRoIHRoZSBmaWx0ZXJlZCBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgZmlsdGVyKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgcGFpcnMgPSB0aGlzLl9wYWlycztcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFTdHJlYW0oe1xyXG4gICAgICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgaXRlbV0gb2YgcGFpcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2soaXRlbSwgaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFtpZCwgaXRlbV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGVhY2ggaXRlbSBvZiB0aGUgc3RyZWFtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgaW52b2tlZCBmb3IgZWFjaCBpdGVtLlxyXG4gICAgICovXHJcbiAgICBmb3JFYWNoKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBbaWQsIGl0ZW1dIG9mIHRoaXMuX3BhaXJzKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGl0ZW0sIGlkKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIE1hcCB0aGUgaXRlbXMgaW50byBhIGRpZmZlcmVudCB0eXBlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGNvbnZlcnNpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGVQYXJhbSBNYXBwZWQgLSBUaGUgdHlwZSBvZiB0aGUgaXRlbSBhZnRlciBtYXBwaW5nLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIEEgbmV3IGRhdGEgc3RyZWFtIHdpdGggdGhlIG1hcHBlZCBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgbWFwKGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgcGFpcnMgPSB0aGlzLl9wYWlycztcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFTdHJlYW0oe1xyXG4gICAgICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpZCwgaXRlbV0gb2YgcGFpcnMpIHtcclxuICAgICAgICAgICAgICAgICAgICB5aWVsZCBbaWQsIGNhbGxiYWNrKGl0ZW0sIGlkKV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEdldCB0aGUgaXRlbSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGdpdmVuIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0aGF0IHBpY2tzIGFuZCBwb3NzaWJseSBjb252ZXJ0cyB0aGUgcHJvcGVydHkuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGl0ZW0gd2l0aCB0aGUgbWF4aW11bSBpZiBmb3VuZCBvdGhlcndpc2UgbnVsbC5cclxuICAgICAqL1xyXG4gICAgbWF4KGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgaXRlciA9IHRoaXMuX3BhaXJzW1N5bWJvbC5pdGVyYXRvcl0oKTtcclxuICAgICAgICBsZXQgY3VyciA9IGl0ZXIubmV4dCgpO1xyXG4gICAgICAgIGlmIChjdXJyLmRvbmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBtYXhJdGVtID0gY3Vyci52YWx1ZVsxXTtcclxuICAgICAgICBsZXQgbWF4VmFsdWUgPSBjYWxsYmFjayhjdXJyLnZhbHVlWzFdLCBjdXJyLnZhbHVlWzBdKTtcclxuICAgICAgICB3aGlsZSAoIShjdXJyID0gaXRlci5uZXh0KCkpLmRvbmUpIHtcclxuICAgICAgICAgICAgY29uc3QgW2lkLCBpdGVtXSA9IGN1cnIudmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2FsbGJhY2soaXRlbSwgaWQpO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUgPiBtYXhWYWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgbWF4VmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIG1heEl0ZW0gPSBpdGVtO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXhJdGVtO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXQgdGhlIGl0ZW0gd2l0aCB0aGUgbWluaW11bSB2YWx1ZSBvZiBnaXZlbiBwcm9wZXJ0eS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24gdGhhdCBwaWNrcyBhbmQgcG9zc2libHkgY29udmVydHMgdGhlIHByb3BlcnR5LlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIHdpdGggdGhlIG1pbmltdW0gaWYgZm91bmQgb3RoZXJ3aXNlIG51bGwuXHJcbiAgICAgKi9cclxuICAgIG1pbihjYWxsYmFjaykge1xyXG4gICAgICAgIGNvbnN0IGl0ZXIgPSB0aGlzLl9wYWlyc1tTeW1ib2wuaXRlcmF0b3JdKCk7XHJcbiAgICAgICAgbGV0IGN1cnIgPSBpdGVyLm5leHQoKTtcclxuICAgICAgICBpZiAoY3Vyci5kb25lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgbWluSXRlbSA9IGN1cnIudmFsdWVbMV07XHJcbiAgICAgICAgbGV0IG1pblZhbHVlID0gY2FsbGJhY2soY3Vyci52YWx1ZVsxXSwgY3Vyci52YWx1ZVswXSk7XHJcbiAgICAgICAgd2hpbGUgKCEoY3VyciA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IFtpZCwgaXRlbV0gPSBjdXJyLnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhbGxiYWNrKGl0ZW0sIGlkKTtcclxuICAgICAgICAgICAgaWYgKHZhbHVlIDwgbWluVmFsdWUpIHtcclxuICAgICAgICAgICAgICAgIG1pblZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICBtaW5JdGVtID0gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbWluSXRlbTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogUmVkdWNlIHRoZSBpdGVtcyBpbnRvIGEgc2luZ2xlIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIHJlZHVjdGlvbi5cclxuICAgICAqIEBwYXJhbSBhY2N1bXVsYXRvciAtIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBhY2N1bXVsYXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHJlZHVjZShjYWxsYmFjaywgYWNjdW11bGF0b3IpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IFtpZCwgaXRlbV0gb2YgdGhpcy5fcGFpcnMpIHtcclxuICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBjYWxsYmFjayhhY2N1bXVsYXRvciwgaXRlbSwgaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNvcnQgdGhlIGl0ZW1zLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBjYWxsYmFjayAtIEl0ZW0gY29tcGFyYXRvci5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBIG5ldyBzdHJlYW0gd2l0aCBzb3J0ZWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIHNvcnQoY2FsbGJhY2spIHtcclxuICAgICAgICByZXR1cm4gbmV3IERhdGFTdHJlYW0oe1xyXG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gWy4uLnRoaXMuX3BhaXJzXVxyXG4gICAgICAgICAgICAgICAgLnNvcnQoKFtpZEEsIGl0ZW1BXSwgW2lkQiwgaXRlbUJdKSA9PiBjYWxsYmFjayhpdGVtQSwgaXRlbUIsIGlkQSwgaWRCKSlbU3ltYm9sLml0ZXJhdG9yXSgpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBBZGQgYW4gaWQgdG8gZ2l2ZW4gaXRlbSBpZiBpdCBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkuXHJcbiAqXHJcbiAqIEByZW1hcmtzXHJcbiAqIFRoZSBpdGVtIHdpbGwgYmUgbW9kaWZpZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdGhhdCB3aWxsIGhhdmUgYW4gaWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24uXHJcbiAqIEBwYXJhbSBpZFByb3AgLSBUaGUga2V5IG9mIHRoZSBpZCBwcm9wZXJ0eS5cclxuICpcclxuICogQHR5cGVQYXJhbSBJdGVtIC0gSXRlbSB0eXBlIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBpZC5cclxuICogQHR5cGVQYXJhbSBJZFByb3AgLSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRoZSBpZC5cclxuICpcclxuICogQHJldHVybnMgdHJ1ZVxyXG4gKi9cclxuZnVuY3Rpb24gZW5zdXJlRnVsbEl0ZW0oaXRlbSwgaWRQcm9wKSB7XHJcbiAgICBpZiAoaXRlbVtpZFByb3BdID09IG51bGwpIHtcclxuICAgICAgICAvLyBnZW5lcmF0ZSBhbiBpZFxyXG4gICAgICAgIGl0ZW1baWRQcm9wXSA9IHY0KCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXRlbTtcclxufVxyXG4vKipcclxuICogIyBEYXRhU2V0XHJcbiAqXHJcbiAqIFZpcy5qcyBjb21lcyB3aXRoIGEgZmxleGlibGUgRGF0YVNldCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaG9sZCBhbmRcclxuICogbWFuaXB1bGF0ZSB1bnN0cnVjdHVyZWQgZGF0YSBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBkYXRhLiBUaGUgRGF0YVNldFxyXG4gKiBpcyBrZXkvdmFsdWUgYmFzZWQuIERhdGEgaXRlbXMgY2FuIGJlIGFkZGVkLCB1cGRhdGVkIGFuZCByZW1vdmVkIGZyb20gdGhlXHJcbiAqIERhdGFTZXQsIGFuZCBvbmUgY2FuIHN1YnNjcmliZSB0byBjaGFuZ2VzIGluIHRoZSBEYXRhU2V0LiBUaGUgZGF0YSBpbiB0aGVcclxuICogRGF0YVNldCBjYW4gYmUgZmlsdGVyZWQgYW5kIG9yZGVyZWQuIERhdGEgY2FuIGJlIG5vcm1hbGl6ZWQgd2hlbiBhcHBlbmRpbmcgaXRcclxuICogdG8gdGhlIERhdGFTZXQgYXMgd2VsbC5cclxuICpcclxuICogIyMgRXhhbXBsZVxyXG4gKlxyXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIERhdGFTZXQuXHJcbiAqXHJcbiAqIGBgYGphdmFzY3JpcHRcclxuICogLy8gY3JlYXRlIGEgRGF0YVNldFxyXG4gKiB2YXIgb3B0aW9ucyA9IHt9O1xyXG4gKiB2YXIgZGF0YSA9IG5ldyB2aXMuRGF0YVNldChvcHRpb25zKTtcclxuICpcclxuICogLy8gYWRkIGl0ZW1zXHJcbiAqIC8vIG5vdGUgdGhhdCB0aGUgZGF0YSBpdGVtcyBjYW4gY29udGFpbiBkaWZmZXJlbnQgcHJvcGVydGllcyBhbmQgZGF0YSBmb3JtYXRzXHJcbiAqIGRhdGEuYWRkKFtcclxuICogICB7aWQ6IDEsIHRleHQ6ICdpdGVtIDEnLCBkYXRlOiBuZXcgRGF0ZSgyMDEzLCA2LCAyMCksIGdyb3VwOiAxLCBmaXJzdDogdHJ1ZX0sXHJcbiAqICAge2lkOiAyLCB0ZXh0OiAnaXRlbSAyJywgZGF0ZTogJzIwMTMtMDYtMjMnLCBncm91cDogMn0sXHJcbiAqICAge2lkOiAzLCB0ZXh0OiAnaXRlbSAzJywgZGF0ZTogJzIwMTMtMDYtMjUnLCBncm91cDogMn0sXHJcbiAqICAge2lkOiA0LCB0ZXh0OiAnaXRlbSA0J31cclxuICogXSk7XHJcbiAqXHJcbiAqIC8vIHN1YnNjcmliZSB0byBhbnkgY2hhbmdlIGluIHRoZSBEYXRhU2V0XHJcbiAqIGRhdGEub24oJyonLCBmdW5jdGlvbiAoZXZlbnQsIHByb3BlcnRpZXMsIHNlbmRlcklkKSB7XHJcbiAqICAgY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQsIHByb3BlcnRpZXMpO1xyXG4gKiB9KTtcclxuICpcclxuICogLy8gdXBkYXRlIGFuIGV4aXN0aW5nIGl0ZW1cclxuICogZGF0YS51cGRhdGUoe2lkOiAyLCBncm91cDogMX0pO1xyXG4gKlxyXG4gKiAvLyByZW1vdmUgYW4gaXRlbVxyXG4gKiBkYXRhLnJlbW92ZSg0KTtcclxuICpcclxuICogLy8gZ2V0IGFsbCBpZHNcclxuICogdmFyIGlkcyA9IGRhdGEuZ2V0SWRzKCk7XHJcbiAqIGNvbnNvbGUubG9nKCdpZHMnLCBpZHMpO1xyXG4gKlxyXG4gKiAvLyBnZXQgYSBzcGVjaWZpYyBpdGVtXHJcbiAqIHZhciBpdGVtMSA9IGRhdGEuZ2V0KDEpO1xyXG4gKiBjb25zb2xlLmxvZygnaXRlbTEnLCBpdGVtMSk7XHJcbiAqXHJcbiAqIC8vIHJldHJpZXZlIGEgZmlsdGVyZWQgc3Vic2V0IG9mIHRoZSBkYXRhXHJcbiAqIHZhciBpdGVtcyA9IGRhdGEuZ2V0KHtcclxuICogICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAqICAgICByZXR1cm4gaXRlbS5ncm91cCA9PSAxO1xyXG4gKiAgIH1cclxuICogfSk7XHJcbiAqIGNvbnNvbGUubG9nKCdmaWx0ZXJlZCBpdGVtcycsIGl0ZW1zKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gSXRlbSAtIEl0ZW0gdHlwZSB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gaWQuXHJcbiAqIEB0eXBlUGFyYW0gSWRQcm9wIC0gTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUgaWQuXHJcbiAqL1xyXG5jbGFzcyBEYXRhU2V0IGV4dGVuZHMgRGF0YVNldFBhcnQge1xyXG4gICAgLyoqXHJcbiAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgRGF0YVNldC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGF0YSAtIEluaXRpYWwgZGF0YSBvciBvcHRpb25zLlxyXG4gICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zICh0eXBlIGVycm9yIGlmIGRhdGEgaXMgYWxzbyBvcHRpb25zKS5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoZGF0YSwgb3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fcXVldWUgPSBudWxsO1xyXG4gICAgICAgIC8vIGNvcnJlY3RseSByZWFkIG9wdGlvbmFsIGFyZ3VtZW50c1xyXG4gICAgICAgIGlmIChkYXRhICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBkYXRhO1xyXG4gICAgICAgICAgICBkYXRhID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xyXG4gICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgTWFwKCk7IC8vIG1hcCB3aXRoIGRhdGEgaW5kZXhlZCBieSBpZFxyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDsgLy8gbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBEYXRhU2V0XHJcbiAgICAgICAgdGhpcy5faWRQcm9wID0gdGhpcy5fb3B0aW9ucy5maWVsZElkIHx8IFwiaWRcIjsgLy8gbmFtZSBvZiB0aGUgZmllbGQgY29udGFpbmluZyBpZFxyXG4gICAgICAgIC8vIGFkZCBpbml0aWFsIGRhdGEgd2hlbiBwcm92aWRlZFxyXG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIGdldCBpZFByb3AoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkUHJvcDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogU2V0IG5ldyBvcHRpb25zLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG5ldyBvcHRpb25zLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnF1ZXVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucXVldWUgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGUgcXVldWUgaWYgbG9hZGVkXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcXVldWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5kZXN0cm95KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcXVldWUgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIHF1ZXVlIGFuZCB1cGRhdGUgaXRzIG9wdGlvbnNcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcXVldWUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZSA9IFF1ZXVlLmV4dGVuZCh0aGlzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U6IFtcImFkZFwiLCBcInVwZGF0ZVwiLCBcInJlbW92ZVwiXSxcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnF1ZXVlICYmIHR5cGVvZiBvcHRpb25zLnF1ZXVlID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcXVldWUuc2V0T3B0aW9ucyhvcHRpb25zLnF1ZXVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQWRkIGEgZGF0YSBpdGVtIG9yIGFuIGFycmF5IHdpdGggaXRlbXMuXHJcbiAgICAgKlxyXG4gICAgICogQWZ0ZXIgdGhlIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgRGF0YVNldCwgdGhlIERhdGFTZXQgd2lsbCB0cmlnZ2VyIGFuIGV2ZW50IGBhZGRgLiBXaGVuIGEgYHNlbmRlcklkYCBpcyBwcm92aWRlZCwgdGhpcyBpZCB3aWxsIGJlIHBhc3NlZCB3aXRoIHRoZSB0cmlnZ2VyZWQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZXJzLlxyXG4gICAgICpcclxuICAgICAqICMjIEV4YW1wbGVcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiAvLyBjcmVhdGUgYSBEYXRhU2V0XHJcbiAgICAgKiBjb25zdCBkYXRhID0gbmV3IHZpcy5EYXRhU2V0KClcclxuICAgICAqXHJcbiAgICAgKiAvLyBhZGQgaXRlbXNcclxuICAgICAqIGNvbnN0IGlkcyA9IGRhdGEuYWRkKFtcclxuICAgICAqICAgeyBpZDogMSwgdGV4dDogJ2l0ZW0gMScgfSxcclxuICAgICAqICAgeyBpZDogMiwgdGV4dDogJ2l0ZW0gMicgfSxcclxuICAgICAqICAgeyB0ZXh0OiAnaXRlbSB3aXRob3V0IGFuIGlkJyB9XHJcbiAgICAgKiBdKVxyXG4gICAgICpcclxuICAgICAqIGNvbnNvbGUubG9nKGlkcykgLy8gWzEsIDIsICc8VVVJRHY0PiddXHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gZGF0YSAtIEl0ZW1zIHRvIGJlIGFkZGVkIChpZHMgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgbWlzc2luZykuXHJcbiAgICAgKiBAcGFyYW0gc2VuZGVySWQgLSBTZW5kZXIgaWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgYWRkZWRJZHMgLSBBcnJheSB3aXRoIHRoZSBpZHMgKGdlbmVyYXRlZCBpZiBub3QgcHJlc2VudCkgb2YgdGhlIGFkZGVkIGl0ZW1zLlxyXG4gICAgICpcclxuICAgICAqIEB0aHJvd3MgV2hlbiBhbiBpdGVtIHdpdGggdGhlIHNhbWUgaWQgYXMgYW55IG9mIHRoZSBhZGRlZCBpdGVtcyBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgYWRkKGRhdGEsIHNlbmRlcklkKSB7XHJcbiAgICAgICAgY29uc3QgYWRkZWRJZHMgPSBbXTtcclxuICAgICAgICBsZXQgaWQ7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcclxuICAgICAgICAgICAgLy8gQXJyYXlcclxuICAgICAgICAgICAgY29uc3QgaWRzVG9BZGQgPSBkYXRhLm1hcCgoZCkgPT4gZFt0aGlzLl9pZFByb3BdKTtcclxuICAgICAgICAgICAgaWYgKGlkc1RvQWRkLnNvbWUoKGlkKSA9PiB0aGlzLl9kYXRhLmhhcyhpZCkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGR1cGxpY2F0ZSBpZCB3YXMgZm91bmQgaW4gdGhlIHBhcmFtZXRlciBhcnJheS5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGRhdGEubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5fYWRkSXRlbShkYXRhW2ldKTtcclxuICAgICAgICAgICAgICAgIGFkZGVkSWRzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgLy8gU2luZ2xlIGl0ZW1cclxuICAgICAgICAgICAgaWQgPSB0aGlzLl9hZGRJdGVtKGRhdGEpO1xyXG4gICAgICAgICAgICBhZGRlZElkcy5wdXNoKGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gZGF0YVR5cGVcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRlZElkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcImFkZFwiLCB7IGl0ZW1zOiBhZGRlZElkcyB9LCBzZW5kZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRlZElkcztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIGV4aXN0aW5nIGl0ZW1zLiBXaGVuIGFuIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgd2lsbCBiZSBtZXJnZWQgaW4gdGhlIGV4aXN0aW5nIGl0ZW0uIFdoZW4gYW4gaXRlbSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICAgICpcclxuICAgICAqIEFmdGVyIHRoZSBpdGVtcyBhcmUgdXBkYXRlZCwgdGhlIERhdGFTZXQgd2lsbCB0cmlnZ2VyIGFuIGV2ZW50IGBhZGRgIGZvciB0aGUgYWRkZWQgaXRlbXMsIGFuZCBhbiBldmVudCBgdXBkYXRlYC4gV2hlbiBhIGBzZW5kZXJJZGAgaXMgcHJvdmlkZWQsIHRoaXMgaWQgd2lsbCBiZSBwYXNzZWQgd2l0aCB0aGUgdHJpZ2dlcmVkIGV2ZW50IHRvIGFsbCBzdWJzY3JpYmVycy5cclxuICAgICAqXHJcbiAgICAgKiAjIyBFeGFtcGxlXHJcbiAgICAgKlxyXG4gICAgICogYGBgamF2YXNjcmlwdFxyXG4gICAgICogLy8gY3JlYXRlIGEgRGF0YVNldFxyXG4gICAgICogY29uc3QgZGF0YSA9IG5ldyB2aXMuRGF0YVNldChbXHJcbiAgICAgKiAgIHsgaWQ6IDEsIHRleHQ6ICdpdGVtIDEnIH0sXHJcbiAgICAgKiAgIHsgaWQ6IDIsIHRleHQ6ICdpdGVtIDInIH0sXHJcbiAgICAgKiAgIHsgaWQ6IDMsIHRleHQ6ICdpdGVtIDMnIH1cclxuICAgICAqIF0pXHJcbiAgICAgKlxyXG4gICAgICogLy8gdXBkYXRlIGl0ZW1zXHJcbiAgICAgKiBjb25zdCBpZHMgPSBkYXRhLnVwZGF0ZShbXHJcbiAgICAgKiAgIHsgaWQ6IDIsIHRleHQ6ICdpdGVtIDIgKHVwZGF0ZWQpJyB9LFxyXG4gICAgICogICB7IGlkOiA0LCB0ZXh0OiAnaXRlbSA0IChuZXcpJyB9XHJcbiAgICAgKiBdKVxyXG4gICAgICpcclxuICAgICAqIGNvbnNvbGUubG9nKGlkcykgLy8gWzIsIDRdXHJcbiAgICAgKiBgYGBcclxuICAgICAqXHJcbiAgICAgKiAjIyBXYXJuaW5nIGZvciBUeXBlU2NyaXB0IHVzZXJzXHJcbiAgICAgKiBUaGlzIG1ldGhvZCBtYXkgaW50cm9kdWNlIHBhcnRpYWwgaXRlbXMgaW50byB0aGUgZGF0YSBzZXQuIFVzZSBhZGQgb3IgdXBkYXRlT25seSBpbnN0ZWFkIGZvciBiZXR0ZXIgdHlwZSBzYWZldHkuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRhdGEgLSBJdGVtcyB0byBiZSB1cGRhdGVkIChpZiB0aGUgaWQgaXMgYWxyZWFkeSBwcmVzZW50KSBvciBhZGRlZCAoaWYgdGhlIGlkIGlzIG1pc3NpbmcpLlxyXG4gICAgICogQHBhcmFtIHNlbmRlcklkIC0gU2VuZGVyIGlkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHVwZGF0ZWRJZHMgLSBUaGUgaWRzIG9mIHRoZSBhZGRlZCAodGhlc2UgbWF5IGJlIG5ld2x5IGdlbmVyYXRlZCBpZiB0aGVyZSB3YXMgbm8gaWQgaW4gdGhlIGl0ZW0gZnJvbSB0aGUgZGF0YSkgb3IgdXBkYXRlZCBpdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBAdGhyb3dzIFdoZW4gdGhlIHN1cHBsaWVkIGRhdGEgaXMgbmVpdGhlciBhbiBpdGVtIG5vciBhbiBhcnJheSBvZiBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgdXBkYXRlKGRhdGEsIHNlbmRlcklkKSB7XHJcbiAgICAgICAgY29uc3QgYWRkZWRJZHMgPSBbXTtcclxuICAgICAgICBjb25zdCB1cGRhdGVkSWRzID0gW107XHJcbiAgICAgICAgY29uc3Qgb2xkRGF0YSA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWREYXRhID0gW107XHJcbiAgICAgICAgY29uc3QgaWRQcm9wID0gdGhpcy5faWRQcm9wO1xyXG4gICAgICAgIGNvbnN0IGFkZE9yVXBkYXRlID0gKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ0lkID0gaXRlbVtpZFByb3BdO1xyXG4gICAgICAgICAgICBpZiAob3JpZ0lkICE9IG51bGwgJiYgdGhpcy5fZGF0YS5oYXMob3JpZ0lkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZnVsbEl0ZW0gPSBpdGVtOyAvLyBpdCBoYXMgYW4gaWQsIHRoZXJlZm9yZSBpdCBpcyBhIGZ1bGxpdGVtXHJcbiAgICAgICAgICAgICAgICBjb25zdCBvbGRJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGF0YS5nZXQob3JpZ0lkKSk7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaXRlbVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl91cGRhdGVJdGVtKGZ1bGxJdGVtKTtcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkRGF0YS5wdXNoKGZ1bGxJdGVtKTtcclxuICAgICAgICAgICAgICAgIG9sZERhdGEucHVzaChvbGRJdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgaXRlbVxyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9hZGRJdGVtKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgYWRkZWRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIC8vIEFycmF5XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBkYXRhLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSAmJiB0eXBlb2YgZGF0YVtpXSA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFkZE9yVXBkYXRlKGRhdGFbaV0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCBcIiArIGkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgLy8gU2luZ2xlIGl0ZW1cclxuICAgICAgICAgICAgYWRkT3JVcGRhdGUoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGFUeXBlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWRkZWRJZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJhZGRcIiwgeyBpdGVtczogYWRkZWRJZHMgfSwgc2VuZGVySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodXBkYXRlZElkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7IGl0ZW1zOiB1cGRhdGVkSWRzLCBvbGREYXRhOiBvbGREYXRhLCBkYXRhOiB1cGRhdGVkRGF0YSB9O1xyXG4gICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgZGVwcmVjYXRlZCBwcm9wZXJ0eSAnZGF0YScgc29tZSBkYXlcclxuICAgICAgICAgICAgLy9PYmplY3QuZGVmaW5lUHJvcGVydHkocHJvcHMsICdkYXRhJywge1xyXG4gICAgICAgICAgICAvLyAgJ2dldCc6IChmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgLy8gICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSBkYXRhIGlzIGRlcHJlY2F0ZWQuIFVzZSBEYXRhU2V0LmdldChpZHMpIHRvIHJldHJpZXZlIHRoZSBuZXcgZGF0YSwgdXNlIHRoZSBvbGREYXRhIHByb3BlcnR5IG9uIHRoaXMgb2JqZWN0IHRvIGdldCB0aGUgb2xkIGRhdGEnKTtcclxuICAgICAgICAgICAgLy8gICAgcmV0dXJuIHVwZGF0ZWREYXRhO1xyXG4gICAgICAgICAgICAvLyAgfSkuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICAvL30pO1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKFwidXBkYXRlXCIsIHByb3BzLCBzZW5kZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhZGRlZElkcy5jb25jYXQodXBkYXRlZElkcyk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBleGlzdGluZyBpdGVtcy4gV2hlbiBhbiBpdGVtIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cclxuICAgICAqXHJcbiAgICAgKiBAcmVtYXJrc1xyXG4gICAgICogVGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgd2lsbCBiZSBkZWVwbHkgbWVyZ2VkIGludG8gdGhlIGV4aXN0aW5nIGl0ZW0uXHJcbiAgICAgKiBXaGVuIGFuIGl0ZW0gZG9lcyBub3QgZXhpc3QgKGlkIG5vdCBwcmVzZW50IGluIHRoZSBkYXRhIHNldCBvciBhYnNlbnQpLCBhbiBlcnJvciB3aWxsIGJlIHRocm93biBhbmQgbm90aGluZyB3aWxsIGJlIGNoYW5nZWQuXHJcbiAgICAgKlxyXG4gICAgICogQWZ0ZXIgdGhlIGl0ZW1zIGFyZSB1cGRhdGVkLCB0aGUgRGF0YVNldCB3aWxsIHRyaWdnZXIgYW4gZXZlbnQgYHVwZGF0ZWAuXHJcbiAgICAgKiBXaGVuIGEgYHNlbmRlcklkYCBpcyBwcm92aWRlZCwgdGhpcyBpZCB3aWxsIGJlIHBhc3NlZCB3aXRoIHRoZSB0cmlnZ2VyZWQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZXJzLlxyXG4gICAgICpcclxuICAgICAqICMjIEV4YW1wbGVcclxuICAgICAqXHJcbiAgICAgKiBgYGBqYXZhc2NyaXB0XHJcbiAgICAgKiAvLyBjcmVhdGUgYSBEYXRhU2V0XHJcbiAgICAgKiBjb25zdCBkYXRhID0gbmV3IHZpcy5EYXRhU2V0KFtcclxuICAgICAqICAgeyBpZDogMSwgdGV4dDogJ2l0ZW0gMScgfSxcclxuICAgICAqICAgeyBpZDogMiwgdGV4dDogJ2l0ZW0gMicgfSxcclxuICAgICAqICAgeyBpZDogMywgdGV4dDogJ2l0ZW0gMycgfSxcclxuICAgICAqIF0pXHJcbiAgICAgKlxyXG4gICAgICogLy8gdXBkYXRlIGl0ZW1zXHJcbiAgICAgKiBjb25zdCBpZHMgPSBkYXRhLnVwZGF0ZShbXHJcbiAgICAgKiAgIHsgaWQ6IDIsIHRleHQ6ICdpdGVtIDIgKHVwZGF0ZWQpJyB9LCAvLyB3b3Jrc1xyXG4gICAgICogICAvLyB7IGlkOiA0LCB0ZXh0OiAnaXRlbSA0IChuZXcpJyB9LCAvLyB3b3VsZCB0aHJvd1xyXG4gICAgICogICAvLyB7IHRleHQ6ICdpdGVtIDQgKG5ldyknIH0sIC8vIHdvdWxkIGFsc28gdGhyb3dcclxuICAgICAqIF0pXHJcbiAgICAgKlxyXG4gICAgICogY29uc29sZS5sb2coaWRzKSAvLyBbMl1cclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkYXRhIC0gVXBkYXRlcyAodGhlIGlkIGFuZCBvcHRpb25hbGx5IG90aGVyIHByb3BzKSB0byB0aGUgaXRlbXMgaW4gdGhpcyBkYXRhIHNldC5cclxuICAgICAqIEBwYXJhbSBzZW5kZXJJZCAtIFNlbmRlciBpZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB1cGRhdGVkSWRzIC0gVGhlIGlkcyBvZiB0aGUgdXBkYXRlZCBpdGVtcy5cclxuICAgICAqXHJcbiAgICAgKiBAdGhyb3dzIFdoZW4gdGhlIHN1cHBsaWVkIGRhdGEgaXMgbmVpdGhlciBhbiBpdGVtIG5vciBhbiBhcnJheSBvZiBpdGVtcywgd2hlbiB0aGUgaWRzIGFyZSBtaXNzaW5nLlxyXG4gICAgICovXHJcbiAgICB1cGRhdGVPbmx5KGRhdGEsIHNlbmRlcklkKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBbZGF0YV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHVwZGF0ZUV2ZW50RGF0YSA9IGRhdGFcclxuICAgICAgICAgICAgLm1hcCgodXBkYXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9sZERhdGEgPSB0aGlzLl9kYXRhLmdldCh1cGRhdGVbdGhpcy5faWRQcm9wXSk7XHJcbiAgICAgICAgICAgIGlmIChvbGREYXRhID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVwZGF0aW5nIG5vbi1leGlzdGVudCBpdGVtcyBpcyBub3QgYWxsb3dlZC5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHsgb2xkRGF0YSwgdXBkYXRlIH07XHJcbiAgICAgICAgfSlcclxuICAgICAgICAgICAgLm1hcCgoeyBvbGREYXRhLCB1cGRhdGUgfSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IG9sZERhdGFbdGhpcy5faWRQcm9wXTtcclxuICAgICAgICAgICAgY29uc3QgdXBkYXRlZERhdGEgPSBwdXJlRGVlcE9iamVjdEFzc2lnbihvbGREYXRhLCB1cGRhdGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhLnNldChpZCwgdXBkYXRlZERhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaWQsXHJcbiAgICAgICAgICAgICAgICBvbGREYXRhOiBvbGREYXRhLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlZERhdGEsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKHVwZGF0ZUV2ZW50RGF0YS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtczogdXBkYXRlRXZlbnREYXRhLm1hcCgodmFsdWUpID0+IHZhbHVlLmlkKSxcclxuICAgICAgICAgICAgICAgIG9sZERhdGE6IHVwZGF0ZUV2ZW50RGF0YS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS5vbGREYXRhKSxcclxuICAgICAgICAgICAgICAgIGRhdGE6IHVwZGF0ZUV2ZW50RGF0YS5tYXAoKHZhbHVlKSA9PiB2YWx1ZS51cGRhdGVkRGF0YSksXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSBkZXByZWNhdGVkIHByb3BlcnR5ICdkYXRhJyBzb21lIGRheVxyXG4gICAgICAgICAgICAvL09iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2RhdGEnLCB7XHJcbiAgICAgICAgICAgIC8vICAnZ2V0JzogKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAvLyAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5IGRhdGEgaXMgZGVwcmVjYXRlZC4gVXNlIERhdGFTZXQuZ2V0KGlkcykgdG8gcmV0cmlldmUgdGhlIG5ldyBkYXRhLCB1c2UgdGhlIG9sZERhdGEgcHJvcGVydHkgb24gdGhpcyBvYmplY3QgdG8gZ2V0IHRoZSBvbGQgZGF0YScpO1xyXG4gICAgICAgICAgICAvLyAgICByZXR1cm4gdXBkYXRlZERhdGE7XHJcbiAgICAgICAgICAgIC8vICB9KS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgIC8vfSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIiwgcHJvcHMsIHNlbmRlcklkKTtcclxuICAgICAgICAgICAgcmV0dXJuIHByb3BzLml0ZW1zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgZ2V0KGZpcnN0LCBzZWNvbmQpIHtcclxuICAgICAgICAvLyBAVE9ETzogV291ZG4ndCBpdCBiZSBiZXR0ZXIgdG8gc3BsaXQgdGhpcyBpbnRvIG11bHRpcGxlIG1ldGhvZHM/XHJcbiAgICAgICAgLy8gcGFyc2UgdGhlIGFyZ3VtZW50c1xyXG4gICAgICAgIGxldCBpZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICBsZXQgaWRzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBvcHRpb25zID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGlmIChpc0lkKGZpcnN0KSkge1xyXG4gICAgICAgICAgICAvLyBnZXQoaWQgWywgb3B0aW9uc10pXHJcbiAgICAgICAgICAgIGlkID0gZmlyc3Q7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlyc3QpKSB7XHJcbiAgICAgICAgICAgIC8vIGdldChpZHMgWywgb3B0aW9uc10pXHJcbiAgICAgICAgICAgIGlkcyA9IGZpcnN0O1xyXG4gICAgICAgICAgICBvcHRpb25zID0gc2Vjb25kO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZ2V0KFssIG9wdGlvbnNdKVxyXG4gICAgICAgICAgICBvcHRpb25zID0gZmlyc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRldGVybWluZSB0aGUgcmV0dXJuIHR5cGVcclxuICAgICAgICBjb25zdCByZXR1cm5UeXBlID0gb3B0aW9ucyAmJiBvcHRpb25zLnJldHVyblR5cGUgPT09IFwiT2JqZWN0XCIgPyBcIk9iamVjdFwiIDogXCJBcnJheVwiO1xyXG4gICAgICAgIC8vIEBUT0RPOiBXVEYgaXMgdGhpcz8gT3IgYW0gSSBtaXNzaW5nIHNvbWV0aGluZz9cclxuICAgICAgICAvLyB2YXIgcmV0dXJuVHlwZVxyXG4gICAgICAgIC8vIGlmIChvcHRpb25zICYmIG9wdGlvbnMucmV0dXJuVHlwZSkge1xyXG4gICAgICAgIC8vICAgdmFyIGFsbG93ZWRWYWx1ZXMgPSBbJ0FycmF5JywgJ09iamVjdCddXHJcbiAgICAgICAgLy8gICByZXR1cm5UeXBlID1cclxuICAgICAgICAvLyAgICAgYWxsb3dlZFZhbHVlcy5pbmRleE9mKG9wdGlvbnMucmV0dXJuVHlwZSkgPT0gLTFcclxuICAgICAgICAvLyAgICAgICA/ICdBcnJheSdcclxuICAgICAgICAvLyAgICAgICA6IG9wdGlvbnMucmV0dXJuVHlwZVxyXG4gICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gICByZXR1cm5UeXBlID0gJ0FycmF5J1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBidWlsZCBvcHRpb25zXHJcbiAgICAgICAgY29uc3QgZmlsdGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLmZpbHRlcjtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xyXG4gICAgICAgIGxldCBpdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBpdGVtSWRzID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIGxldCBpdGVtSWQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgLy8gY29udmVydCBpdGVtc1xyXG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBhIHNpbmdsZSBpdGVtXHJcbiAgICAgICAgICAgIGl0ZW0gPSB0aGlzLl9kYXRhLmdldChpZCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtICYmIGZpbHRlciAmJiAhZmlsdGVyKGl0ZW0pKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGlkcyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBhIHN1YnNldCBvZiBpdGVtc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy5fZGF0YS5nZXQoaWRzW2ldKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKGl0ZW0pKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBhbGwgaXRlbXNcclxuICAgICAgICAgICAgaXRlbUlkcyA9IFsuLi50aGlzLl9kYXRhLmtleXMoKV07XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpdGVtSWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtSWQgPSBpdGVtSWRzW2ldO1xyXG4gICAgICAgICAgICAgICAgaXRlbSA9IHRoaXMuX2RhdGEuZ2V0KGl0ZW1JZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmICghZmlsdGVyIHx8IGZpbHRlcihpdGVtKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG9yZGVyIHRoZSByZXN1bHRzXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vcmRlciAmJiBpZCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc29ydChpdGVtcywgb3B0aW9ucy5vcmRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGZpbHRlciBmaWVsZHMgb2YgdGhlIGl0ZW1zXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5maWVsZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZmllbGRzID0gb3B0aW9ucy5maWVsZHM7XHJcbiAgICAgICAgICAgIGlmIChpZCAhPSB1bmRlZmluZWQgJiYgaXRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtID0gdGhpcy5fZmlsdGVyRmllbGRzKGl0ZW0sIGZpZWxkcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc1tpXSA9IHRoaXMuX2ZpbHRlckZpZWxkcyhpdGVtc1tpXSwgZmllbGRzKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZXR1cm4gdGhlIHJlc3VsdHNcclxuICAgICAgICBpZiAocmV0dXJuVHlwZSA9PSBcIk9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdGFudCA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IFNob3Vkbid0IHRoaXMgYmUgdGhpcy5fZmllbGRJZD9cclxuICAgICAgICAgICAgICAgIC8vIHJlc3VsdFtyZXN1bHRhbnQuaWRdID0gcmVzdWx0YW50XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHJlc3VsdGFudFt0aGlzLl9pZFByb3BdO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0W2lkXSA9IHJlc3VsdGFudDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIGEgc2luZ2xlIGl0ZW1cclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtID8/IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBqdXN0IHJldHVybiBvdXIgYXJyYXlcclxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgZ2V0SWRzKG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcclxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyO1xyXG4gICAgICAgIGNvbnN0IG9yZGVyID0gb3B0aW9ucyAmJiBvcHRpb25zLm9yZGVyO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1JZHMgPSBbLi4uZGF0YS5rZXlzKCldO1xyXG4gICAgICAgIGNvbnN0IGlkcyA9IFtdO1xyXG4gICAgICAgIGlmIChmaWx0ZXIpIHtcclxuICAgICAgICAgICAgLy8gZ2V0IGZpbHRlcmVkIGl0ZW1zXHJcbiAgICAgICAgICAgIGlmIChvcmRlcikge1xyXG4gICAgICAgICAgICAgICAgLy8gY3JlYXRlIG9yZGVyZWQgbGlzdFxyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBbXTtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpdGVtSWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtSWRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kYXRhLmdldChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBmaWx0ZXIoaXRlbSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0KGl0ZW1zLCBvcmRlcik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChpdGVtc1tpXVt0aGlzLl9pZFByb3BdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB1bm9yZGVyZWQgbGlzdFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1JZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2RhdGEuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGZpbHRlcihpdGVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChpdGVtW3RoaXMuX2lkUHJvcF0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgLy8gZ2V0IGFsbCBpdGVtc1xyXG4gICAgICAgICAgICBpZiAob3JkZXIpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhbiBvcmRlcmVkIGxpc3RcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbUlkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbUlkc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGRhdGEuZ2V0KGlkKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0KGl0ZW1zLCBvcmRlcik7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChpdGVtc1tpXVt0aGlzLl9pZFByb3BdKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSB1bm9yZGVyZWQgbGlzdFxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1JZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRhdGEuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkcy5wdXNoKGl0ZW1bdGhpcy5faWRQcm9wXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpZHM7XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIGdldERhdGFTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIGZvckVhY2goY2FsbGJhY2ssIG9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zICYmIG9wdGlvbnMuZmlsdGVyO1xyXG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9kYXRhO1xyXG4gICAgICAgIGNvbnN0IGl0ZW1JZHMgPSBbLi4uZGF0YS5rZXlzKCldO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMub3JkZXIpIHtcclxuICAgICAgICAgICAgLy8gZXhlY3V0ZSBmb3JFYWNoIG9uIG9yZGVyZWQgbGlzdFxyXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0KG9wdGlvbnMpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbVt0aGlzLl9pZFByb3BdO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soaXRlbSwgaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB1bm9yZGVyZWRcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGl0ZW1JZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbUlkc1tpXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kYXRhLmdldChpZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmICghZmlsdGVyIHx8IGZpbHRlcihpdGVtKSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhpdGVtLCBpZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIG1hcChjYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGZpbHRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgY29uc3QgbWFwcGVkSXRlbXMgPSBbXTtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcclxuICAgICAgICBjb25zdCBpdGVtSWRzID0gWy4uLmRhdGEua2V5cygpXTtcclxuICAgICAgICAvLyBjb252ZXJ0IGFuZCBmaWx0ZXIgaXRlbXNcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaXRlbUlkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1JZHNbaV07XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kYXRhLmdldChpZCk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKGl0ZW0pKSkge1xyXG4gICAgICAgICAgICAgICAgbWFwcGVkSXRlbXMucHVzaChjYWxsYmFjayhpdGVtLCBpZCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIG9yZGVyIGl0ZW1zXHJcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5vcmRlcikge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3J0KG1hcHBlZEl0ZW1zLCBvcHRpb25zLm9yZGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZEl0ZW1zO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaWx0ZXIgdGhlIGZpZWxkcyBvZiBhbiBpdGVtLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gd2hvc2UgZmllbGRzIHNob3VsZCBiZSBmaWx0ZXJlZC5cclxuICAgICAqIEBwYXJhbSBmaWVsZHMgLSBUaGUgbmFtZXMgb2YgdGhlIGZpZWxkcyB0aGF0IHdpbGwgYmUga2VwdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZVBhcmFtIEsgLSBGaWVsZCBuYW1lIHR5cGUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIGl0ZW0gd2l0aG91dCBhbnkgYWRkaXRpb25hbCBmaWVsZHMuXHJcbiAgICAgKi9cclxuICAgIF9maWx0ZXJGaWVsZHMoaXRlbSwgZmllbGRzKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtKSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZW0gaXMgbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KGZpZWxkcylcclxuICAgICAgICAgICAgPyAvLyBVc2UgdGhlIHN1cHBsaWVkIGFycmF5XHJcbiAgICAgICAgICAgICAgICBmaWVsZHNcclxuICAgICAgICAgICAgOiAvLyBVc2UgdGhlIGtleXMgb2YgdGhlIHN1cHBsaWVkIG9iamVjdFxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZmllbGRzKSkucmVkdWNlKChmaWx0ZXJlZEl0ZW0sIGZpZWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkSXRlbVtmaWVsZF0gPSBpdGVtW2ZpZWxkXTtcclxuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkSXRlbTtcclxuICAgICAgICB9LCB7fSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFNvcnQgdGhlIHByb3ZpZGVkIGFycmF5IHdpdGggaXRlbXMuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGl0ZW1zIC0gSXRlbXMgdG8gYmUgc29ydGVkIGluIHBsYWNlLlxyXG4gICAgICogQHBhcmFtIG9yZGVyIC0gQSBmaWVsZCBuYW1lIG9yIGN1c3RvbSBzb3J0IGZ1bmN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBpdGVtcyBpbiB0aGUgaXRlbXMgYXJyYXkuXHJcbiAgICAgKi9cclxuICAgIF9zb3J0KGl0ZW1zLCBvcmRlcikge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgLy8gb3JkZXIgYnkgcHJvdmlkZWQgZmllbGQgbmFtZVxyXG4gICAgICAgICAgICBjb25zdCBuYW1lID0gb3JkZXI7IC8vIGZpZWxkIG5hbWVcclxuICAgICAgICAgICAgaXRlbXMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IEhvdyB0byB0cmVhdCBtaXNzaW5nIHByb3BlcnRpZXM/XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdiA9IGFbbmFtZV07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBidiA9IGJbbmFtZV07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXYgPiBidiA/IDEgOiBhdiA8IGJ2ID8gLTEgOiAwO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgLy8gb3JkZXIgYnkgc29ydCBmdW5jdGlvblxyXG4gICAgICAgICAgICBpdGVtcy5zb3J0KG9yZGVyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFRPRE86IGV4dGVuZCBvcmRlciBieSBhbiBPYmplY3Qge2ZpZWxkOnN0cmluZywgZGlyZWN0aW9uOnN0cmluZ31cclxuICAgICAgICAgICAgLy8gICAgICAgd2hlcmUgZGlyZWN0aW9uIGNhbiBiZSAnYXNjJyBvciAnZGVzYydcclxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9yZGVyIG11c3QgYmUgYSBmdW5jdGlvbiBvciBhIHN0cmluZ1wiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhbiBpdGVtIG9yIG11bHRpcGxlIGl0ZW1zIGJ5IOKAnHJlZmVyZW5jZeKAnSAob25seSB0aGUgaWQgaXMgdXNlZCkgb3IgYnkgaWQuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG1ldGhvZCBpZ25vcmVzIHJlbW92YWwgb2Ygbm9uLWV4aXN0aW5nIGl0ZW1zLCBhbmQgcmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBpZHMgb2YgdGhlIGl0ZW1zIHdoaWNoIGFyZSBhY3R1YWxseSByZW1vdmVkIGZyb20gdGhlIERhdGFTZXQuXHJcbiAgICAgKlxyXG4gICAgICogQWZ0ZXIgdGhlIGl0ZW1zIGFyZSByZW1vdmVkLCB0aGUgRGF0YVNldCB3aWxsIHRyaWdnZXIgYW4gZXZlbnQgYHJlbW92ZWAgZm9yIHRoZSByZW1vdmVkIGl0ZW1zLiBXaGVuIGEgYHNlbmRlcklkYCBpcyBwcm92aWRlZCwgdGhpcyBpZCB3aWxsIGJlIHBhc3NlZCB3aXRoIHRoZSB0cmlnZ2VyZWQgZXZlbnQgdG8gYWxsIHN1YnNjcmliZXJzLlxyXG4gICAgICpcclxuICAgICAqICMjIEV4YW1wbGVcclxuICAgICAqIGBgYGphdmFzY3JpcHRcclxuICAgICAqIC8vIGNyZWF0ZSBhIERhdGFTZXRcclxuICAgICAqIGNvbnN0IGRhdGEgPSBuZXcgdmlzLkRhdGFTZXQoW1xyXG4gICAgICogICB7IGlkOiAxLCB0ZXh0OiAnaXRlbSAxJyB9LFxyXG4gICAgICogICB7IGlkOiAyLCB0ZXh0OiAnaXRlbSAyJyB9LFxyXG4gICAgICogICB7IGlkOiAzLCB0ZXh0OiAnaXRlbSAzJyB9XHJcbiAgICAgKiBdKVxyXG4gICAgICpcclxuICAgICAqIC8vIHJlbW92ZSBpdGVtc1xyXG4gICAgICogY29uc3QgaWRzID0gZGF0YS5yZW1vdmUoWzIsIHsgaWQ6IDMgfSwgNF0pXHJcbiAgICAgKlxyXG4gICAgICogY29uc29sZS5sb2coaWRzKSAvLyBbMiwgM11cclxuICAgICAqIGBgYFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpZCAtIE9uZSBvciBtb3JlIGl0ZW1zIG9yIGlkcyBvZiBpdGVtcyB0byBiZSByZW1vdmVkLlxyXG4gICAgICogQHBhcmFtIHNlbmRlcklkIC0gU2VuZGVyIGlkLlxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIFRoZSBpZHMgb2YgdGhlIHJlbW92ZWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIHJlbW92ZShpZCwgc2VuZGVySWQpIHtcclxuICAgICAgICBjb25zdCByZW1vdmVkSWRzID0gW107XHJcbiAgICAgICAgY29uc3QgcmVtb3ZlZEl0ZW1zID0gW107XHJcbiAgICAgICAgLy8gZm9yY2UgZXZlcnl0aGluZyB0byBiZSBhbiBhcnJheSBmb3Igc2ltcGxpY2l0eVxyXG4gICAgICAgIGNvbnN0IGlkcyA9IEFycmF5LmlzQXJyYXkoaWQpID8gaWQgOiBbaWRdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX3JlbW92ZShpZHNbaV0pO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbVt0aGlzLl9pZFByb3BdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZElkcy5wdXNoKGl0ZW1JZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHJlbW92ZWRJZHMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIiwgeyBpdGVtczogcmVtb3ZlZElkcywgb2xkRGF0YTogcmVtb3ZlZEl0ZW1zIH0sIHNlbmRlcklkKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlbW92ZWRJZHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhbiBpdGVtIGJ5IGl0cyBpZCBvciByZWZlcmVuY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGlkIC0gSWQgb2YgYW4gaXRlbSBvciB0aGUgaXRlbSBpdHNlbGYuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVGhlIHJlbW92ZWQgaXRlbSBpZiByZW1vdmVkLCBudWxsIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgX3JlbW92ZShpZCkge1xyXG4gICAgICAgIC8vIEBUT0RPOiBJdCBvcmlnaWFubGx5IHJldHVybmVkIHRoZSBpdGVtIGFsdGhvdWdoIHRoZSBkb2NzIHNheSBpZC5cclxuICAgICAgICAvLyBUaGUgY29kZSBleHBlY3RzIHRoZSBpdGVtLCBzbyBwcm9iYWJseSBhbiBlcnJvciBpbiB0aGUgZG9jcy5cclxuICAgICAgICBsZXQgaWRlbnQ7XHJcbiAgICAgICAgLy8gY29uZmlybSB0aGUgaWQgdG8gdXNlIGJhc2VkIG9uIHRoZSBhcmdzIHR5cGVcclxuICAgICAgICBpZiAoaXNJZChpZCkpIHtcclxuICAgICAgICAgICAgaWRlbnQgPSBpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoaWQgJiYgdHlwZW9mIGlkID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIGlkZW50ID0gaWRbdGhpcy5faWRQcm9wXTsgLy8gbG9vayBmb3IgdGhlIGlkZW50aWZpZXIgZmllbGQgdXNpbmcgLl9pZFByb3BcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gZG8gdGhlIHJlbW92aW5nIGlmIHRoZSBpdGVtIGlzIGZvdW5kXHJcbiAgICAgICAgaWYgKGlkZW50ICE9IG51bGwgJiYgdGhpcy5fZGF0YS5oYXMoaWRlbnQpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kYXRhLmdldChpZGVudCkgfHwgbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YS5kZWxldGUoaWRlbnQpO1xyXG4gICAgICAgICAgICAtLXRoaXMubGVuZ3RoO1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIENsZWFyIHRoZSBlbnRpcmUgZGF0YSBzZXQuXHJcbiAgICAgKlxyXG4gICAgICogQWZ0ZXIgdGhlIGl0ZW1zIGFyZSByZW1vdmVkLCB0aGUgW1tEYXRhU2V0XV0gd2lsbCB0cmlnZ2VyIGFuIGV2ZW50IGByZW1vdmVgIGZvciBhbGwgcmVtb3ZlZCBpdGVtcy4gV2hlbiBhIGBzZW5kZXJJZGAgaXMgcHJvdmlkZWQsIHRoaXMgaWQgd2lsbCBiZSBwYXNzZWQgd2l0aCB0aGUgdHJpZ2dlcmVkIGV2ZW50IHRvIGFsbCBzdWJzY3JpYmVycy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gc2VuZGVySWQgLSBTZW5kZXIgaWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgcmVtb3ZlZElkcyAtIFRoZSBpZHMgb2YgYWxsIHJlbW92ZWQgaXRlbXMuXHJcbiAgICAgKi9cclxuICAgIGNsZWFyKHNlbmRlcklkKSB7XHJcbiAgICAgICAgY29uc3QgaWRzID0gWy4uLnRoaXMuX2RhdGEua2V5cygpXTtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgaXRlbXMucHVzaCh0aGlzLl9kYXRhLmdldChpZHNbaV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGF0YS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl90cmlnZ2VyKFwicmVtb3ZlXCIsIHsgaXRlbXM6IGlkcywgb2xkRGF0YTogaXRlbXMgfSwgc2VuZGVySWQpO1xyXG4gICAgICAgIHJldHVybiBpZHM7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgdGhlIGl0ZW0gd2l0aCBtYXhpbXVtIHZhbHVlIG9mIGEgc3BlY2lmaWVkIGZpZWxkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBmaWVsZCAtIE5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBtYXggdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgSXRlbSBjb250YWluaW5nIG1heCB2YWx1ZSwgb3IgbnVsbCBpZiBubyBpdGVtcy5cclxuICAgICAqL1xyXG4gICAgbWF4KGZpZWxkKSB7XHJcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XHJcbiAgICAgICAgbGV0IG1heEZpZWxkID0gbnVsbDtcclxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5fZGF0YS52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtRmllbGQgPSBpdGVtW2ZpZWxkXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtRmllbGQgPT09IFwibnVtYmVyXCIgJiZcclxuICAgICAgICAgICAgICAgIChtYXhGaWVsZCA9PSBudWxsIHx8IGl0ZW1GaWVsZCA+IG1heEZpZWxkKSkge1xyXG4gICAgICAgICAgICAgICAgbWF4ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIG1heEZpZWxkID0gaXRlbUZpZWxkO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXggfHwgbnVsbDtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogRmluZCB0aGUgaXRlbSB3aXRoIG1pbmltdW0gdmFsdWUgb2YgYSBzcGVjaWZpZWQgZmllbGQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGZpZWxkIC0gTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIG1pbiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBJdGVtIGNvbnRhaW5pbmcgbWluIHZhbHVlLCBvciBudWxsIGlmIG5vIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBtaW4oZmllbGQpIHtcclxuICAgICAgICBsZXQgbWluID0gbnVsbDtcclxuICAgICAgICBsZXQgbWluRmllbGQgPSBudWxsO1xyXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLl9kYXRhLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1GaWVsZCA9IGl0ZW1bZmllbGRdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIGl0ZW1GaWVsZCA9PT0gXCJudW1iZXJcIiAmJlxyXG4gICAgICAgICAgICAgICAgKG1pbkZpZWxkID09IG51bGwgfHwgaXRlbUZpZWxkIDwgbWluRmllbGQpKSB7XHJcbiAgICAgICAgICAgICAgICBtaW4gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgbWluRmllbGQgPSBpdGVtRmllbGQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1pbiB8fCBudWxsO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kIGFsbCBkaXN0aW5jdCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgZmllbGRcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gcHJvcCAtIFRoZSBwcm9wZXJ0eSBuYW1lIHdob3NlIGRpc3RpbmN0IHZhbHVlcyBzaG91bGQgYmUgcmV0dXJuZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMgVW5vcmRlcmVkIGFycmF5IGNvbnRhaW5pbmcgYWxsIGRpc3RpbmN0IHZhbHVlcy4gSXRlbXMgd2l0aG91dCBzcGVjaWZpZWQgcHJvcGVydHkgYXJlIGlnbm9yZWQuXHJcbiAgICAgKi9cclxuICAgIGRpc3RpbmN0KHByb3ApIHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fZGF0YTtcclxuICAgICAgICBjb25zdCBpdGVtSWRzID0gWy4uLmRhdGEua2V5cygpXTtcclxuICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTtcclxuICAgICAgICBsZXQgY291bnQgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBpdGVtSWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbUlkc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRhdGEuZ2V0KGlkKTtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtW3Byb3BdO1xyXG4gICAgICAgICAgICBsZXQgZXhpc3RzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY291bnQ7IGorKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlc1tqXSA9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFleGlzdHMgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgdmFsdWVzW2NvdW50XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgY291bnQrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWVzO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYSBzaW5nbGUgaXRlbS4gV2lsbCBmYWlsIHdoZW4gYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGlkIGFscmVhZHkgZXhpc3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBpdGVtIC0gQSBuZXcgaXRlbSB0byBiZSBhZGRlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBBZGRlZCBpdGVtJ3MgaWQuIEFuIGlkIGlzIGdlbmVyYXRlZCB3aGVuIGl0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBpdGVtLlxyXG4gICAgICovXHJcbiAgICBfYWRkSXRlbShpdGVtKSB7XHJcbiAgICAgICAgY29uc3QgZnVsbEl0ZW0gPSBlbnN1cmVGdWxsSXRlbShpdGVtLCB0aGlzLl9pZFByb3ApO1xyXG4gICAgICAgIGNvbnN0IGlkID0gZnVsbEl0ZW1bdGhpcy5faWRQcm9wXTtcclxuICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoaXMgaWQgaXMgYWxyZWFkeSB0YWtlblxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgLy8gaXRlbSBhbHJlYWR5IGV4aXN0c1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGl0ZW06IGl0ZW0gd2l0aCBpZCBcIiArIGlkICsgXCIgYWxyZWFkeSBleGlzdHNcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RhdGEuc2V0KGlkLCBmdWxsSXRlbSk7XHJcbiAgICAgICAgKyt0aGlzLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFVwZGF0ZSBhIHNpbmdsZSBpdGVtOiBtZXJnZSB3aXRoIGV4aXN0aW5nIGl0ZW0uXHJcbiAgICAgKiBXaWxsIGZhaWwgd2hlbiB0aGUgaXRlbSBoYXMgbm8gaWQsIG9yIHdoZW4gdGhlcmUgZG9lcyBub3QgZXhpc3QgYW4gaXRlbSB3aXRoIHRoZSBzYW1lIGlkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB1cGRhdGUgLSBUaGUgbmV3IGl0ZW1cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIHVwZGF0ZWQgaXRlbS5cclxuICAgICAqL1xyXG4gICAgX3VwZGF0ZUl0ZW0odXBkYXRlKSB7XHJcbiAgICAgICAgY29uc3QgaWQgPSB1cGRhdGVbdGhpcy5faWRQcm9wXTtcclxuICAgICAgICBpZiAoaWQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXBkYXRlIGl0ZW06IGl0ZW0gaGFzIG5vIGlkIChpdGVtOiBcIiArXHJcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh1cGRhdGUpICtcclxuICAgICAgICAgICAgICAgIFwiKVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2RhdGEuZ2V0KGlkKTtcclxuICAgICAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgICAgICAgLy8gaXRlbSBkb2Vzbid0IGV4aXN0XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgaXRlbTogbm8gaXRlbSB3aXRoIGlkIFwiICsgaWQgKyBcIiBmb3VuZFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZGF0YS5zZXQoaWQsIHsgLi4uaXRlbSwgLi4udXBkYXRlIH0pO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgc3RyZWFtKGlkcykge1xyXG4gICAgICAgIGlmIChpZHMpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2RhdGE7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVN0cmVhbSh7XHJcbiAgICAgICAgICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRhdGEuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgW2lkLCBpdGVtXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU3RyZWFtKHtcclxuICAgICAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiB0aGlzLl9kYXRhLmVudHJpZXMuYmluZCh0aGlzLl9kYXRhKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XG5cbi8qKlxyXG4gKiBEYXRhVmlld1xyXG4gKlxyXG4gKiBBIERhdGFWaWV3IG9mZmVycyBhIGZpbHRlcmVkIGFuZC9vciBmb3JtYXR0ZWQgdmlldyBvbiBhIERhdGFTZXQuIE9uZSBjYW4gc3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gYSBEYXRhVmlldywgYW5kIGVhc2lseSBnZXQgZmlsdGVyZWQgb3IgZm9ybWF0dGVkIGRhdGEgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSBmaWx0ZXJzIGFuZCBmaWVsZCB0eXBlcyBhbGwgdGhlIHRpbWUuXHJcbiAqXHJcbiAqICMjIEV4YW1wbGVcclxuICogYGBgamF2YXNjcmlwdFxyXG4gKiAvLyBjcmVhdGUgYSBEYXRhU2V0XHJcbiAqIHZhciBkYXRhID0gbmV3IHZpcy5EYXRhU2V0KCk7XHJcbiAqIGRhdGEuYWRkKFtcclxuICogICB7aWQ6IDEsIHRleHQ6ICdpdGVtIDEnLCBkYXRlOiBuZXcgRGF0ZSgyMDEzLCA2LCAyMCksIGdyb3VwOiAxLCBmaXJzdDogdHJ1ZX0sXHJcbiAqICAge2lkOiAyLCB0ZXh0OiAnaXRlbSAyJywgZGF0ZTogJzIwMTMtMDYtMjMnLCBncm91cDogMn0sXHJcbiAqICAge2lkOiAzLCB0ZXh0OiAnaXRlbSAzJywgZGF0ZTogJzIwMTMtMDYtMjUnLCBncm91cDogMn0sXHJcbiAqICAge2lkOiA0LCB0ZXh0OiAnaXRlbSA0J31cclxuICogXSk7XHJcbiAqXHJcbiAqIC8vIGNyZWF0ZSBhIERhdGFWaWV3XHJcbiAqIC8vIHRoZSB2aWV3IHdpbGwgb25seSBjb250YWluIGl0ZW1zIGhhdmluZyBhIHByb3BlcnR5IGdyb3VwIHdpdGggdmFsdWUgMSxcclxuICogLy8gYW5kIHdpbGwgb25seSBvdXRwdXQgZmllbGRzIGlkLCB0ZXh0LCBhbmQgZGF0ZS5cclxuICogdmFyIHZpZXcgPSBuZXcgdmlzLkRhdGFWaWV3KGRhdGEsIHtcclxuICogICBmaWx0ZXI6IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAqICAgICByZXR1cm4gKGl0ZW0uZ3JvdXAgPT0gMSk7XHJcbiAqICAgfSxcclxuICogICBmaWVsZHM6IFsnaWQnLCAndGV4dCcsICdkYXRlJ11cclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIHN1YnNjcmliZSB0byBhbnkgY2hhbmdlIGluIHRoZSBEYXRhVmlld1xyXG4gKiB2aWV3Lm9uKCcqJywgZnVuY3Rpb24gKGV2ZW50LCBwcm9wZXJ0aWVzLCBzZW5kZXJJZCkge1xyXG4gKiAgIGNvbnNvbGUubG9nKCdldmVudCcsIGV2ZW50LCBwcm9wZXJ0aWVzKTtcclxuICogfSk7XHJcbiAqXHJcbiAqIC8vIHVwZGF0ZSBhbiBpdGVtIGluIHRoZSBkYXRhIHNldFxyXG4gKiBkYXRhLnVwZGF0ZSh7aWQ6IDIsIGdyb3VwOiAxfSk7XHJcbiAqXHJcbiAqIC8vIGdldCBhbGwgaWRzIGluIHRoZSB2aWV3XHJcbiAqIHZhciBpZHMgPSB2aWV3LmdldElkcygpO1xyXG4gKiBjb25zb2xlLmxvZygnaWRzJywgaWRzKTsgLy8gd2lsbCBvdXRwdXQgWzEsIDJdXHJcbiAqXHJcbiAqIC8vIGdldCBhbGwgaXRlbXMgaW4gdGhlIHZpZXdcclxuICogdmFyIGl0ZW1zID0gdmlldy5nZXQoKTtcclxuICogYGBgXHJcbiAqXHJcbiAqIEB0eXBlUGFyYW0gSXRlbSAtIEl0ZW0gdHlwZSB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYW4gaWQuXHJcbiAqIEB0eXBlUGFyYW0gSWRQcm9wIC0gTmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUgaWQuXHJcbiAqL1xyXG5jbGFzcyBEYXRhVmlldyBleHRlbmRzIERhdGFTZXRQYXJ0IHtcclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlIGEgRGF0YVZpZXcuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIGRhdGEgLSBUaGUgaW5zdGFuY2UgY29udGFpbmluZyBkYXRhIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KS5cclxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhpcyBkYXRhIHZpZXcuXHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgICAgIHRoaXMubGVuZ3RoID0gMDtcclxuICAgICAgICB0aGlzLl9pZHMgPSBuZXcgU2V0KCk7IC8vIGlkcyBvZiB0aGUgaXRlbXMgY3VycmVudGx5IGluIG1lbW9yeSAoanVzdCBjb250YWlucyBhIGJvb2xlYW4gdHJ1ZSlcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcclxuICAgICAgICB0aGlzLl9saXN0ZW5lciA9IHRoaXMuX29uRXZlbnQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldERhdGEoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIGdldCBpZFByb3AoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0YVNldCgpLmlkUHJvcDtcclxuICAgIH1cclxuICAgIC8vIFRPRE86IGltcGxlbWVudCBhIGZ1bmN0aW9uIC5jb25maWcoKSB0byBkeW5hbWljYWxseSB1cGRhdGUgdGhpbmdzIGxpa2UgY29uZmlndXJlZCBmaWx0ZXJcclxuICAgIC8vIGFuZCB0cmlnZ2VyIGNoYW5nZXMgYWNjb3JkaW5nbHlcclxuICAgIC8qKlxyXG4gICAgICogU2V0IGEgZGF0YSBzb3VyY2UgZm9yIHRoZSB2aWV3LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBkYXRhIC0gVGhlIGluc3RhbmNlIGNvbnRhaW5pbmcgZGF0YSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkuXHJcbiAgICAgKlxyXG4gICAgICogQHJlbWFya3NcclxuICAgICAqIE5vdGUgdGhhdCB3aGVuIHRoZSBkYXRhIHZpZXcgaXMgYm91bmQgdG8gYSBkYXRhIHNldCBpdCB3b24ndCBiZSBnYXJiYWdlXHJcbiAgICAgKiBjb2xsZWN0ZWQgdW5sZXNzIHRoZSBkYXRhIHNldCBpcyB0b28uIFVzZSBgZGF0YVZpZXcuc2V0RGF0YShudWxsKWAgb3JcclxuICAgICAqIGBkYXRhVmlldy5kaXNwb3NlKClgIHRvIGVuYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIHlvdSBsb3NlIHRoZSBsYXN0XHJcbiAgICAgKiByZWZlcmVuY2UuXHJcbiAgICAgKi9cclxuICAgIHNldERhdGEoZGF0YSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhKSB7XHJcbiAgICAgICAgICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gY3VycmVudCBkYXRhc2V0XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhLm9mZikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YS5vZmYoXCIqXCIsIHRoaXMuX2xpc3RlbmVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGEgcmVtb3ZlIG9mIGFsbCBpdGVtcyBpbiBtZW1vcnlcclxuICAgICAgICAgICAgY29uc3QgaWRzID0gdGhpcy5fZGF0YS5nZXRJZHMoeyBmaWx0ZXI6IHRoaXMuX29wdGlvbnMuZmlsdGVyIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2RhdGEuZ2V0KGlkcyk7XHJcbiAgICAgICAgICAgIHRoaXMuX2lkcy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIiwgeyBpdGVtczogaWRzLCBvbGREYXRhOiBpdGVtcyB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTtcclxuICAgICAgICAgICAgLy8gdHJpZ2dlciBhbiBhZGQgb2YgYWxsIGFkZGVkIGl0ZW1zXHJcbiAgICAgICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuX2RhdGEuZ2V0SWRzKHsgZmlsdGVyOiB0aGlzLl9vcHRpb25zLmZpbHRlciB9KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGlkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9pZHMuYWRkKGlkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IGlkcy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoXCJhZGRcIiwgeyBpdGVtczogaWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fZGF0YSA9IG5ldyBEYXRhU2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN1YnNjcmliZSB0byBuZXcgZGF0YXNldFxyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLm9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGEub24oXCIqXCIsIHRoaXMuX2xpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlZnJlc2ggdGhlIERhdGFWaWV3LlxyXG4gICAgICogVXNlZnVsIHdoZW4gdGhlIERhdGFWaWV3IGhhcyBhIGZpbHRlciBmdW5jdGlvbiBjb250YWluaW5nIGEgdmFyaWFibGUgcGFyYW1ldGVyLlxyXG4gICAgICovXHJcbiAgICByZWZyZXNoKCkge1xyXG4gICAgICAgIGNvbnN0IGlkcyA9IHRoaXMuX2RhdGEuZ2V0SWRzKHtcclxuICAgICAgICAgICAgZmlsdGVyOiB0aGlzLl9vcHRpb25zLmZpbHRlcixcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBvbGRJZHMgPSBbLi4udGhpcy5faWRzXTtcclxuICAgICAgICBjb25zdCBuZXdJZHMgPSB7fTtcclxuICAgICAgICBjb25zdCBhZGRlZElkcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWRJZHMgPSBbXTtcclxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbXMgPSBbXTtcclxuICAgICAgICAvLyBjaGVjayBmb3IgYWRkaXRpb25zXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGlkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IGlkc1tpXTtcclxuICAgICAgICAgICAgbmV3SWRzW2lkXSA9IHRydWU7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5faWRzLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgIGFkZGVkSWRzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faWRzLmFkZChpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlbW92YWxzXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IG9sZElkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IG9sZElkc1tpXTtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2RhdGEuZ2V0KGlkKTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gQFRPRE86IEludmVzdGlnYXRlLlxyXG4gICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYXBwZW4gZHVyaW5nIHRlc3RzIG9yIGV4YW1wbGVzLlxyXG4gICAgICAgICAgICAgICAgLy8gSXMgaXQgcmVhbGx5IGltcG9zc2libGUgb3IgY291bGQgaXQgZXZlbnR1YWxseSBoYXBwZW4/XHJcbiAgICAgICAgICAgICAgICAvLyBIb3cgdG8gaGFuZGxlIGl0IGlmIGl0IGRvZXM/IFRoZSB0eXBlcyBndWFyYW50ZWUgbm9uLW51bGxhYmxlIGl0ZW1zLlxyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIklmIHlvdSBzZWUgdGhpcywgcmVwb3J0IGl0IHBsZWFzZS5cIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoIW5ld0lkc1tpZF0pIHtcclxuICAgICAgICAgICAgICAgIHJlbW92ZWRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICByZW1vdmVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2lkcy5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGFkZGVkSWRzLmxlbmd0aCAtIHJlbW92ZWRJZHMubGVuZ3RoO1xyXG4gICAgICAgIC8vIHRyaWdnZXIgZXZlbnRzXHJcbiAgICAgICAgaWYgKGFkZGVkSWRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKFwiYWRkXCIsIHsgaXRlbXM6IGFkZGVkSWRzIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVtb3ZlZElkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLCB7IGl0ZW1zOiByZW1vdmVkSWRzLCBvbGREYXRhOiByZW1vdmVkSXRlbXMgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICBnZXQoZmlyc3QsIHNlY29uZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHBhcnNlIHRoZSBhcmd1bWVudHNcclxuICAgICAgICBsZXQgaWRzID0gbnVsbDtcclxuICAgICAgICBsZXQgb3B0aW9ucztcclxuICAgICAgICBpZiAoaXNJZChmaXJzdCkgfHwgQXJyYXkuaXNBcnJheShmaXJzdCkpIHtcclxuICAgICAgICAgICAgaWRzID0gZmlyc3Q7XHJcbiAgICAgICAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRpb25zID0gZmlyc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGV4dGVuZCB0aGUgb3B0aW9ucyB3aXRoIHRoZSBkZWZhdWx0IG9wdGlvbnMgYW5kIHByb3ZpZGVkIG9wdGlvbnNcclxuICAgICAgICBjb25zdCB2aWV3T3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIGNvbWJpbmVkIGZpbHRlciBtZXRob2Qgd2hlbiBuZWVkZWRcclxuICAgICAgICBjb25zdCB0aGlzRmlsdGVyID0gdGhpcy5fb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbHRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgaWYgKHRoaXNGaWx0ZXIgJiYgb3B0aW9uc0ZpbHRlcikge1xyXG4gICAgICAgICAgICB2aWV3T3B0aW9ucy5maWx0ZXIgPSAoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNGaWx0ZXIoaXRlbSkgJiYgb3B0aW9uc0ZpbHRlcihpdGVtKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkcyA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldCh2aWV3T3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXQoaWRzLCB2aWV3T3B0aW9ucyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICBnZXRJZHMob3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0RmlsdGVyID0gdGhpcy5fb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnNGaWx0ZXIgPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zLmZpbHRlciA6IG51bGw7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVyKGl0ZW0pICYmIG9wdGlvbnNGaWx0ZXIoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IG9wdGlvbnNGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLmdldElkcyh7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXI6IGZpbHRlcixcclxuICAgICAgICAgICAgICAgIG9yZGVyOiBvcHRpb25zICYmIG9wdGlvbnMub3JkZXIsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xyXG4gICAgZm9yRWFjaChjYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSB0aGlzLl9vcHRpb25zLmZpbHRlcjtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbHRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVyKGl0ZW0pICYmIG9wdGlvbnNGaWx0ZXIoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IG9wdGlvbnNGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX2RhdGEuZm9yRWFjaChjYWxsYmFjaywge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICBvcmRlcjogb3B0aW9ucyAmJiBvcHRpb25zLm9yZGVyLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIG1hcChjYWxsYmFjaywgb3B0aW9ucykge1xyXG4gICAgICAgIGlmICh0aGlzLl9kYXRhKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSB0aGlzLl9vcHRpb25zLmZpbHRlcjtcclxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbHRlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5maWx0ZXI7XHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXI7XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zRmlsdGVyKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdEZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RmlsdGVyKGl0ZW0pICYmIG9wdGlvbnNGaWx0ZXIoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IG9wdGlvbnNGaWx0ZXI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhLm1hcChjYWxsYmFjaywge1xyXG4gICAgICAgICAgICAgICAgZmlsdGVyOiBmaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICBvcmRlcjogb3B0aW9ucyAmJiBvcHRpb25zLm9yZGVyLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvKiogQGluaGVyaXREb2MgKi9cclxuICAgIGdldERhdGFTZXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0RGF0YVNldCgpO1xyXG4gICAgfVxyXG4gICAgLyoqIEBpbmhlcml0RG9jICovXHJcbiAgICBzdHJlYW0oaWRzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuc3RyZWFtKGlkcyB8fCB7XHJcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiB0aGlzLl9pZHMua2V5cy5iaW5kKHRoaXMuX2lkcyksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIFJlbmRlciB0aGUgaW5zdGFuY2UgdW51c2FibGUgcHJpb3IgdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEByZW1hcmtzXHJcbiAgICAgKiBUaGUgaW50ZW50aW9uIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGhlbHAgZGlzY292ZXIgc2NlbmFyaW9zIHdoZXJlIHRoZSBkYXRhXHJcbiAgICAgKiB2aWV3IGlzIGJlaW5nIHVzZWQgd2hlbiB0aGUgcHJvZ3JhbW1lciB0aGlua3MgaXQgaGFzIGJlZW4gZ2FyYmFnZSBjb2xsZWN0ZWRcclxuICAgICAqIGFscmVhZHkuIEl0J3Mgc3RyaWN0ZXIgdmVyc2lvbiBvZiBgZGF0YVZpZXcuc2V0RGF0YShudWxsKWAuXHJcbiAgICAgKi9cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RhdGE/Lm9mZikge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhLm9mZihcIipcIiwgdGhpcy5fbGlzdGVuZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gXCJUaGlzIGRhdGEgdmlldyBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mLlwiO1xyXG4gICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0ge1xyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0OiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoRGF0YVZpZXcucHJvdG90eXBlKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywga2V5LCByZXBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCBsaXN0ZW5lci4gV2lsbCBwcm9wYWdhdGUgYWxsIGV2ZW50cyBmcm9tIHRoZSBjb25uZWN0ZWQgZGF0YSBzZXQgdG8gdGhlIHN1YnNjcmliZXJzIG9mIHRoZSBEYXRhVmlldywgYnV0IHdpbGwgZmlsdGVyIHRoZSBpdGVtcyBhbmQgb25seSB0cmlnZ2VyIHdoZW4gdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIGZpbHRlcmVkIGRhdGEgc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cclxuICAgICAqIEBwYXJhbSBwYXJhbXMgLSBQYXJhbWV0ZXJzIG9mIHRoZSBldmVudC5cclxuICAgICAqIEBwYXJhbSBzZW5kZXJJZCAtIElkIHN1cHBsaWVkIGJ5IHRoZSBzZW5kZXIuXHJcbiAgICAgKi9cclxuICAgIF9vbkV2ZW50KGV2ZW50LCBwYXJhbXMsIHNlbmRlcklkKSB7XHJcbiAgICAgICAgaWYgKCFwYXJhbXMgfHwgIXBhcmFtcy5pdGVtcyB8fCAhdGhpcy5fZGF0YSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGlkcyA9IHBhcmFtcy5pdGVtcztcclxuICAgICAgICBjb25zdCBhZGRlZElkcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IHVwZGF0ZWRJZHMgPSBbXTtcclxuICAgICAgICBjb25zdCByZW1vdmVkSWRzID0gW107XHJcbiAgICAgICAgY29uc3Qgb2xkSXRlbXMgPSBbXTtcclxuICAgICAgICBjb25zdCB1cGRhdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbXMgPSBbXTtcclxuICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciB0aGUgaWRzIG9mIHRoZSBhZGRlZCBpdGVtc1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGlkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaWRzW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRzLmFkZChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkSWRzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIGV2ZW50IGZyb20gdGhlIHZpZXdzIHZpZXdwb2ludDogYW4gdXBkYXRlZFxyXG4gICAgICAgICAgICAgICAgLy8gaXRlbSBjYW4gYmUgYWRkZWQsIHVwZGF0ZWQsIG9yIHJlbW92ZWQgZnJvbSB0aGlzIHZpZXcuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0KGlkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faWRzLmhhcyhpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkSXRlbXMucHVzaChwYXJhbXMuZGF0YVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRJdGVtcy5wdXNoKHBhcmFtcy5vbGREYXRhW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkcy5hZGQoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRJZHMucHVzaChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pZHMuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkSWRzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZEl0ZW1zLnB1c2gocGFyYW1zLm9sZERhdGFbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJyZW1vdmVcIjpcclxuICAgICAgICAgICAgICAgIC8vIGZpbHRlciB0aGUgaWRzIG9mIHRoZSByZW1vdmVkIGl0ZW1zXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gaWRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpZHNbaV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lkcy5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lkcy5kZWxldGUoaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkSWRzLnB1c2goaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkSXRlbXMucHVzaChwYXJhbXMub2xkRGF0YVtpXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGFkZGVkSWRzLmxlbmd0aCAtIHJlbW92ZWRJZHMubGVuZ3RoO1xyXG4gICAgICAgIGlmIChhZGRlZElkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcImFkZFwiLCB7IGl0ZW1zOiBhZGRlZElkcyB9LCBzZW5kZXJJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh1cGRhdGVkSWRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyKFwidXBkYXRlXCIsIHsgaXRlbXM6IHVwZGF0ZWRJZHMsIG9sZERhdGE6IG9sZEl0ZW1zLCBkYXRhOiB1cGRhdGVkSXRlbXMgfSwgc2VuZGVySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocmVtb3ZlZElkcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLCB7IGl0ZW1zOiByZW1vdmVkSWRzLCBvbGREYXRhOiByZW1vdmVkSXRlbXMgfSwgc2VuZGVySWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxuXG4vKipcclxuICogQ2hlY2sgdGhhdCBnaXZlbiB2YWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggVmlzIERhdGEgU2V0IGludGVyZmFjZS5cclxuICpcclxuICogQHBhcmFtIGlkUHJvcCAtIFRoZSBleHBlY3RlZCBwcm9wZXJ0eSB0byBjb250YWluIGl0ZW0gaWQuXHJcbiAqIEBwYXJhbSB2IC0gVGhlIHZhbHVlIHRvIGJlIHRlc3RlZC5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgdmFsdWVzIGFuZCBtZXRob2RzIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0RhdGFTZXRMaWtlKGlkUHJvcCwgdikge1xyXG4gICAgcmV0dXJuICh0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJlxyXG4gICAgICAgIHYgIT09IG51bGwgJiZcclxuICAgICAgICBpZFByb3AgPT09IHYuaWRQcm9wICYmXHJcbiAgICAgICAgdHlwZW9mIHYuYWRkID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5jbGVhciA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYuZGlzdGluY3QgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LmZvckVhY2ggPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LmdldCA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYuZ2V0RGF0YVNldCA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYuZ2V0SWRzID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5sZW5ndGggPT09IFwibnVtYmVyXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5tYXAgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2Lm1heCA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYubWluID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5vZmYgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2Lm9uID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5yZW1vdmUgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LnNldE9wdGlvbnMgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LnN0cmVhbSA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYudXBkYXRlID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi51cGRhdGVPbmx5ID09PSBcImZ1bmN0aW9uXCIpO1xyXG59XG5cbi8qKlxyXG4gKiBDaGVjayB0aGF0IGdpdmVuIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aCBWaXMgRGF0YSBWaWV3IGludGVyZmFjZS5cclxuICpcclxuICogQHBhcmFtIGlkUHJvcCAtIFRoZSBleHBlY3RlZCBwcm9wZXJ0eSB0byBjb250YWluIGl0ZW0gaWQuXHJcbiAqIEBwYXJhbSB2IC0gVGhlIHZhbHVlIHRvIGJlIHRlc3RlZC5cclxuICpcclxuICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgZXhwZWN0ZWQgdmFsdWVzIGFuZCBtZXRob2RzIG1hdGNoLCBmYWxzZSBvdGhlcndpc2UuXHJcbiAqL1xyXG5mdW5jdGlvbiBpc0RhdGFWaWV3TGlrZShpZFByb3AsIHYpIHtcclxuICAgIHJldHVybiAodHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiZcclxuICAgICAgICB2ICE9PSBudWxsICYmXHJcbiAgICAgICAgaWRQcm9wID09PSB2LmlkUHJvcCAmJlxyXG4gICAgICAgIHR5cGVvZiB2LmZvckVhY2ggPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LmdldCA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYuZ2V0RGF0YVNldCA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYuZ2V0SWRzID09PSBcImZ1bmN0aW9uXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5sZW5ndGggPT09IFwibnVtYmVyXCIgJiZcclxuICAgICAgICB0eXBlb2Ygdi5tYXAgPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2Lm9mZiA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgdHlwZW9mIHYub24gPT09IFwiZnVuY3Rpb25cIiAmJlxyXG4gICAgICAgIHR5cGVvZiB2LnN0cmVhbSA9PT0gXCJmdW5jdGlvblwiICYmXHJcbiAgICAgICAgaXNEYXRhU2V0TGlrZShpZFByb3AsIHYuZ2V0RGF0YVNldCgpKSk7XHJcbn1cblxuZXhwb3J0IHsgRGF0YVNldCwgRGF0YVN0cmVhbSwgRGF0YVZpZXcsIFF1ZXVlLCBjcmVhdGVOZXdEYXRhUGlwZUZyb20sIGlzRGF0YVNldExpa2UsIGlzRGF0YVZpZXdMaWtlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aXMtZGF0YS5qcy5tYXBcbiIsIi8qKlxuICogY3NzZmlsdGVyXG4gKlxuICogQGF1dGhvciDogIHpm7c8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxuZnVuY3Rpb24gZ2V0RGVmYXVsdFdoaXRlTGlzdCAoKSB7XG4gIC8vIOeZveWQjeWNleWAvOivtOaYju+8mlxuICAvLyB0cnVlOiDlhYHorrjor6XlsZ7mgKdcbiAgLy8gRnVuY3Rpb246IGZ1bmN0aW9uICh2YWwpIHsgfSDov5Tlm550cnVl6KGo56S65YWB6K646K+l5bGe5oCn77yM5YW25LuW5YC85Z2H6KGo56S65LiN5YWB6K64XG4gIC8vIFJlZ0V4cDogcmVnZXhwLnRlc3QodmFsKSDov5Tlm550cnVl6KGo56S65YWB6K646K+l5bGe5oCn77yM5YW25LuW5YC85Z2H6KGo56S65LiN5YWB6K64XG4gIC8vIOmZpOS4iumdouWIl+WHuueahOWAvOWkluWdh+ihqOekuuS4jeWFgeiuuFxuICB2YXIgd2hpdGVMaXN0ID0ge307XG5cbiAgd2hpdGVMaXN0WydhbGlnbi1jb250ZW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2FsaWduLWl0ZW1zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2FsaWduLXNlbGYnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnYWxpZ25tZW50LWFkanVzdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydhbGlnbm1lbnQtYmFzZWxpbmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBiYXNlbGluZVxuICB3aGl0ZUxpc3RbJ2FsbCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydhbmNob3ItcG9pbnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2FuaW1hdGlvbi1kZWxheSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tZGlyZWN0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLWR1cmF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ2FuaW1hdGlvbi1maWxsLW1vZGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDFcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tbmFtZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tcGxheS1zdGF0ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHJ1bm5pbmdcbiAgd2hpdGVMaXN0WydhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZWFzZVxuICB3aGl0ZUxpc3RbJ2F6aW11dGgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBjZW50ZXJcbiAgd2hpdGVMaXN0WydiYWNrZmFjZS12aXNpYmlsaXR5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogdmlzaWJsZVxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydiYWNrZ3JvdW5kLWF0dGFjaG1lbnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IHNjcm9sbFxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtY2xpcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYm9yZGVyLWJveFxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IHRyYW5zcGFyZW50XG4gIHdoaXRlTGlzdFsnYmFja2dyb3VuZC1pbWFnZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtb3JpZ2luJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBwYWRkaW5nLWJveFxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtcG9zaXRpb24nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDAlIDAlXG4gIHdoaXRlTGlzdFsnYmFja2dyb3VuZC1yZXBlYXQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IHJlcGVhdFxuICB3aGl0ZUxpc3RbJ2JhY2tncm91bmQtc2l6ZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2Jhc2VsaW5lLXNoaWZ0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYmFzZWxpbmVcbiAgd2hpdGVMaXN0WydiaW5kaW5nJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2JsZWVkJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNnB0XG4gIHdoaXRlTGlzdFsnYm9va21hcmstbGFiZWwnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBjb250ZW50KClcbiAgd2hpdGVMaXN0Wydib29rbWFyay1sZXZlbCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydib29rbWFyay1zdGF0ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG9wZW5cbiAgd2hpdGVMaXN0Wydib3JkZXInXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydib3JkZXItYm90dG9tJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWJvdHRvbS1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogY3VycmVudCBjb2xvclxuICB3aGl0ZUxpc3RbJ2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ2JvcmRlci1ib3R0b20tc3R5bGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydib3JkZXItYm90dG9tLXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydib3JkZXItY29sbGFwc2UnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IHNlcGFyYXRlXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWltYWdlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWltYWdlLW91dHNldCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ2JvcmRlci1pbWFnZS1yZXBlYXQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IHN0cmV0Y2hcbiAgd2hpdGVMaXN0Wydib3JkZXItaW1hZ2Utc2xpY2UnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDEwMCVcbiAgd2hpdGVMaXN0Wydib3JkZXItaW1hZ2Utc291cmNlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWltYWdlLXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAxXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWxlZnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydib3JkZXItbGVmdC1jb2xvciddID0gdHJ1ZTsgLy8gZGVmYXVsdDogY3VycmVudCBjb2xvclxuICB3aGl0ZUxpc3RbJ2JvcmRlci1sZWZ0LXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLWxlZnQtd2lkdGgnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1yYWRpdXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydib3JkZXItcmlnaHQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydib3JkZXItcmlnaHQtY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGN1cnJlbnQgY29sb3JcbiAgd2hpdGVMaXN0Wydib3JkZXItcmlnaHQtc3R5bGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydib3JkZXItcmlnaHQtd2lkdGgnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ2JvcmRlci1zcGFjaW5nJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXRvcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2JvcmRlci10b3AtY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGN1cnJlbnQgY29sb3JcbiAgd2hpdGVMaXN0Wydib3JkZXItdG9wLWxlZnQtcmFkaXVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydib3JkZXItdG9wLXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXRvcC13aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsnYm9yZGVyLXdpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnYm90dG9tJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2JveC1kZWNvcmF0aW9uLWJyZWFrJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzbGljZVxuICB3aGl0ZUxpc3RbJ2JveC1zaGFkb3cnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydib3gtc2l6aW5nJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjb250ZW50LWJveFxuICB3aGl0ZUxpc3RbJ2JveC1zbmFwJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnYm94LXN1cHByZXNzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzaG93XG4gIHdoaXRlTGlzdFsnYnJlYWstYWZ0ZXInXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydicmVhay1iZWZvcmUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydicmVhay1pbnNpZGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydjYXB0aW9uLXNpZGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiB0b3BcbiAgd2hpdGVMaXN0WydjaGFpbnMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY2xlYXInXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydjbGlwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2NsaXAtcGF0aCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydjbGlwLXJ1bGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub256ZXJvXG4gIHdoaXRlTGlzdFsnY29sb3InXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudFxuICB3aGl0ZUxpc3RbJ2NvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2NvbHVtbi1jb3VudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydjb2x1bW4tZmlsbCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJhbGFuY2VcbiAgd2hpdGVMaXN0Wydjb2x1bW4tZ2FwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnY29sdW1uLXJ1bGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnY29sdW1uLXJ1bGUtY29sb3InXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBjdXJyZW50IGNvbG9yXG4gIHdoaXRlTGlzdFsnY29sdW1uLXJ1bGUtc3R5bGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBtZWRpdW1cbiAgd2hpdGVMaXN0Wydjb2x1bW4tcnVsZS13aWR0aCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ2NvbHVtbi1zcGFuJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2NvbHVtbi13aWR0aCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydjb2x1bW5zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2NvbnRhaW4nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY29udGVudCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2NvdW50ZXItaW5jcmVtZW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2NvdW50ZXItcmVzZXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY291bnRlci1zZXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY3JvcCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydjdWUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnY3VlLWFmdGVyJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2N1ZS1iZWZvcmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnY3Vyc29yJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2RpcmVjdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGx0clxuICB3aGl0ZUxpc3RbJ2Rpc3BsYXknXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydkaXNwbGF5LWluc2lkZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2Rpc3BsYXktbGlzdCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2Rpc3BsYXktb3V0c2lkZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogaW5saW5lLWxldmVsXG4gIHdoaXRlTGlzdFsnZG9taW5hbnQtYmFzZWxpbmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZWxldmF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbGV2ZWxcbiAgd2hpdGVMaXN0WydlbXB0eS1jZWxscyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHNob3dcbiAgd2hpdGVMaXN0WydmaWx0ZXInXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZmxleCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydmbGV4LWJhc2lzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2ZsZXgtZGlyZWN0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogcm93XG4gIHdoaXRlTGlzdFsnZmxleC1mbG93J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2ZsZXgtZ3JvdyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydmbGV4LXNocmluayddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDFcbiAgd2hpdGVMaXN0WydmbGV4LXdyYXAnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3dyYXBcbiAgd2hpdGVMaXN0WydmbG9hdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydmbG9hdC1vZmZzZXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwIDBcbiAgd2hpdGVMaXN0WydmbG9vZC1jb2xvciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJsYWNrXG4gIHdoaXRlTGlzdFsnZmxvb2Qtb3BhY2l0eSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDFcbiAgd2hpdGVMaXN0WydmbG93LWZyb20nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZmxvdy1pbnRvJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2ZvbnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wydmb250LWZhbWlseSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50XG4gIHdoaXRlTGlzdFsnZm9udC1mZWF0dXJlLXNldHRpbmdzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LWtlcm5pbmcnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wydmb250LWxhbmd1YWdlLW92ZXJyaWRlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXNpemUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ2ZvbnQtc2l6ZS1hZGp1c3QnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wydmb250LXN0cmV0Y2gnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtc3R5bGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtc3ludGhlc2lzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiB3ZWlnaHQgc3R5bGVcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtdmFyaWFudC1hbHRlcm5hdGVzJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQtY2FwcyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnZm9udC12YXJpYW50LWVhc3QtYXNpYW4nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtdmFyaWFudC1saWdhdHVyZXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtdmFyaWFudC1udW1lcmljJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wydmb250LXZhcmlhbnQtcG9zaXRpb24nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ZvbnQtd2VpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydncmlkJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ2dyaWQtYXJlYSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydncmlkLWF1dG8tY29sdW1ucyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydncmlkLWF1dG8tZmxvdyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydncmlkLWF1dG8tcm93cyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydncmlkLWNvbHVtbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydncmlkLWNvbHVtbi1lbmQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZ3JpZC1jb2x1bW4tc3RhcnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnZ3JpZC1yb3cnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZ3JpZC1yb3ctZW5kJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2dyaWQtcm93LXN0YXJ0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2dyaWQtdGVtcGxhdGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnZ3JpZC10ZW1wbGF0ZS1hcmVhcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydncmlkLXRlbXBsYXRlLWNvbHVtbnMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnZ3JpZC10ZW1wbGF0ZS1yb3dzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2hhbmdpbmctcHVuY3R1YXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnaGVpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnaHlwaGVucyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1hbnVhbFxuICB3aGl0ZUxpc3RbJ2ljb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnaW1hZ2Utb3JpZW50YXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnaW1hZ2UtcmVzb2x1dGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2ltZS1tb2RlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2luaXRpYWwtbGV0dGVycyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2lubGluZS1ib3gtYWxpZ24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBsYXN0XG4gIHdoaXRlTGlzdFsnanVzdGlmeS1jb250ZW50J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2p1c3RpZnktaXRlbXMnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnanVzdGlmeS1zZWxmJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2xlZnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbGV0dGVyLXNwYWNpbmcnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ2xpZ2h0aW5nLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiB3aGl0ZVxuICB3aGl0ZUxpc3RbJ2xpbmUtYm94LWNvbnRhaW4nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBibG9jayBpbmxpbmUgcmVwbGFjZWRcbiAgd2hpdGVMaXN0WydsaW5lLWJyZWFrJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ2xpbmUtZ3JpZCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1hdGNoLXBhcmVudFxuICB3aGl0ZUxpc3RbJ2xpbmUtaGVpZ2h0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnbGluZS1zbmFwJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2xpbmUtc3RhY2tpbmcnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnbGluZS1zdGFja2luZy1ydWJ5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZXhjbHVkZS1ydWJ5XG4gIHdoaXRlTGlzdFsnbGluZS1zdGFja2luZy1zaGlmdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGNvbnNpZGVyLXNoaWZ0c1xuICB3aGl0ZUxpc3RbJ2xpbmUtc3RhY2tpbmctc3RyYXRlZ3knXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBpbmxpbmUtbGluZS1oZWlnaHRcbiAgd2hpdGVMaXN0WydsaXN0LXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnbGlzdC1zdHlsZS1pbWFnZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ2xpc3Qtc3R5bGUtcG9zaXRpb24nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG91dHNpZGVcbiAgd2hpdGVMaXN0WydsaXN0LXN0eWxlLXR5cGUnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRpc2NcbiAgd2hpdGVMaXN0WydtYXJnaW4nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0WydtYXJnaW4tYm90dG9tJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbWFyZ2luLWxlZnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydtYXJnaW4tcmlnaHQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydtYXJnaW4tdG9wJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnbWFya2VyLW9mZnNldCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydtYXJrZXItc2lkZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGxpc3QtaXRlbVxuICB3aGl0ZUxpc3RbJ21hcmtzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ21hc2snXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBib3JkZXItYm94XG4gIHdoaXRlTGlzdFsnbWFzay1ib3gnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBzZWUgaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnbWFzay1ib3gtb3V0c2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ21hc2stYm94LXJlcGVhdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHN0cmV0Y2hcbiAgd2hpdGVMaXN0WydtYXNrLWJveC1zbGljZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDAgZmlsbFxuICB3aGl0ZUxpc3RbJ21hc2stYm94LXNvdXJjZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydtYXNrLWJveC13aWR0aCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydtYXNrLWNsaXAnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBib3JkZXItYm94XG4gIHdoaXRlTGlzdFsnbWFzay1pbWFnZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydtYXNrLW9yaWdpbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGJvcmRlci1ib3hcbiAgd2hpdGVMaXN0WydtYXNrLXBvc2l0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY2VudGVyXG4gIHdoaXRlTGlzdFsnbWFzay1yZXBlYXQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBuby1yZXBlYXRcbiAgd2hpdGVMaXN0WydtYXNrLXNpemUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBib3JkZXItYm94XG4gIHdoaXRlTGlzdFsnbWFzay1zb3VyY2UtdHlwZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydtYXNrLXR5cGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBsdW1pbmFuY2VcbiAgd2hpdGVMaXN0WydtYXgtaGVpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnbWF4LWxpbmVzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ21heC13aWR0aCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ21pbi1oZWlnaHQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydtaW4td2lkdGgnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wydtb3ZlLXRvJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnbmF2LWRvd24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnbmF2LWluZGV4J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ25hdi1sZWZ0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ25hdi1yaWdodCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WyduYXYtdXAnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnb2JqZWN0LWZpdCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGZpbGxcbiAgd2hpdGVMaXN0WydvYmplY3QtcG9zaXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiA1MCUgNTAlXG4gIHdoaXRlTGlzdFsnb3BhY2l0eSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDFcbiAgd2hpdGVMaXN0WydvcmRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0WydvcnBoYW5zJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMlxuICB3aGl0ZUxpc3RbJ291dGxpbmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsnb3V0bGluZS1jb2xvciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGludmVydFxuICB3aGl0ZUxpc3RbJ291dGxpbmUtb2Zmc2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ291dGxpbmUtc3R5bGUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsnb3V0bGluZS13aWR0aCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ292ZXJmbG93J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ292ZXJmbG93LXdyYXAnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0WydvdmVyZmxvdy14J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogdmlzaWJsZVxuICB3aGl0ZUxpc3RbJ292ZXJmbG93LXknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiB2aXNpYmxlXG4gIHdoaXRlTGlzdFsncGFkZGluZyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogZGVwZW5kaW5nIG9uIGluZGl2aWR1YWwgcHJvcGVydGllc1xuICB3aGl0ZUxpc3RbJ3BhZGRpbmctYm90dG9tJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsncGFkZGluZy1sZWZ0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsncGFkZGluZy1yaWdodCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3BhZGRpbmctdG9wJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsncGFnZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydwYWdlLWJyZWFrLWFmdGVyJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3BhZ2UtYnJlYWstYmVmb3JlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3BhZ2UtYnJlYWstaW5zaWRlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3BhZ2UtcG9saWN5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogc3RhcnRcbiAgd2hpdGVMaXN0WydwYXVzZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudFxuICB3aGl0ZUxpc3RbJ3BhdXNlLWFmdGVyJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50XG4gIHdoaXRlTGlzdFsncGF1c2UtYmVmb3JlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogaW1wbGVtZW50YXRpb24gZGVwZW5kZW50XG4gIHdoaXRlTGlzdFsncGVyc3BlY3RpdmUnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsncGVyc3BlY3RpdmUtb3JpZ2luJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTAlIDUwJVxuICB3aGl0ZUxpc3RbJ3BpdGNoJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsncGl0Y2gtcmFuZ2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiA1MFxuICB3aGl0ZUxpc3RbJ3BsYXktZHVyaW5nJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3Bvc2l0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogc3RhdGljXG4gIHdoaXRlTGlzdFsncHJlc2VudGF0aW9uLWxldmVsJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMFxuICB3aGl0ZUxpc3RbJ3F1b3RlcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IHRleHRcbiAgd2hpdGVMaXN0WydyZWdpb24tZnJhZ21lbnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsncmVzaXplJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3Jlc3QnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsncmVzdC1hZnRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydyZXN0LWJlZm9yZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydyaWNobmVzcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDUwXG4gIHdoaXRlTGlzdFsncmlnaHQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsncm90YXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsncm90YXRpb24tcG9pbnQnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiA1MCUgNTAlXG4gIHdoaXRlTGlzdFsncnVieS1hbGlnbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydydWJ5LW1lcmdlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogc2VwYXJhdGVcbiAgd2hpdGVMaXN0WydydWJ5LXBvc2l0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYmVmb3JlXG4gIHdoaXRlTGlzdFsnc2hhcGUtaW1hZ2UtdGhyZXNob2xkJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMC4wXG4gIHdoaXRlTGlzdFsnc2hhcGUtb3V0c2lkZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0WydzaGFwZS1tYXJnaW4nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiAwXG4gIHdoaXRlTGlzdFsnc2l6ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydzcGVhayddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0WydzcGVhay1hcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3NwZWFrLWhlYWRlciddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG9uY2VcbiAgd2hpdGVMaXN0WydzcGVhay1udW1lcmFsJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogY29udGludW91c1xuICB3aGl0ZUxpc3RbJ3NwZWFrLXB1bmN0dWF0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3NwZWVjaC1yYXRlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsnc3RyZXNzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTBcbiAgd2hpdGVMaXN0WydzdHJpbmctc2V0J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RhYi1zaXplJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogOFxuICB3aGl0ZUxpc3RbJ3RhYmxlLWxheW91dCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd0ZXh0LWFsaWduJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzdGFydFxuICB3aGl0ZUxpc3RbJ3RleHQtYWxpZ24tbGFzdCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3RleHQtY29tYmluZS11cHJpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsndGV4dC1kZWNvcmF0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub25lXG4gIHdoaXRlTGlzdFsndGV4dC1kZWNvcmF0aW9uLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjdXJyZW50Q29sb3JcbiAgd2hpdGVMaXN0Wyd0ZXh0LWRlY29yYXRpb24tbGluZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RleHQtZGVjb3JhdGlvbi1za2lwJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBvYmplY3RzXG4gIHdoaXRlTGlzdFsndGV4dC1kZWNvcmF0aW9uLXN0eWxlJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBzb2xpZFxuICB3aGl0ZUxpc3RbJ3RleHQtZW1waGFzaXMnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGRlcGVuZGluZyBvbiBpbmRpdmlkdWFsIHByb3BlcnRpZXNcbiAgd2hpdGVMaXN0Wyd0ZXh0LWVtcGhhc2lzLWNvbG9yJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBjdXJyZW50Q29sb3JcbiAgd2hpdGVMaXN0Wyd0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBvdmVyIHJpZ2h0XG4gIHdoaXRlTGlzdFsndGV4dC1lbXBoYXNpcy1zdHlsZSddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RleHQtaGVpZ2h0J10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsndGV4dC1pbmRlbnQnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IDBcbiAgd2hpdGVMaXN0Wyd0ZXh0LWp1c3RpZnknXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd0ZXh0LW9yaWVudGF0aW9uJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBtaXhlZFxuICB3aGl0ZUxpc3RbJ3RleHQtb3ZlcmZsb3cnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGNsaXBcbiAgd2hpdGVMaXN0Wyd0ZXh0LXNoYWRvdyddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9uZVxuICB3aGl0ZUxpc3RbJ3RleHQtc3BhY2UtY29sbGFwc2UnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IGNvbGxhcHNlXG4gIHdoaXRlTGlzdFsndGV4dC10cmFuc2Zvcm0nXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiddID0gdHJ1ZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3RleHQtd3JhcCddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsndG9wJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYXV0b1xuICB3aGl0ZUxpc3RbJ3RyYW5zZm9ybSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vbmVcbiAgd2hpdGVMaXN0Wyd0cmFuc2Zvcm0tb3JpZ2luJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogNTAlIDUwJSAwXG4gIHdoaXRlTGlzdFsndHJhbnNmb3JtLXN0eWxlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZmxhdFxuICB3aGl0ZUxpc3RbJ3RyYW5zaXRpb24nXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBkZXBlbmRpbmcgb24gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzXG4gIHdoaXRlTGlzdFsndHJhbnNpdGlvbi1kZWxheSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBzXG4gIHdoaXRlTGlzdFsndHJhbnNpdGlvbi1kdXJhdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IDBzXG4gIHdoaXRlTGlzdFsndHJhbnNpdGlvbi1wcm9wZXJ0eSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGFsbFxuICB3aGl0ZUxpc3RbJ3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogZWFzZVxuICB3aGl0ZUxpc3RbJ3VuaWNvZGUtYmlkaSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3ZlcnRpY2FsLWFsaWduJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogYmFzZWxpbmVcbiAgd2hpdGVMaXN0Wyd2aXNpYmlsaXR5J10gPSBmYWxzZTsgLy8gZGVmYXVsdDogdmlzaWJsZVxuICB3aGl0ZUxpc3RbJ3ZvaWNlLWJhbGFuY2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBjZW50ZXJcbiAgd2hpdGVMaXN0Wyd2b2ljZS1kdXJhdGlvbiddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd2b2ljZS1mYW1pbHknXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnRcbiAgd2hpdGVMaXN0Wyd2b2ljZS1waXRjaCddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3ZvaWNlLXJhbmdlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbWVkaXVtXG4gIHdoaXRlTGlzdFsndm9pY2UtcmF0ZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3ZvaWNlLXN0cmVzcyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3ZvaWNlLXZvbHVtZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3ZvbHVtZSddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IG1lZGl1bVxuICB3aGl0ZUxpc3RbJ3doaXRlLXNwYWNlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnd2lkb3dzJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogMlxuICB3aGl0ZUxpc3RbJ3dpZHRoJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnd2lsbC1jaGFuZ2UnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG4gIHdoaXRlTGlzdFsnd29yZC1icmVhayddID0gdHJ1ZTsgLy8gZGVmYXVsdDogbm9ybWFsXG4gIHdoaXRlTGlzdFsnd29yZC1zcGFjaW5nJ10gPSB0cnVlOyAvLyBkZWZhdWx0OiBub3JtYWxcbiAgd2hpdGVMaXN0Wyd3b3JkLXdyYXAnXSA9IHRydWU7IC8vIGRlZmF1bHQ6IG5vcm1hbFxuICB3aGl0ZUxpc3RbJ3dyYXAtZmxvdyddID0gZmFsc2U7IC8vIGRlZmF1bHQ6IGF1dG9cbiAgd2hpdGVMaXN0Wyd3cmFwLXRocm91Z2gnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiB3cmFwXG4gIHdoaXRlTGlzdFsnd3JpdGluZy1tb2RlJ10gPSBmYWxzZTsgLy8gZGVmYXVsdDogaG9yaXpvbnRhbC10YlxuICB3aGl0ZUxpc3RbJ3otaW5kZXgnXSA9IGZhbHNlOyAvLyBkZWZhdWx0OiBhdXRvXG5cbiAgcmV0dXJuIHdoaXRlTGlzdDtcbn1cblxuXG4vKipcbiAqIOWMuemFjeWIsOeZveWQjeWNleS4iueahOS4gOS4quWxnuaAp+aXtlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uQXR0ciAobmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gZG8gbm90aGluZ1xufVxuXG4vKipcbiAqIOWMuemFjeWIsOS4jeWcqOeZveWQjeWNleS4iueahOS4gOS4quWxnuaAp+aXtlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uSWdub3JlQXR0ciAobmFtZSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgLy8gZG8gbm90aGluZ1xufVxuXG52YXIgUkVHRVhQX1VSTF9KQVZBU0NSSVBUID0gL2phdmFzY3JpcHRcXHMqXFw6L2ltZztcblxuLyoqXG4gKiDov4fmu6TlsZ7mgKflgLxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHNhZmVBdHRyVmFsdWUobmFtZSwgdmFsdWUpIHtcbiAgaWYgKFJFR0VYUF9VUkxfSkFWQVNDUklQVC50ZXN0KHZhbHVlKSkgcmV0dXJuICcnO1xuICByZXR1cm4gdmFsdWU7XG59XG5cblxuZXhwb3J0cy53aGl0ZUxpc3QgPSBnZXREZWZhdWx0V2hpdGVMaXN0KCk7XG5leHBvcnRzLmdldERlZmF1bHRXaGl0ZUxpc3QgPSBnZXREZWZhdWx0V2hpdGVMaXN0O1xuZXhwb3J0cy5vbkF0dHIgPSBvbkF0dHI7XG5leHBvcnRzLm9uSWdub3JlQXR0ciA9IG9uSWdub3JlQXR0cjtcbmV4cG9ydHMuc2FmZUF0dHJWYWx1ZSA9IHNhZmVBdHRyVmFsdWU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5kZXhPZjogZnVuY3Rpb24gKGFyciwgaXRlbSkge1xuICAgIHZhciBpLCBqO1xuICAgIGlmIChBcnJheS5wcm90b3R5cGUuaW5kZXhPZikge1xuICAgICAgcmV0dXJuIGFyci5pbmRleE9mKGl0ZW0pO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgaWYgKGFycltpXSA9PT0gaXRlbSkge1xuICAgICAgICByZXR1cm4gaTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9LFxuICBmb3JFYWNoOiBmdW5jdGlvbiAoYXJyLCBmbiwgc2NvcGUpIHtcbiAgICB2YXIgaSwgajtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgICAgIHJldHVybiBhcnIuZm9yRWFjaChmbiwgc2NvcGUpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgZm4uY2FsbChzY29wZSwgYXJyW2ldLCBpLCBhcnIpO1xuICAgIH1cbiAgfSxcbiAgdHJpbTogZnVuY3Rpb24gKHN0cikge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnRyaW0pIHtcbiAgICAgIHJldHVybiBzdHIudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyheXFxzKil8KFxccyokKS9nLCAnJyk7XG4gIH0sXG4gIHRyaW1SaWdodDogZnVuY3Rpb24gKHN0cikge1xuICAgIGlmIChTdHJpbmcucHJvdG90eXBlLnRyaW1SaWdodCkge1xuICAgICAgcmV0dXJuIHN0ci50cmltUmlnaHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXFxzKiQpL2csICcnKTtcbiAgfVxufTtcbiIsIi8qKlxuICogY3NzZmlsdGVyXG4gKlxuICogQGF1dGhvciDogIHpm7c8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxudmFyIF8gPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuXG4vKipcbiAqIOino+aekHN0eWxlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gb25BdHRyIOWkhOeQhuWxnuaAp+eahOWHveaVsFxuICogICDlj4LmlbDmoLzlvI/vvJogZnVuY3Rpb24gKHNvdXJjZVBvc2l0aW9uLCBwb3NpdGlvbiwgbmFtZSwgdmFsdWUsIHNvdXJjZSlcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdHlsZSAoY3NzLCBvbkF0dHIpIHtcbiAgY3NzID0gXy50cmltUmlnaHQoY3NzKTtcbiAgaWYgKGNzc1tjc3MubGVuZ3RoIC0gMV0gIT09ICc7JykgY3NzICs9ICc7JztcbiAgdmFyIGNzc0xlbmd0aCA9IGNzcy5sZW5ndGg7XG4gIHZhciBpc1BhcmVudGhlc2lzT3BlbiA9IGZhbHNlO1xuICB2YXIgbGFzdFBvcyA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJldENTUyA9ICcnO1xuXG4gIGZ1bmN0aW9uIGFkZE5ld0F0dHIgKCkge1xuICAgIC8vIOWmguaenOayoeacieato+W4uOeahOmXreWQiOWchuaLrOWPt++8jOWImeebtOaOpeW/veeVpeW9k+WJjeWxnuaAp1xuICAgIGlmICghaXNQYXJlbnRoZXNpc09wZW4pIHtcbiAgICAgIHZhciBzb3VyY2UgPSBfLnRyaW0oY3NzLnNsaWNlKGxhc3RQb3MsIGkpKTtcbiAgICAgIHZhciBqID0gc291cmNlLmluZGV4T2YoJzonKTtcbiAgICAgIGlmIChqICE9PSAtMSkge1xuICAgICAgICB2YXIgbmFtZSA9IF8udHJpbShzb3VyY2Uuc2xpY2UoMCwgaikpO1xuICAgICAgICB2YXIgdmFsdWUgPSBfLnRyaW0oc291cmNlLnNsaWNlKGogKyAxKSk7XG4gICAgICAgIC8vIOW/hemhu+acieWxnuaAp+WQjeensFxuICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgIHZhciByZXQgPSBvbkF0dHIobGFzdFBvcywgcmV0Q1NTLmxlbmd0aCwgbmFtZSwgdmFsdWUsIHNvdXJjZSk7XG4gICAgICAgICAgaWYgKHJldCkgcmV0Q1NTICs9IHJldCArICc7ICc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdFBvcyA9IGkgKyAxO1xuICB9XG5cbiAgZm9yICg7IGkgPCBjc3NMZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gY3NzW2ldO1xuICAgIGlmIChjID09PSAnLycgJiYgY3NzW2kgKyAxXSA9PT0gJyonKSB7XG4gICAgICAvLyDlpIfms6jlvIDlp4tcbiAgICAgIHZhciBqID0gY3NzLmluZGV4T2YoJyovJywgaSArIDIpO1xuICAgICAgLy8g5aaC5p6c5rKh5pyJ5q2j5bi455qE5aSH5rOo57uT5p2f77yM5YiZ5ZCO6Z2i55qE6YOo5YiG5YWo6YOo6Lez6L+HXG4gICAgICBpZiAoaiA9PT0gLTEpIGJyZWFrO1xuICAgICAgLy8g55u05o6l5bCG5b2T5YmN5L2N572u6LCD5Yiw5aSH5rOo57uT5bC+77yM5bm25LiU5Yid5aeL5YyW54q25oCBXG4gICAgICBpID0gaiArIDE7XG4gICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICBpc1BhcmVudGhlc2lzT3BlbiA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJygnKSB7XG4gICAgICBpc1BhcmVudGhlc2lzT3BlbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChjID09PSAnKScpIHtcbiAgICAgIGlzUGFyZW50aGVzaXNPcGVuID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChjID09PSAnOycpIHtcbiAgICAgIGlmIChpc1BhcmVudGhlc2lzT3Blbikge1xuICAgICAgICAvLyDlnKjlnIbmi6zlj7fph4zpnaLvvIzlv73nlaVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFkZE5ld0F0dHIoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXG4nKSB7XG4gICAgICBhZGROZXdBdHRyKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIF8udHJpbShyZXRDU1MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlU3R5bGU7XG4iLCIvKipcbiAqIGNzc2ZpbHRlclxuICpcbiAqIEBhdXRob3Ig6ICB6Zu3PGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBERUZBVUxUID0gcmVxdWlyZSgnLi9kZWZhdWx0Jyk7XG52YXIgcGFyc2VTdHlsZSA9IHJlcXVpcmUoJy4vcGFyc2VyJyk7XG52YXIgXyA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG5cbi8qKlxuICog6L+U5Zue5YC85piv5ZCm5Li656m6XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9ialxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOdWxsIChvYmopIHtcbiAgcmV0dXJuIChvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwpO1xufVxuXG4vKipcbiAqIOa1heaLt+i0neWvueixoVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gc2hhbGxvd0NvcHlPYmplY3QgKG9iaikge1xuICB2YXIgcmV0ID0ge307XG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgcmV0W2ldID0gb2JqW2ldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICog5Yib5bu6Q1NT6L+H5ruk5ZmoXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqICAgLSB7T2JqZWN0fSB3aGl0ZUxpc3RcbiAqICAgLSB7RnVuY3Rpb259IG9uQXR0clxuICogICAtIHtGdW5jdGlvbn0gb25JZ25vcmVBdHRyXG4gKiAgIC0ge0Z1bmN0aW9ufSBzYWZlQXR0clZhbHVlXG4gKi9cbmZ1bmN0aW9uIEZpbHRlckNTUyAob3B0aW9ucykge1xuICBvcHRpb25zID0gc2hhbGxvd0NvcHlPYmplY3Qob3B0aW9ucyB8fCB7fSk7XG4gIG9wdGlvbnMud2hpdGVMaXN0ID0gb3B0aW9ucy53aGl0ZUxpc3QgfHwgREVGQVVMVC53aGl0ZUxpc3Q7XG4gIG9wdGlvbnMub25BdHRyID0gb3B0aW9ucy5vbkF0dHIgfHwgREVGQVVMVC5vbkF0dHI7XG4gIG9wdGlvbnMub25JZ25vcmVBdHRyID0gb3B0aW9ucy5vbklnbm9yZUF0dHIgfHwgREVGQVVMVC5vbklnbm9yZUF0dHI7XG4gIG9wdGlvbnMuc2FmZUF0dHJWYWx1ZSA9IG9wdGlvbnMuc2FmZUF0dHJWYWx1ZSB8fCBERUZBVUxULnNhZmVBdHRyVmFsdWU7XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG59XG5cbkZpbHRlckNTUy5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uIChjc3MpIHtcbiAgLy8g5YW85a655ZCE56eN5aWH6JGp6L6T5YWlXG4gIGNzcyA9IGNzcyB8fCAnJztcbiAgY3NzID0gY3NzLnRvU3RyaW5nKCk7XG4gIGlmICghY3NzKSByZXR1cm4gJyc7XG5cbiAgdmFyIG1lID0gdGhpcztcbiAgdmFyIG9wdGlvbnMgPSBtZS5vcHRpb25zO1xuICB2YXIgd2hpdGVMaXN0ID0gb3B0aW9ucy53aGl0ZUxpc3Q7XG4gIHZhciBvbkF0dHIgPSBvcHRpb25zLm9uQXR0cjtcbiAgdmFyIG9uSWdub3JlQXR0ciA9IG9wdGlvbnMub25JZ25vcmVBdHRyO1xuICB2YXIgc2FmZUF0dHJWYWx1ZSA9IG9wdGlvbnMuc2FmZUF0dHJWYWx1ZTtcblxuICB2YXIgcmV0Q1NTID0gcGFyc2VTdHlsZShjc3MsIGZ1bmN0aW9uIChzb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24sIG5hbWUsIHZhbHVlLCBzb3VyY2UpIHtcblxuICAgIHZhciBjaGVjayA9IHdoaXRlTGlzdFtuYW1lXTtcbiAgICB2YXIgaXNXaGl0ZSA9IGZhbHNlO1xuICAgIGlmIChjaGVjayA9PT0gdHJ1ZSkgaXNXaGl0ZSA9IGNoZWNrO1xuICAgIGVsc2UgaWYgKHR5cGVvZiBjaGVjayA9PT0gJ2Z1bmN0aW9uJykgaXNXaGl0ZSA9IGNoZWNrKHZhbHVlKTtcbiAgICBlbHNlIGlmIChjaGVjayBpbnN0YW5jZW9mIFJlZ0V4cCkgaXNXaGl0ZSA9IGNoZWNrLnRlc3QodmFsdWUpO1xuICAgIGlmIChpc1doaXRlICE9PSB0cnVlKSBpc1doaXRlID0gZmFsc2U7XG5cbiAgICAvLyDlpoLmnpzov4fmu6TlkI4gdmFsdWUg5Li656m65YiZ55u05o6l5b+955WlXG4gICAgdmFsdWUgPSBzYWZlQXR0clZhbHVlKG5hbWUsIHZhbHVlKTtcbiAgICBpZiAoIXZhbHVlKSByZXR1cm47XG5cbiAgICB2YXIgb3B0cyA9IHtcbiAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgIHNvdXJjZVBvc2l0aW9uOiBzb3VyY2VQb3NpdGlvbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgaXNXaGl0ZTogaXNXaGl0ZVxuICAgIH07XG5cbiAgICBpZiAoaXNXaGl0ZSkge1xuXG4gICAgICB2YXIgcmV0ID0gb25BdHRyKG5hbWUsIHZhbHVlLCBvcHRzKTtcbiAgICAgIGlmIChpc051bGwocmV0KSkge1xuICAgICAgICByZXR1cm4gbmFtZSArICc6JyArIHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIHZhciByZXQgPSBvbklnbm9yZUF0dHIobmFtZSwgdmFsdWUsIG9wdHMpO1xuICAgICAgaWYgKCFpc051bGwocmV0KSkge1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuXG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmV0Q1NTO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlckNTUztcbiIsIi8qKlxuICogY3NzZmlsdGVyXG4gKlxuICogQGF1dGhvciDogIHpm7c8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxudmFyIERFRkFVTFQgPSByZXF1aXJlKCcuL2RlZmF1bHQnKTtcbnZhciBGaWx0ZXJDU1MgPSByZXF1aXJlKCcuL2NzcycpO1xuXG5cbi8qKlxuICogWFNT6L+H5rukXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGNzcyDopoHov4fmu6TnmoRDU1Pku6PnoIFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIOmAiemhue+8mndoaXRlTGlzdCwgb25BdHRyLCBvbklnbm9yZUF0dHJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmlsdGVyQ1NTIChodG1sLCBvcHRpb25zKSB7XG4gIHZhciB4c3MgPSBuZXcgRmlsdGVyQ1NTKG9wdGlvbnMpO1xuICByZXR1cm4geHNzLnByb2Nlc3MoaHRtbCk7XG59XG5cblxuLy8g6L6T5Ye6XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmaWx0ZXJDU1M7XG5leHBvcnRzLkZpbHRlckNTUyA9IEZpbHRlckNTUztcbmZvciAodmFyIGkgaW4gREVGQVVMVCkgZXhwb3J0c1tpXSA9IERFRkFVTFRbaV07XG5cbi8vIOWcqOa1j+iniOWZqOerr+S9v+eUqFxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5maWx0ZXJDU1MgPSBtb2R1bGUuZXhwb3J0cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICBpbmRleE9mOiBmdW5jdGlvbihhcnIsIGl0ZW0pIHtcbiAgICB2YXIgaSwgajtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgIHJldHVybiBhcnIuaW5kZXhPZihpdGVtKTtcbiAgICB9XG4gICAgZm9yIChpID0gMCwgaiA9IGFyci5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24oYXJyLCBmbiwgc2NvcGUpIHtcbiAgICB2YXIgaSwgajtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmZvckVhY2gpIHtcbiAgICAgIHJldHVybiBhcnIuZm9yRWFjaChmbiwgc2NvcGUpO1xuICAgIH1cbiAgICBmb3IgKGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgZm4uY2FsbChzY29wZSwgYXJyW2ldLCBpLCBhcnIpO1xuICAgIH1cbiAgfSxcbiAgdHJpbTogZnVuY3Rpb24oc3RyKSB7XG4gICAgaWYgKFN0cmluZy5wcm90b3R5cGUudHJpbSkge1xuICAgICAgcmV0dXJuIHN0ci50cmltKCk7XG4gICAgfVxuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKF5cXHMqKXwoXFxzKiQpL2csIFwiXCIpO1xuICB9LFxuICBzcGFjZUluZGV4OiBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVnID0gL1xcc3xcXG58XFx0LztcbiAgICB2YXIgbWF0Y2ggPSByZWcuZXhlYyhzdHIpO1xuICAgIHJldHVybiBtYXRjaCA/IG1hdGNoLmluZGV4IDogLTE7XG4gIH1cbn07XG4iLCIvKipcbiAqIGRlZmF1bHQgc2V0dGluZ3NcbiAqXG4gKiBAYXV0aG9yIFpvbmdtaW4gTGVpPGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBGaWx0ZXJDU1MgPSByZXF1aXJlKFwiY3NzZmlsdGVyXCIpLkZpbHRlckNTUztcbnZhciBnZXREZWZhdWx0Q1NTV2hpdGVMaXN0ID0gcmVxdWlyZShcImNzc2ZpbHRlclwiKS5nZXREZWZhdWx0V2hpdGVMaXN0O1xudmFyIF8gPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0V2hpdGVMaXN0KCkge1xuICByZXR1cm4ge1xuICAgIGE6IFtcInRhcmdldFwiLCBcImhyZWZcIiwgXCJ0aXRsZVwiXSxcbiAgICBhYmJyOiBbXCJ0aXRsZVwiXSxcbiAgICBhZGRyZXNzOiBbXSxcbiAgICBhcmVhOiBbXCJzaGFwZVwiLCBcImNvb3Jkc1wiLCBcImhyZWZcIiwgXCJhbHRcIl0sXG4gICAgYXJ0aWNsZTogW10sXG4gICAgYXNpZGU6IFtdLFxuICAgIGF1ZGlvOiBbXCJhdXRvcGxheVwiLCBcImNvbnRyb2xzXCIsIFwibG9vcFwiLCBcInByZWxvYWRcIiwgXCJzcmNcIl0sXG4gICAgYjogW10sXG4gICAgYmRpOiBbXCJkaXJcIl0sXG4gICAgYmRvOiBbXCJkaXJcIl0sXG4gICAgYmlnOiBbXSxcbiAgICBibG9ja3F1b3RlOiBbXCJjaXRlXCJdLFxuICAgIGJyOiBbXSxcbiAgICBjYXB0aW9uOiBbXSxcbiAgICBjZW50ZXI6IFtdLFxuICAgIGNpdGU6IFtdLFxuICAgIGNvZGU6IFtdLFxuICAgIGNvbDogW1wiYWxpZ25cIiwgXCJ2YWxpZ25cIiwgXCJzcGFuXCIsIFwid2lkdGhcIl0sXG4gICAgY29sZ3JvdXA6IFtcImFsaWduXCIsIFwidmFsaWduXCIsIFwic3BhblwiLCBcIndpZHRoXCJdLFxuICAgIGRkOiBbXSxcbiAgICBkZWw6IFtcImRhdGV0aW1lXCJdLFxuICAgIGRldGFpbHM6IFtcIm9wZW5cIl0sXG4gICAgZGl2OiBbXSxcbiAgICBkbDogW10sXG4gICAgZHQ6IFtdLFxuICAgIGVtOiBbXSxcbiAgICBmb250OiBbXCJjb2xvclwiLCBcInNpemVcIiwgXCJmYWNlXCJdLFxuICAgIGZvb3RlcjogW10sXG4gICAgaDE6IFtdLFxuICAgIGgyOiBbXSxcbiAgICBoMzogW10sXG4gICAgaDQ6IFtdLFxuICAgIGg1OiBbXSxcbiAgICBoNjogW10sXG4gICAgaGVhZGVyOiBbXSxcbiAgICBocjogW10sXG4gICAgaTogW10sXG4gICAgaW1nOiBbXCJzcmNcIiwgXCJhbHRcIiwgXCJ0aXRsZVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCJdLFxuICAgIGluczogW1wiZGF0ZXRpbWVcIl0sXG4gICAgbGk6IFtdLFxuICAgIG1hcms6IFtdLFxuICAgIG5hdjogW10sXG4gICAgb2w6IFtdLFxuICAgIHA6IFtdLFxuICAgIHByZTogW10sXG4gICAgczogW10sXG4gICAgc2VjdGlvbjogW10sXG4gICAgc21hbGw6IFtdLFxuICAgIHNwYW46IFtdLFxuICAgIHN1YjogW10sXG4gICAgc3VwOiBbXSxcbiAgICBzdHJvbmc6IFtdLFxuICAgIHRhYmxlOiBbXCJ3aWR0aFwiLCBcImJvcmRlclwiLCBcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRib2R5OiBbXCJhbGlnblwiLCBcInZhbGlnblwiXSxcbiAgICB0ZDogW1wid2lkdGhcIiwgXCJyb3dzcGFuXCIsIFwiY29sc3BhblwiLCBcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRmb290OiBbXCJhbGlnblwiLCBcInZhbGlnblwiXSxcbiAgICB0aDogW1wid2lkdGhcIiwgXCJyb3dzcGFuXCIsIFwiY29sc3BhblwiLCBcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHRoZWFkOiBbXCJhbGlnblwiLCBcInZhbGlnblwiXSxcbiAgICB0cjogW1wicm93c3BhblwiLCBcImFsaWduXCIsIFwidmFsaWduXCJdLFxuICAgIHR0OiBbXSxcbiAgICB1OiBbXSxcbiAgICB1bDogW10sXG4gICAgdmlkZW86IFtcImF1dG9wbGF5XCIsIFwiY29udHJvbHNcIiwgXCJsb29wXCIsIFwicHJlbG9hZFwiLCBcInNyY1wiLCBcImhlaWdodFwiLCBcIndpZHRoXCJdXG4gIH07XG59XG5cbnZhciBkZWZhdWx0Q1NTRmlsdGVyID0gbmV3IEZpbHRlckNTUygpO1xuXG4vKipcbiAqIGRlZmF1bHQgb25UYWcgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gb25UYWcodGFnLCBodG1sLCBvcHRpb25zKSB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cblxuLyoqXG4gKiBkZWZhdWx0IG9uSWdub3JlVGFnIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uSWdub3JlVGFnKHRhZywgaHRtbCwgb3B0aW9ucykge1xuICAvLyBkbyBub3RoaW5nXG59XG5cbi8qKlxuICogZGVmYXVsdCBvblRhZ0F0dHIgZnVuY3Rpb25cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IHZhbHVlXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIG9uVGFnQXR0cih0YWcsIG5hbWUsIHZhbHVlKSB7XG4gIC8vIGRvIG5vdGhpbmdcbn1cblxuLyoqXG4gKiBkZWZhdWx0IG9uSWdub3JlVGFnQXR0ciBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gb25JZ25vcmVUYWdBdHRyKHRhZywgbmFtZSwgdmFsdWUpIHtcbiAgLy8gZG8gbm90aGluZ1xufVxuXG4vKipcbiAqIGRlZmF1bHQgZXNjYXBlSHRtbCBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWwoaHRtbCkge1xuICByZXR1cm4gaHRtbC5yZXBsYWNlKFJFR0VYUF9MVCwgXCImbHQ7XCIpLnJlcGxhY2UoUkVHRVhQX0dULCBcIiZndDtcIik7XG59XG5cbi8qKlxuICogZGVmYXVsdCBzYWZlQXR0clZhbHVlIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHBhcmFtIHtPYmplY3R9IGNzc0ZpbHRlclxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBzYWZlQXR0clZhbHVlKHRhZywgbmFtZSwgdmFsdWUsIGNzc0ZpbHRlcikge1xuICAvLyB1bmVzY2FwZSBhdHRyaWJ1dGUgdmFsdWUgZmlyc3RseVxuICB2YWx1ZSA9IGZyaWVuZGx5QXR0clZhbHVlKHZhbHVlKTtcblxuICBpZiAobmFtZSA9PT0gXCJocmVmXCIgfHwgbmFtZSA9PT0gXCJzcmNcIikge1xuICAgIC8vIGZpbHRlciBgaHJlZmAgYW5kIGBzcmNgIGF0dHJpYnV0ZVxuICAgIC8vIG9ubHkgYWxsb3cgdGhlIHZhbHVlIHRoYXQgc3RhcnRzIHdpdGggYGh0dHA6Ly9gIHwgYGh0dHBzOi8vYCB8IGBtYWlsdG86YCB8IGAvYCB8IGAjYFxuICAgIHZhbHVlID0gXy50cmltKHZhbHVlKTtcbiAgICBpZiAodmFsdWUgPT09IFwiI1wiKSByZXR1cm4gXCIjXCI7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDcpID09PSBcImh0dHA6Ly9cIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgOCkgPT09IFwiaHR0cHM6Ly9cIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgNykgPT09IFwibWFpbHRvOlwiIHx8XG4gICAgICAgIHZhbHVlLnN1YnN0cigwLCA0KSA9PT0gXCJ0ZWw6XCIgfHxcbiAgICAgICAgdmFsdWUuc3Vic3RyKDAsIDExKSA9PT0gXCJkYXRhOmltYWdlL1wiIHx8XG4gICAgICAgIHZhbHVlLnN1YnN0cigwLCA2KSA9PT0gXCJmdHA6Ly9cIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgMikgPT09IFwiLi9cIiB8fFxuICAgICAgICB2YWx1ZS5zdWJzdHIoMCwgMykgPT09IFwiLi4vXCIgfHxcbiAgICAgICAgdmFsdWVbMF0gPT09IFwiI1wiIHx8XG4gICAgICAgIHZhbHVlWzBdID09PSBcIi9cIlxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5hbWUgPT09IFwiYmFja2dyb3VuZFwiKSB7XG4gICAgLy8gZmlsdGVyIGBiYWNrZ3JvdW5kYCBhdHRyaWJ1dGUgKG1heWJlIG5vIHVzZSlcbiAgICAvLyBgamF2YXNjcmlwdDpgXG4gICAgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNC5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl80LnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgLy8gYGV4cHJlc3Npb24oKWBcbiAgICBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl83Lmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzcudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICAvLyBgdXJsKClgXG4gICAgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfOC5sYXN0SW5kZXggPSAwO1xuICAgIGlmIChSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl84LnRlc3QodmFsdWUpKSB7XG4gICAgICBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl80Lmxhc3RJbmRleCA9IDA7XG4gICAgICBpZiAoUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNC50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNzc0ZpbHRlciAhPT0gZmFsc2UpIHtcbiAgICAgIGNzc0ZpbHRlciA9IGNzc0ZpbHRlciB8fCBkZWZhdWx0Q1NTRmlsdGVyO1xuICAgICAgdmFsdWUgPSBjc3NGaWx0ZXIucHJvY2Vzcyh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNjYXBlIGA8PlwiYCBiZWZvcmUgcmV0dXJuc1xuICB2YWx1ZSA9IGVzY2FwZUF0dHJWYWx1ZSh2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gUmVnRXhwIGxpc3RcbnZhciBSRUdFWFBfTFQgPSAvPC9nO1xudmFyIFJFR0VYUF9HVCA9IC8+L2c7XG52YXIgUkVHRVhQX1FVT1RFID0gL1wiL2c7XG52YXIgUkVHRVhQX1FVT1RFXzIgPSAvJnF1b3Q7L2c7XG52YXIgUkVHRVhQX0FUVFJfVkFMVUVfMSA9IC8mIyhbYS16QS1aMC05XSopOz8vZ2ltO1xudmFyIFJFR0VYUF9BVFRSX1ZBTFVFX0NPTE9OID0gLyZjb2xvbjs/L2dpbTtcbnZhciBSRUdFWFBfQVRUUl9WQUxVRV9ORVdMSU5FID0gLyZuZXdsaW5lOz8vZ2ltO1xudmFyIFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzMgPSAvXFwvXFwqfFxcKlxcLy9nbTtcbnZhciBSRUdFWFBfREVGQVVMVF9PTl9UQUdfQVRUUl80ID0gLygoalxccyphXFxzKnZcXHMqYXx2XFxzKmJ8bFxccyppXFxzKnZcXHMqZSlcXHMqc1xccypjXFxzKnJcXHMqaVxccypwXFxzKnRcXHMqfG1cXHMqb1xccypjXFxzKmhcXHMqYSlcXDovZ2k7XG52YXIgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNSA9IC9eW1xcc1wiJ2BdKihkXFxzKmFcXHMqdFxccyphXFxzKilcXDovZ2k7XG52YXIgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNiA9IC9eW1xcc1wiJ2BdKihkXFxzKmFcXHMqdFxccyphXFxzKilcXDpcXHMqaW1hZ2VcXC8vZ2k7XG52YXIgUkVHRVhQX0RFRkFVTFRfT05fVEFHX0FUVFJfNyA9IC9lXFxzKnhcXHMqcFxccypyXFxzKmVcXHMqc1xccypzXFxzKmlcXHMqb1xccypuXFxzKlxcKC4qL2dpO1xudmFyIFJFR0VYUF9ERUZBVUxUX09OX1RBR19BVFRSXzggPSAvdVxccypyXFxzKmxcXHMqXFwoLiovZ2k7XG5cbi8qKlxuICogZXNjYXBlIGRvdWJlIHF1b3RlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfSBzdHJcbiAqL1xuZnVuY3Rpb24gZXNjYXBlUXVvdGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfUVVPVEUsIFwiJnF1b3Q7XCIpO1xufVxuXG4vKipcbiAqIHVuZXNjYXBlIGRvdWJsZSBxdW90ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHVuZXNjYXBlUXVvdGUoc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZShSRUdFWFBfUVVPVEVfMiwgJ1wiJyk7XG59XG5cbi8qKlxuICogZXNjYXBlIGh0bWwgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUh0bWxFbnRpdGllcyhzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKFJFR0VYUF9BVFRSX1ZBTFVFXzEsIGZ1bmN0aW9uIHJlcGxhY2VVbmljb2RlKHN0ciwgY29kZSkge1xuICAgIHJldHVybiBjb2RlWzBdID09PSBcInhcIiB8fCBjb2RlWzBdID09PSBcIlhcIlxuICAgICAgPyBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGNvZGUuc3Vic3RyKDEpLCAxNikpXG4gICAgICA6IFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQoY29kZSwgMTApKTtcbiAgfSk7XG59XG5cbi8qKlxuICogZXNjYXBlIGh0bWw1IG5ldyBkYW5nZXIgZW50aXRpZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZURhbmdlckh0bWw1RW50aXRpZXMoc3RyKSB7XG4gIHJldHVybiBzdHJcbiAgICAucmVwbGFjZShSRUdFWFBfQVRUUl9WQUxVRV9DT0xPTiwgXCI6XCIpXG4gICAgLnJlcGxhY2UoUkVHRVhQX0FUVFJfVkFMVUVfTkVXTElORSwgXCIgXCIpO1xufVxuXG4vKipcbiAqIGNsZWFyIG5vbnByaW50YWJsZSBjaGFyYWN0ZXJzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBjbGVhck5vblByaW50YWJsZUNoYXJhY3RlcihzdHIpIHtcbiAgdmFyIHN0cjIgPSBcIlwiO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc3RyMiArPSBzdHIuY2hhckNvZGVBdChpKSA8IDMyID8gXCIgXCIgOiBzdHIuY2hhckF0KGkpO1xuICB9XG4gIHJldHVybiBfLnRyaW0oc3RyMik7XG59XG5cbi8qKlxuICogZ2V0IGZyaWVuZGx5IGF0dHJpYnV0ZSB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZnJpZW5kbHlBdHRyVmFsdWUoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlUXVvdGUoc3RyKTtcbiAgc3RyID0gZXNjYXBlSHRtbEVudGl0aWVzKHN0cik7XG4gIHN0ciA9IGVzY2FwZURhbmdlckh0bWw1RW50aXRpZXMoc3RyKTtcbiAgc3RyID0gY2xlYXJOb25QcmludGFibGVDaGFyYWN0ZXIoc3RyKTtcbiAgcmV0dXJuIHN0cjtcbn1cblxuLyoqXG4gKiB1bmVzY2FwZSBhdHRyaWJ1dGUgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVzY2FwZUF0dHJWYWx1ZShzdHIpIHtcbiAgc3RyID0gZXNjYXBlUXVvdGUoc3RyKTtcbiAgc3RyID0gZXNjYXBlSHRtbChzdHIpO1xuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIGBvbklnbm9yZVRhZ2AgZnVuY3Rpb24gZm9yIHJlbW92aW5nIGFsbCB0aGUgdGFncyB0aGF0IGFyZSBub3QgaW4gd2hpdGVsaXN0XG4gKi9cbmZ1bmN0aW9uIG9uSWdub3JlVGFnU3RyaXBBbGwoKSB7XG4gIHJldHVybiBcIlwiO1xufVxuXG4vKipcbiAqIHJlbW92ZSB0YWcgYm9keVxuICogc3BlY2lmeSBhIGB0YWdzYCBsaXN0LCBpZiB0aGUgdGFnIGlzIG5vdCBpbiB0aGUgYHRhZ3NgIGxpc3QgdGhlbiBwcm9jZXNzIGJ5IHRoZSBzcGVjaWZ5IGZ1bmN0aW9uIChvcHRpb25hbClcbiAqXG4gKiBAcGFyYW0ge2FycmF5fSB0YWdzXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBuZXh0XG4gKi9cbmZ1bmN0aW9uIFN0cmlwVGFnQm9keSh0YWdzLCBuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbmV4dCA9IGZ1bmN0aW9uKCkge307XG4gIH1cblxuICB2YXIgaXNSZW1vdmVBbGxUYWcgPSAhQXJyYXkuaXNBcnJheSh0YWdzKTtcbiAgZnVuY3Rpb24gaXNSZW1vdmVUYWcodGFnKSB7XG4gICAgaWYgKGlzUmVtb3ZlQWxsVGFnKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gXy5pbmRleE9mKHRhZ3MsIHRhZykgIT09IC0xO1xuICB9XG5cbiAgdmFyIHJlbW92ZUxpc3QgPSBbXTtcbiAgdmFyIHBvc1N0YXJ0ID0gZmFsc2U7XG5cbiAgcmV0dXJuIHtcbiAgICBvbklnbm9yZVRhZzogZnVuY3Rpb24odGFnLCBodG1sLCBvcHRpb25zKSB7XG4gICAgICBpZiAoaXNSZW1vdmVUYWcodGFnKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5pc0Nsb3NpbmcpIHtcbiAgICAgICAgICB2YXIgcmV0ID0gXCJbL3JlbW92ZWRdXCI7XG4gICAgICAgICAgdmFyIGVuZCA9IG9wdGlvbnMucG9zaXRpb24gKyByZXQubGVuZ3RoO1xuICAgICAgICAgIHJlbW92ZUxpc3QucHVzaChbXG4gICAgICAgICAgICBwb3NTdGFydCAhPT0gZmFsc2UgPyBwb3NTdGFydCA6IG9wdGlvbnMucG9zaXRpb24sXG4gICAgICAgICAgICBlbmRcbiAgICAgICAgICBdKTtcbiAgICAgICAgICBwb3NTdGFydCA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFwb3NTdGFydCkge1xuICAgICAgICAgICAgcG9zU3RhcnQgPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gXCJbcmVtb3ZlZF1cIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5leHQodGFnLCBodG1sLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24oaHRtbCkge1xuICAgICAgdmFyIHJldGh0bWwgPSBcIlwiO1xuICAgICAgdmFyIGxhc3RQb3MgPSAwO1xuICAgICAgXy5mb3JFYWNoKHJlbW92ZUxpc3QsIGZ1bmN0aW9uKHBvcykge1xuICAgICAgICByZXRodG1sICs9IGh0bWwuc2xpY2UobGFzdFBvcywgcG9zWzBdKTtcbiAgICAgICAgbGFzdFBvcyA9IHBvc1sxXTtcbiAgICAgIH0pO1xuICAgICAgcmV0aHRtbCArPSBodG1sLnNsaWNlKGxhc3RQb3MpO1xuICAgICAgcmV0dXJuIHJldGh0bWw7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIHJlbW92ZSBodG1sIGNvbW1lbnRzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gc3RyaXBDb21tZW50VGFnKGh0bWwpIHtcbiAgcmV0dXJuIGh0bWwucmVwbGFjZShTVFJJUF9DT01NRU5UX1RBR19SRUdFWFAsIFwiXCIpO1xufVxudmFyIFNUUklQX0NPTU1FTlRfVEFHX1JFR0VYUCA9IC88IS0tW1xcc1xcU10qPy0tPi9nO1xuXG4vKipcbiAqIHJlbW92ZSBpbnZpc2libGUgY2hhcmFjdGVyc1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHN0cmlwQmxhbmtDaGFyKGh0bWwpIHtcbiAgdmFyIGNoYXJzID0gaHRtbC5zcGxpdChcIlwiKTtcbiAgY2hhcnMgPSBjaGFycy5maWx0ZXIoZnVuY3Rpb24oY2hhcikge1xuICAgIHZhciBjID0gY2hhci5jaGFyQ29kZUF0KDApO1xuICAgIGlmIChjID09PSAxMjcpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoYyA8PSAzMSkge1xuICAgICAgaWYgKGMgPT09IDEwIHx8IGMgPT09IDEzKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gY2hhcnMuam9pbihcIlwiKTtcbn1cblxuZXhwb3J0cy53aGl0ZUxpc3QgPSBnZXREZWZhdWx0V2hpdGVMaXN0KCk7XG5leHBvcnRzLmdldERlZmF1bHRXaGl0ZUxpc3QgPSBnZXREZWZhdWx0V2hpdGVMaXN0O1xuZXhwb3J0cy5vblRhZyA9IG9uVGFnO1xuZXhwb3J0cy5vbklnbm9yZVRhZyA9IG9uSWdub3JlVGFnO1xuZXhwb3J0cy5vblRhZ0F0dHIgPSBvblRhZ0F0dHI7XG5leHBvcnRzLm9uSWdub3JlVGFnQXR0ciA9IG9uSWdub3JlVGFnQXR0cjtcbmV4cG9ydHMuc2FmZUF0dHJWYWx1ZSA9IHNhZmVBdHRyVmFsdWU7XG5leHBvcnRzLmVzY2FwZUh0bWwgPSBlc2NhcGVIdG1sO1xuZXhwb3J0cy5lc2NhcGVRdW90ZSA9IGVzY2FwZVF1b3RlO1xuZXhwb3J0cy51bmVzY2FwZVF1b3RlID0gdW5lc2NhcGVRdW90ZTtcbmV4cG9ydHMuZXNjYXBlSHRtbEVudGl0aWVzID0gZXNjYXBlSHRtbEVudGl0aWVzO1xuZXhwb3J0cy5lc2NhcGVEYW5nZXJIdG1sNUVudGl0aWVzID0gZXNjYXBlRGFuZ2VySHRtbDVFbnRpdGllcztcbmV4cG9ydHMuY2xlYXJOb25QcmludGFibGVDaGFyYWN0ZXIgPSBjbGVhck5vblByaW50YWJsZUNoYXJhY3RlcjtcbmV4cG9ydHMuZnJpZW5kbHlBdHRyVmFsdWUgPSBmcmllbmRseUF0dHJWYWx1ZTtcbmV4cG9ydHMuZXNjYXBlQXR0clZhbHVlID0gZXNjYXBlQXR0clZhbHVlO1xuZXhwb3J0cy5vbklnbm9yZVRhZ1N0cmlwQWxsID0gb25JZ25vcmVUYWdTdHJpcEFsbDtcbmV4cG9ydHMuU3RyaXBUYWdCb2R5ID0gU3RyaXBUYWdCb2R5O1xuZXhwb3J0cy5zdHJpcENvbW1lbnRUYWcgPSBzdHJpcENvbW1lbnRUYWc7XG5leHBvcnRzLnN0cmlwQmxhbmtDaGFyID0gc3RyaXBCbGFua0NoYXI7XG5leHBvcnRzLmNzc0ZpbHRlciA9IGRlZmF1bHRDU1NGaWx0ZXI7XG5leHBvcnRzLmdldERlZmF1bHRDU1NXaGl0ZUxpc3QgPSBnZXREZWZhdWx0Q1NTV2hpdGVMaXN0O1xuIiwiLyoqXG4gKiBTaW1wbGUgSFRNTCBQYXJzZXJcbiAqXG4gKiBAYXV0aG9yIFpvbmdtaW4gTGVpPGxlaXpvbmdtaW5AZ21haWwuY29tPlxuICovXG5cbnZhciBfID0gcmVxdWlyZShcIi4vdXRpbFwiKTtcblxuLyoqXG4gKiBnZXQgdGFnIG5hbWVcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gaHRtbCBlLmcuICc8YSBoZWY9XCIjXCI+J1xuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRUYWdOYW1lKGh0bWwpIHtcbiAgdmFyIGkgPSBfLnNwYWNlSW5kZXgoaHRtbCk7XG4gIGlmIChpID09PSAtMSkge1xuICAgIHZhciB0YWdOYW1lID0gaHRtbC5zbGljZSgxLCAtMSk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIHRhZ05hbWUgPSBodG1sLnNsaWNlKDEsIGkgKyAxKTtcbiAgfVxuICB0YWdOYW1lID0gXy50cmltKHRhZ05hbWUpLnRvTG93ZXJDYXNlKCk7XG4gIGlmICh0YWdOYW1lLnNsaWNlKDAsIDEpID09PSBcIi9cIikgdGFnTmFtZSA9IHRhZ05hbWUuc2xpY2UoMSk7XG4gIGlmICh0YWdOYW1lLnNsaWNlKC0xKSA9PT0gXCIvXCIpIHRhZ05hbWUgPSB0YWdOYW1lLnNsaWNlKDAsIC0xKTtcbiAgcmV0dXJuIHRhZ05hbWU7XG59XG5cbi8qKlxuICogaXMgY2xvc2UgdGFnP1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sIOWmgu+8mic8YSBoZWY9XCIjXCI+J1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDbG9zaW5nKGh0bWwpIHtcbiAgcmV0dXJuIGh0bWwuc2xpY2UoMCwgMikgPT09IFwiPC9cIjtcbn1cblxuLyoqXG4gKiBwYXJzZSBpbnB1dCBodG1sIGFuZCByZXR1cm5zIHByb2Nlc3NlZCBodG1sXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVGFnIGUuZy4gZnVuY3Rpb24gKHNvdXJjZVBvc2l0aW9uLCBwb3NpdGlvbiwgdGFnLCBodG1sLCBpc0Nsb3NpbmcpXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlc2NhcGVIdG1sXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlVGFnKGh0bWwsIG9uVGFnLCBlc2NhcGVIdG1sKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciByZXRodG1sID0gXCJcIjtcbiAgdmFyIGxhc3RQb3MgPSAwO1xuICB2YXIgdGFnU3RhcnQgPSBmYWxzZTtcbiAgdmFyIHF1b3RlU3RhcnQgPSBmYWxzZTtcbiAgdmFyIGN1cnJlbnRQb3MgPSAwO1xuICB2YXIgbGVuID0gaHRtbC5sZW5ndGg7XG4gIHZhciBjdXJyZW50VGFnTmFtZSA9IFwiXCI7XG4gIHZhciBjdXJyZW50SHRtbCA9IFwiXCI7XG5cbiAgY2hhcml0ZXJhdG9yOiBmb3IgKGN1cnJlbnRQb3MgPSAwOyBjdXJyZW50UG9zIDwgbGVuOyBjdXJyZW50UG9zKyspIHtcbiAgICB2YXIgYyA9IGh0bWwuY2hhckF0KGN1cnJlbnRQb3MpO1xuICAgIGlmICh0YWdTdGFydCA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChjID09PSBcIjxcIikge1xuICAgICAgICB0YWdTdGFydCA9IGN1cnJlbnRQb3M7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocXVvdGVTdGFydCA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGMgPT09IFwiPFwiKSB7XG4gICAgICAgICAgcmV0aHRtbCArPSBlc2NhcGVIdG1sKGh0bWwuc2xpY2UobGFzdFBvcywgY3VycmVudFBvcykpO1xuICAgICAgICAgIHRhZ1N0YXJ0ID0gY3VycmVudFBvcztcbiAgICAgICAgICBsYXN0UG9zID0gY3VycmVudFBvcztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYyA9PT0gXCI+XCIpIHtcbiAgICAgICAgICByZXRodG1sICs9IGVzY2FwZUh0bWwoaHRtbC5zbGljZShsYXN0UG9zLCB0YWdTdGFydCkpO1xuICAgICAgICAgIGN1cnJlbnRIdG1sID0gaHRtbC5zbGljZSh0YWdTdGFydCwgY3VycmVudFBvcyArIDEpO1xuICAgICAgICAgIGN1cnJlbnRUYWdOYW1lID0gZ2V0VGFnTmFtZShjdXJyZW50SHRtbCk7XG4gICAgICAgICAgcmV0aHRtbCArPSBvblRhZyhcbiAgICAgICAgICAgIHRhZ1N0YXJ0LFxuICAgICAgICAgICAgcmV0aHRtbC5sZW5ndGgsXG4gICAgICAgICAgICBjdXJyZW50VGFnTmFtZSxcbiAgICAgICAgICAgIGN1cnJlbnRIdG1sLFxuICAgICAgICAgICAgaXNDbG9zaW5nKGN1cnJlbnRIdG1sKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbGFzdFBvcyA9IGN1cnJlbnRQb3MgKyAxO1xuICAgICAgICAgIHRhZ1N0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChjID09PSAnXCInIHx8IGMgPT09IFwiJ1wiKSkge1xuICAgICAgICAgIHZhciBpID0gMTtcbiAgICAgICAgICB2YXIgaWMgPSBodG1sLmNoYXJBdChjdXJyZW50UG9zIC0gaSk7XG5cbiAgICAgICAgICB3aGlsZSAoKGljID09PSBcIiBcIikgfHwgKGljID09PSBcIj1cIikpIHtcbiAgICAgICAgICAgIGlmIChpYyA9PT0gXCI9XCIpIHtcbiAgICAgICAgICAgICAgcXVvdGVTdGFydCA9IGM7XG4gICAgICAgICAgICAgIGNvbnRpbnVlIGNoYXJpdGVyYXRvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGljID0gaHRtbC5jaGFyQXQoY3VycmVudFBvcyAtICsraSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoYyA9PT0gcXVvdGVTdGFydCkge1xuICAgICAgICAgIHF1b3RlU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobGFzdFBvcyA8IGh0bWwubGVuZ3RoKSB7XG4gICAgcmV0aHRtbCArPSBlc2NhcGVIdG1sKGh0bWwuc3Vic3RyKGxhc3RQb3MpKTtcbiAgfVxuXG4gIHJldHVybiByZXRodG1sO1xufVxuXG52YXIgUkVHRVhQX0lMTEVHQUxfQVRUUl9OQU1FID0gL1teYS16QS1aMC05XzpcXC5cXC1dL2dpbTtcblxuLyoqXG4gKiBwYXJzZSBpbnB1dCBhdHRyaWJ1dGVzIGFuZCByZXR1cm5zIHByb2Nlc3NlZCBhdHRyaWJ1dGVzXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgZS5nLiBgaHJlZj1cIiNcIiB0YXJnZXQ9XCJfYmxhbmtcImBcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQXR0ciBlLmcuIGBmdW5jdGlvbiAobmFtZSwgdmFsdWUpYFxuICogQHJldHVybiB7U3RyaW5nfVxuICovXG5mdW5jdGlvbiBwYXJzZUF0dHIoaHRtbCwgb25BdHRyKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHZhciBsYXN0UG9zID0gMDtcbiAgdmFyIHJldEF0dHJzID0gW107XG4gIHZhciB0bXBOYW1lID0gZmFsc2U7XG4gIHZhciBsZW4gPSBodG1sLmxlbmd0aDtcblxuICBmdW5jdGlvbiBhZGRBdHRyKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IF8udHJpbShuYW1lKTtcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFJFR0VYUF9JTExFR0FMX0FUVFJfTkFNRSwgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobmFtZS5sZW5ndGggPCAxKSByZXR1cm47XG4gICAgdmFyIHJldCA9IG9uQXR0cihuYW1lLCB2YWx1ZSB8fCBcIlwiKTtcbiAgICBpZiAocmV0KSByZXRBdHRycy5wdXNoKHJldCk7XG4gIH1cblxuICAvLyDpgJDkuKrliIbmnpDlrZfnrKZcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHZhciBjID0gaHRtbC5jaGFyQXQoaSk7XG4gICAgdmFyIHYsIGo7XG4gICAgaWYgKHRtcE5hbWUgPT09IGZhbHNlICYmIGMgPT09IFwiPVwiKSB7XG4gICAgICB0bXBOYW1lID0gaHRtbC5zbGljZShsYXN0UG9zLCBpKTtcbiAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAodG1wTmFtZSAhPT0gZmFsc2UpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaSA9PT0gbGFzdFBvcyAmJlxuICAgICAgICAoYyA9PT0gJ1wiJyB8fCBjID09PSBcIidcIikgJiZcbiAgICAgICAgaHRtbC5jaGFyQXQoaSAtIDEpID09PSBcIj1cIlxuICAgICAgKSB7XG4gICAgICAgIGogPSBodG1sLmluZGV4T2YoYywgaSArIDEpO1xuICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2ID0gXy50cmltKGh0bWwuc2xpY2UobGFzdFBvcyArIDEsIGopKTtcbiAgICAgICAgICBhZGRBdHRyKHRtcE5hbWUsIHYpO1xuICAgICAgICAgIHRtcE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICBpID0gajtcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKC9cXHN8XFxufFxcdC8udGVzdChjKSkge1xuICAgICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvXFxzfFxcbnxcXHQvZywgXCIgXCIpO1xuICAgICAgaWYgKHRtcE5hbWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGogPSBmaW5kTmV4dEVxdWFsKGh0bWwsIGkpO1xuICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICB2ID0gXy50cmltKGh0bWwuc2xpY2UobGFzdFBvcywgaSkpO1xuICAgICAgICAgIGFkZEF0dHIodik7XG4gICAgICAgICAgdG1wTmFtZSA9IGZhbHNlO1xuICAgICAgICAgIGxhc3RQb3MgPSBpICsgMTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpID0gaiAtIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGogPSBmaW5kQmVmb3JlRXF1YWwoaHRtbCwgaSAtIDEpO1xuICAgICAgICBpZiAoaiA9PT0gLTEpIHtcbiAgICAgICAgICB2ID0gXy50cmltKGh0bWwuc2xpY2UobGFzdFBvcywgaSkpO1xuICAgICAgICAgIHYgPSBzdHJpcFF1b3RlV3JhcCh2KTtcbiAgICAgICAgICBhZGRBdHRyKHRtcE5hbWUsIHYpO1xuICAgICAgICAgIHRtcE5hbWUgPSBmYWxzZTtcbiAgICAgICAgICBsYXN0UG9zID0gaSArIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAobGFzdFBvcyA8IGh0bWwubGVuZ3RoKSB7XG4gICAgaWYgKHRtcE5hbWUgPT09IGZhbHNlKSB7XG4gICAgICBhZGRBdHRyKGh0bWwuc2xpY2UobGFzdFBvcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRBdHRyKHRtcE5hbWUsIHN0cmlwUXVvdGVXcmFwKF8udHJpbShodG1sLnNsaWNlKGxhc3RQb3MpKSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfLnRyaW0ocmV0QXR0cnMuam9pbihcIiBcIikpO1xufVxuXG5mdW5jdGlvbiBmaW5kTmV4dEVxdWFsKHN0ciwgaSkge1xuICBmb3IgKDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIHZhciBjID0gc3RyW2ldO1xuICAgIGlmIChjID09PSBcIiBcIikgY29udGludWU7XG4gICAgaWYgKGMgPT09IFwiPVwiKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluZEJlZm9yZUVxdWFsKHN0ciwgaSkge1xuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gc3RyW2ldO1xuICAgIGlmIChjID09PSBcIiBcIikgY29udGludWU7XG4gICAgaWYgKGMgPT09IFwiPVwiKSByZXR1cm4gaTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNRdW90ZVdyYXBTdHJpbmcodGV4dCkge1xuICBpZiAoXG4gICAgKHRleHRbMF0gPT09ICdcIicgJiYgdGV4dFt0ZXh0Lmxlbmd0aCAtIDFdID09PSAnXCInKSB8fFxuICAgICh0ZXh0WzBdID09PSBcIidcIiAmJiB0ZXh0W3RleHQubGVuZ3RoIC0gMV0gPT09IFwiJ1wiKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gc3RyaXBRdW90ZVdyYXAodGV4dCkge1xuICBpZiAoaXNRdW90ZVdyYXBTdHJpbmcodGV4dCkpIHtcbiAgICByZXR1cm4gdGV4dC5zdWJzdHIoMSwgdGV4dC5sZW5ndGggLSAyKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxufVxuXG5leHBvcnRzLnBhcnNlVGFnID0gcGFyc2VUYWc7XG5leHBvcnRzLnBhcnNlQXR0ciA9IHBhcnNlQXR0cjtcbiIsIi8qKlxuICogZmlsdGVyIHhzc1xuICpcbiAqIEBhdXRob3IgWm9uZ21pbiBMZWk8bGVpem9uZ21pbkBnbWFpbC5jb20+XG4gKi9cblxudmFyIEZpbHRlckNTUyA9IHJlcXVpcmUoXCJjc3NmaWx0ZXJcIikuRmlsdGVyQ1NTO1xudmFyIERFRkFVTFQgPSByZXF1aXJlKFwiLi9kZWZhdWx0XCIpO1xudmFyIHBhcnNlciA9IHJlcXVpcmUoXCIuL3BhcnNlclwiKTtcbnZhciBwYXJzZVRhZyA9IHBhcnNlci5wYXJzZVRhZztcbnZhciBwYXJzZUF0dHIgPSBwYXJzZXIucGFyc2VBdHRyO1xudmFyIF8gPSByZXF1aXJlKFwiLi91dGlsXCIpO1xuXG4vKipcbiAqIHJldHVybnMgYHRydWVgIGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyBgdW5kZWZpbmVkYCBvciBgbnVsbGBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc051bGwob2JqKSB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5cbi8qKlxuICogZ2V0IGF0dHJpYnV0ZXMgZm9yIGEgdGFnXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqICAgLSB7U3RyaW5nfSBodG1sXG4gKiAgIC0ge0Jvb2xlYW59IGNsb3NpbmdcbiAqL1xuZnVuY3Rpb24gZ2V0QXR0cnMoaHRtbCkge1xuICB2YXIgaSA9IF8uc3BhY2VJbmRleChodG1sKTtcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGh0bWw6IFwiXCIsXG4gICAgICBjbG9zaW5nOiBodG1sW2h0bWwubGVuZ3RoIC0gMl0gPT09IFwiL1wiXG4gICAgfTtcbiAgfVxuICBodG1sID0gXy50cmltKGh0bWwuc2xpY2UoaSArIDEsIC0xKSk7XG4gIHZhciBpc0Nsb3NpbmcgPSBodG1sW2h0bWwubGVuZ3RoIC0gMV0gPT09IFwiL1wiO1xuICBpZiAoaXNDbG9zaW5nKSBodG1sID0gXy50cmltKGh0bWwuc2xpY2UoMCwgLTEpKTtcbiAgcmV0dXJuIHtcbiAgICBodG1sOiBodG1sLFxuICAgIGNsb3Npbmc6IGlzQ2xvc2luZ1xuICB9O1xufVxuXG4vKipcbiAqIHNoYWxsb3cgY29weVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gc2hhbGxvd0NvcHlPYmplY3Qob2JqKSB7XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICByZXRbaV0gPSBvYmpbaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBGaWx0ZXJYU1MgY2xhc3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogICAgICAgIHdoaXRlTGlzdCwgb25UYWcsIG9uVGFnQXR0ciwgb25JZ25vcmVUYWcsXG4gKiAgICAgICAgb25JZ25vcmVUYWdBdHRyLCBzYWZlQXR0clZhbHVlLCBlc2NhcGVIdG1sXG4gKiAgICAgICAgc3RyaXBJZ25vcmVUYWdCb2R5LCBhbGxvd0NvbW1lbnRUYWcsIHN0cmlwQmxhbmtDaGFyXG4gKiAgICAgICAgY3Nze3doaXRlTGlzdCwgb25BdHRyLCBvbklnbm9yZUF0dHJ9IGBjc3M9ZmFsc2VgIG1lYW5zIGRvbid0IHVzZSBgY3NzZmlsdGVyYFxuICovXG5mdW5jdGlvbiBGaWx0ZXJYU1Mob3B0aW9ucykge1xuICBvcHRpb25zID0gc2hhbGxvd0NvcHlPYmplY3Qob3B0aW9ucyB8fCB7fSk7XG5cbiAgaWYgKG9wdGlvbnMuc3RyaXBJZ25vcmVUYWcpIHtcbiAgICBpZiAob3B0aW9ucy5vbklnbm9yZVRhZykge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJ05vdGVzOiBjYW5ub3QgdXNlIHRoZXNlIHR3byBvcHRpb25zIFwic3RyaXBJZ25vcmVUYWdcIiBhbmQgXCJvbklnbm9yZVRhZ1wiIGF0IHRoZSBzYW1lIHRpbWUnXG4gICAgICApO1xuICAgIH1cbiAgICBvcHRpb25zLm9uSWdub3JlVGFnID0gREVGQVVMVC5vbklnbm9yZVRhZ1N0cmlwQWxsO1xuICB9XG5cbiAgb3B0aW9ucy53aGl0ZUxpc3QgPSBvcHRpb25zLndoaXRlTGlzdCB8fCBERUZBVUxULndoaXRlTGlzdDtcbiAgb3B0aW9ucy5vblRhZyA9IG9wdGlvbnMub25UYWcgfHwgREVGQVVMVC5vblRhZztcbiAgb3B0aW9ucy5vblRhZ0F0dHIgPSBvcHRpb25zLm9uVGFnQXR0ciB8fCBERUZBVUxULm9uVGFnQXR0cjtcbiAgb3B0aW9ucy5vbklnbm9yZVRhZyA9IG9wdGlvbnMub25JZ25vcmVUYWcgfHwgREVGQVVMVC5vbklnbm9yZVRhZztcbiAgb3B0aW9ucy5vbklnbm9yZVRhZ0F0dHIgPSBvcHRpb25zLm9uSWdub3JlVGFnQXR0ciB8fCBERUZBVUxULm9uSWdub3JlVGFnQXR0cjtcbiAgb3B0aW9ucy5zYWZlQXR0clZhbHVlID0gb3B0aW9ucy5zYWZlQXR0clZhbHVlIHx8IERFRkFVTFQuc2FmZUF0dHJWYWx1ZTtcbiAgb3B0aW9ucy5lc2NhcGVIdG1sID0gb3B0aW9ucy5lc2NhcGVIdG1sIHx8IERFRkFVTFQuZXNjYXBlSHRtbDtcbiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuICBpZiAob3B0aW9ucy5jc3MgPT09IGZhbHNlKSB7XG4gICAgdGhpcy5jc3NGaWx0ZXIgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zLmNzcyA9IG9wdGlvbnMuY3NzIHx8IHt9O1xuICAgIHRoaXMuY3NzRmlsdGVyID0gbmV3IEZpbHRlckNTUyhvcHRpb25zLmNzcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBzdGFydCBwcm9jZXNzIGFuZCByZXR1cm5zIHJlc3VsdFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBodG1sXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKi9cbkZpbHRlclhTUy5wcm90b3R5cGUucHJvY2VzcyA9IGZ1bmN0aW9uKGh0bWwpIHtcbiAgLy8gY29tcGF0aWJsZSB3aXRoIHRoZSBpbnB1dFxuICBodG1sID0gaHRtbCB8fCBcIlwiO1xuICBodG1sID0gaHRtbC50b1N0cmluZygpO1xuICBpZiAoIWh0bWwpIHJldHVybiBcIlwiO1xuXG4gIHZhciBtZSA9IHRoaXM7XG4gIHZhciBvcHRpb25zID0gbWUub3B0aW9ucztcbiAgdmFyIHdoaXRlTGlzdCA9IG9wdGlvbnMud2hpdGVMaXN0O1xuICB2YXIgb25UYWcgPSBvcHRpb25zLm9uVGFnO1xuICB2YXIgb25JZ25vcmVUYWcgPSBvcHRpb25zLm9uSWdub3JlVGFnO1xuICB2YXIgb25UYWdBdHRyID0gb3B0aW9ucy5vblRhZ0F0dHI7XG4gIHZhciBvbklnbm9yZVRhZ0F0dHIgPSBvcHRpb25zLm9uSWdub3JlVGFnQXR0cjtcbiAgdmFyIHNhZmVBdHRyVmFsdWUgPSBvcHRpb25zLnNhZmVBdHRyVmFsdWU7XG4gIHZhciBlc2NhcGVIdG1sID0gb3B0aW9ucy5lc2NhcGVIdG1sO1xuICB2YXIgY3NzRmlsdGVyID0gbWUuY3NzRmlsdGVyO1xuXG4gIC8vIHJlbW92ZSBpbnZpc2libGUgY2hhcmFjdGVyc1xuICBpZiAob3B0aW9ucy5zdHJpcEJsYW5rQ2hhcikge1xuICAgIGh0bWwgPSBERUZBVUxULnN0cmlwQmxhbmtDaGFyKGh0bWwpO1xuICB9XG5cbiAgLy8gcmVtb3ZlIGh0bWwgY29tbWVudHNcbiAgaWYgKCFvcHRpb25zLmFsbG93Q29tbWVudFRhZykge1xuICAgIGh0bWwgPSBERUZBVUxULnN0cmlwQ29tbWVudFRhZyhodG1sKTtcbiAgfVxuXG4gIC8vIGlmIGVuYWJsZSBzdHJpcElnbm9yZVRhZ0JvZHlcbiAgdmFyIHN0cmlwSWdub3JlVGFnQm9keSA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy5zdHJpcElnbm9yZVRhZ0JvZHkpIHtcbiAgICB2YXIgc3RyaXBJZ25vcmVUYWdCb2R5ID0gREVGQVVMVC5TdHJpcFRhZ0JvZHkoXG4gICAgICBvcHRpb25zLnN0cmlwSWdub3JlVGFnQm9keSxcbiAgICAgIG9uSWdub3JlVGFnXG4gICAgKTtcbiAgICBvbklnbm9yZVRhZyA9IHN0cmlwSWdub3JlVGFnQm9keS5vbklnbm9yZVRhZztcbiAgfVxuXG4gIHZhciByZXRIdG1sID0gcGFyc2VUYWcoXG4gICAgaHRtbCxcbiAgICBmdW5jdGlvbihzb3VyY2VQb3NpdGlvbiwgcG9zaXRpb24sIHRhZywgaHRtbCwgaXNDbG9zaW5nKSB7XG4gICAgICB2YXIgaW5mbyA9IHtcbiAgICAgICAgc291cmNlUG9zaXRpb246IHNvdXJjZVBvc2l0aW9uLFxuICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sXG4gICAgICAgIGlzQ2xvc2luZzogaXNDbG9zaW5nLFxuICAgICAgICBpc1doaXRlOiB3aGl0ZUxpc3QuaGFzT3duUHJvcGVydHkodGFnKVxuICAgICAgfTtcblxuICAgICAgLy8gY2FsbCBgb25UYWcoKWBcbiAgICAgIHZhciByZXQgPSBvblRhZyh0YWcsIGh0bWwsIGluZm8pO1xuICAgICAgaWYgKCFpc051bGwocmV0KSkgcmV0dXJuIHJldDtcblxuICAgICAgaWYgKGluZm8uaXNXaGl0ZSkge1xuICAgICAgICBpZiAoaW5mby5pc0Nsb3NpbmcpIHtcbiAgICAgICAgICByZXR1cm4gXCI8L1wiICsgdGFnICsgXCI+XCI7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXR0cnMgPSBnZXRBdHRycyhodG1sKTtcbiAgICAgICAgdmFyIHdoaXRlQXR0ckxpc3QgPSB3aGl0ZUxpc3RbdGFnXTtcbiAgICAgICAgdmFyIGF0dHJzSHRtbCA9IHBhcnNlQXR0cihhdHRycy5odG1sLCBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICAgIC8vIGNhbGwgYG9uVGFnQXR0cigpYFxuICAgICAgICAgIHZhciBpc1doaXRlQXR0ciA9IF8uaW5kZXhPZih3aGl0ZUF0dHJMaXN0LCBuYW1lKSAhPT0gLTE7XG4gICAgICAgICAgdmFyIHJldCA9IG9uVGFnQXR0cih0YWcsIG5hbWUsIHZhbHVlLCBpc1doaXRlQXR0cik7XG4gICAgICAgICAgaWYgKCFpc051bGwocmV0KSkgcmV0dXJuIHJldDtcblxuICAgICAgICAgIGlmIChpc1doaXRlQXR0cikge1xuICAgICAgICAgICAgLy8gY2FsbCBgc2FmZUF0dHJWYWx1ZSgpYFxuICAgICAgICAgICAgdmFsdWUgPSBzYWZlQXR0clZhbHVlKHRhZywgbmFtZSwgdmFsdWUsIGNzc0ZpbHRlcik7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnPVwiJyArIHZhbHVlICsgJ1wiJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBjYWxsIGBvbklnbm9yZVRhZ0F0dHIoKWBcbiAgICAgICAgICAgIHZhciByZXQgPSBvbklnbm9yZVRhZ0F0dHIodGFnLCBuYW1lLCB2YWx1ZSwgaXNXaGl0ZUF0dHIpO1xuICAgICAgICAgICAgaWYgKCFpc051bGwocmV0KSkgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGJ1aWxkIG5ldyB0YWcgaHRtbFxuICAgICAgICB2YXIgaHRtbCA9IFwiPFwiICsgdGFnO1xuICAgICAgICBpZiAoYXR0cnNIdG1sKSBodG1sICs9IFwiIFwiICsgYXR0cnNIdG1sO1xuICAgICAgICBpZiAoYXR0cnMuY2xvc2luZykgaHRtbCArPSBcIiAvXCI7XG4gICAgICAgIGh0bWwgKz0gXCI+XCI7XG4gICAgICAgIHJldHVybiBodG1sO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2FsbCBgb25JZ25vcmVUYWcoKWBcbiAgICAgICAgdmFyIHJldCA9IG9uSWdub3JlVGFnKHRhZywgaHRtbCwgaW5mbyk7XG4gICAgICAgIGlmICghaXNOdWxsKHJldCkpIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBlc2NhcGVIdG1sKGh0bWwpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXNjYXBlSHRtbFxuICApO1xuXG4gIC8vIGlmIGVuYWJsZSBzdHJpcElnbm9yZVRhZ0JvZHlcbiAgaWYgKHN0cmlwSWdub3JlVGFnQm9keSkge1xuICAgIHJldEh0bWwgPSBzdHJpcElnbm9yZVRhZ0JvZHkucmVtb3ZlKHJldEh0bWwpO1xuICB9XG5cbiAgcmV0dXJuIHJldEh0bWw7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZpbHRlclhTUztcbiIsIi8qKlxuICogeHNzXG4gKlxuICogQGF1dGhvciBab25nbWluIExlaTxsZWl6b25nbWluQGdtYWlsLmNvbT5cbiAqL1xuXG52YXIgREVGQVVMVCA9IHJlcXVpcmUoXCIuL2RlZmF1bHRcIik7XG52YXIgcGFyc2VyID0gcmVxdWlyZShcIi4vcGFyc2VyXCIpO1xudmFyIEZpbHRlclhTUyA9IHJlcXVpcmUoXCIuL3hzc1wiKTtcblxuLyoqXG4gKiBmaWx0ZXIgeHNzIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGh0bWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHsgd2hpdGVMaXN0LCBvblRhZywgb25UYWdBdHRyLCBvbklnbm9yZVRhZywgb25JZ25vcmVUYWdBdHRyLCBzYWZlQXR0clZhbHVlLCBlc2NhcGVIdG1sIH1cbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZmlsdGVyWFNTKGh0bWwsIG9wdGlvbnMpIHtcbiAgdmFyIHhzcyA9IG5ldyBGaWx0ZXJYU1Mob3B0aW9ucyk7XG4gIHJldHVybiB4c3MucHJvY2VzcyhodG1sKTtcbn1cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZmlsdGVyWFNTO1xuZXhwb3J0cy5maWx0ZXJYU1MgPSBmaWx0ZXJYU1M7XG5leHBvcnRzLkZpbHRlclhTUyA9IEZpbHRlclhTUztcbmZvciAodmFyIGkgaW4gREVGQVVMVCkgZXhwb3J0c1tpXSA9IERFRkFVTFRbaV07XG5mb3IgKHZhciBpIGluIHBhcnNlcikgZXhwb3J0c1tpXSA9IHBhcnNlcltpXTtcblxuLy8gdXNpbmcgYHhzc2Agb24gdGhlIGJyb3dzZXIsIG91dHB1dCBgZmlsdGVyWFNTYCB0byB0aGUgZ2xvYmFsc1xuaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgd2luZG93LmZpbHRlclhTUyA9IG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyB1c2luZyBgeHNzYCBvbiB0aGUgV2ViV29ya2VyLCBvdXRwdXQgYGZpbHRlclhTU2AgdG8gdGhlIGdsb2JhbHNcbmZ1bmN0aW9uIGlzV29ya2VyRW52KCkge1xuICByZXR1cm4gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIERlZGljYXRlZFdvcmtlckdsb2JhbFNjb3BlO1xufVxuaWYgKGlzV29ya2VyRW52KCkpIHtcbiAgc2VsZi5maWx0ZXJYU1MgPSBtb2R1bGUuZXhwb3J0cztcbn1cbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLnByb3BhZ2F0aW5nID0gZmFjdG9yeSgpKTtcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBfZmlyc3RUYXJnZXQgPSBudWxsOyAvLyBzaW5nbGV0b24sIHdpbGwgY29udGFpbiB0aGUgdGFyZ2V0IGVsZW1lbnQgd2hlcmUgdGhlIHRvdWNoIGV2ZW50IHN0YXJ0ZWRcblxuICAvKipcbiAgICogRXh0ZW5kIGFuIEhhbW1lci5qcyBpbnN0YW5jZSB3aXRoIGV2ZW50IHByb3BhZ2F0aW9uLlxuICAgKlxuICAgKiBGZWF0dXJlczpcbiAgICogLSBFdmVudHMgZW1pdHRlZCBieSBoYW1tZXIgd2lsbCBwcm9wYWdhdGUgaW4gb3JkZXIgZnJvbSBjaGlsZCB0byBwYXJlbnRcbiAgICogICBlbGVtZW50cy5cbiAgICogLSBFdmVudHMgYXJlIGV4dGVuZGVkIHdpdGggYSBmdW5jdGlvbiBgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClgIHRvIHN0b3BcbiAgICogICBwcm9wYWdhdGlvbiB0byBwYXJlbnQgZWxlbWVudHMuXG4gICAqIC0gQW4gb3B0aW9uIGBwcmV2ZW50RGVmYXVsdGAgdG8gc3RvcCBhbGwgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yLlxuICAgKlxuICAgKiBVc2FnZTpcbiAgICogICB2YXIgaGFtbWVyID0gcHJvcGFnYXRpbmdIYW1tZXIobmV3IEhhbW1lcihlbGVtZW50KSk7XG4gICAqICAgdmFyIGhhbW1lciA9IHByb3BhZ2F0aW5nSGFtbWVyKG5ldyBIYW1tZXIoZWxlbWVudCksIHtwcmV2ZW50RGVmYXVsdDogdHJ1ZX0pO1xuICAgKlxuICAgKiBAcGFyYW0ge0hhbW1lci5NYW5hZ2VyfSBoYW1tZXIgICBBbiBoYW1tZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gICAgICAgIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGBwcmV2ZW50RGVmYXVsdDogdHJ1ZSB8IGZhbHNlIHwgJ21vdXNlJyB8ICd0b3VjaCcgfCAncGVuJ2AuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5mb3JjZSBwcmV2ZW50aW5nIHRoZSBkZWZhdWx0IGJyb3dzZXIgYmVoYXZpb3IuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2Fubm90IGJlIHNldCB0byBgZmFsc2VgLlxuICAgKiBAcmV0dXJuIHtIYW1tZXIuTWFuYWdlcn0gUmV0dXJucyB0aGUgc2FtZSBoYW1tZXIgaW5zdGFuY2Ugd2l0aCBleHRlbmRlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvcGFnYXRpbmcoaGFtbWVyLCBvcHRpb25zKSB7XG4gICAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyB8fCB7XG4gICAgICBwcmV2ZW50RGVmYXVsdDogZmFsc2VcbiAgICB9O1xuXG4gICAgaWYgKGhhbW1lci5NYW5hZ2VyKSB7XG4gICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgdGhlIEhhbW1lciBjb25zdHJ1Y3Rvci5cbiAgICAgIC8vIE92ZXJsb2FkIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBvdXIgb3duLlxuICAgICAgdmFyIEhhbW1lciA9IGhhbW1lcjtcblxuICAgICAgdmFyIFByb3BhZ2F0aW5nSGFtbWVyID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgbyA9IE9iamVjdC5jcmVhdGUoX29wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucykgSGFtbWVyLmFzc2lnbihvLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHByb3BhZ2F0aW5nKG5ldyBIYW1tZXIoZWxlbWVudCwgbyksIG8pO1xuICAgICAgfTtcbiAgICAgIEhhbW1lci5hc3NpZ24oUHJvcGFnYXRpbmdIYW1tZXIsIEhhbW1lcik7XG5cbiAgICAgIFByb3BhZ2F0aW5nSGFtbWVyLk1hbmFnZXIgPSBmdW5jdGlvbiAoZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgbyA9IE9iamVjdC5jcmVhdGUoX29wdGlvbnMpO1xuICAgICAgICBpZiAob3B0aW9ucykgSGFtbWVyLmFzc2lnbihvLCBvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIHByb3BhZ2F0aW5nKG5ldyBIYW1tZXIuTWFuYWdlcihlbGVtZW50LCBvKSwgbyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gUHJvcGFnYXRpbmdIYW1tZXI7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgd3JhcHBlciBvYmplY3Qgd2hpY2ggd2lsbCBvdmVycmlkZSB0aGUgZnVuY3Rpb25zXG4gICAgLy8gYG9uYCwgYG9mZmAsIGBkZXN0cm95YCwgYW5kIGBlbWl0YCBvZiB0aGUgaGFtbWVyIGluc3RhbmNlXG4gICAgdmFyIHdyYXBwZXIgPSBPYmplY3QuY3JlYXRlKGhhbW1lcik7XG5cbiAgICAvLyBhdHRhY2ggdG8gRE9NIGVsZW1lbnRcbiAgICB2YXIgZWxlbWVudCA9IGhhbW1lci5lbGVtZW50O1xuXG4gICAgaWYoIWVsZW1lbnQuaGFtbWVyKSBlbGVtZW50LmhhbW1lciA9IFtdO1xuICAgIGVsZW1lbnQuaGFtbWVyLnB1c2god3JhcHBlcik7XG5cbiAgICAvLyByZWdpc3RlciBhbiBldmVudCB0byBjYXRjaCB0aGUgc3RhcnQgb2YgYSBnZXN0dXJlIGFuZCBzdG9yZSB0aGVcbiAgICAvLyB0YXJnZXQgaW4gYSBzaW5nbGV0b25cbiAgICBoYW1tZXIub24oJ2hhbW1lci5pbnB1dCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF9vcHRpb25zLnByZXZlbnREZWZhdWx0ID09PSB0cnVlIHx8IChfb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCA9PT0gZXZlbnQucG9pbnRlclR5cGUpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuaXNGaXJzdCkge1xuICAgICAgICBfZmlyc3RUYXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvKiogQHR5cGUge09iamVjdC48U3RyaW5nLCBBcnJheS48ZnVuY3Rpb24+Pn0gKi9cbiAgICB3cmFwcGVyLl9oYW5kbGVycyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBvbmUgb3IgbXVsdGlwbGUgZXZlbnRzXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50cyAgICBBIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgd2l0aCBldmVudHNcbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBoYW5kbGVyIEEgY2FsbGJhY2sgZnVuY3Rpb24sIGNhbGxlZCBhcyBoYW5kbGVyKGV2ZW50KVxuICAgICAqIEByZXR1cm5zIHtIYW1tZXIuTWFuYWdlcn0gUmV0dXJucyB0aGUgaGFtbWVyIGluc3RhbmNlXG4gICAgICovXG4gICAgd3JhcHBlci5vbiA9IGZ1bmN0aW9uIChldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgIC8vIHJlZ2lzdGVyIHRoZSBoYW5kbGVyXG4gICAgICBzcGxpdChldmVudHMpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHZhciBfaGFuZGxlcnMgPSB3cmFwcGVyLl9oYW5kbGVyc1tldmVudF07XG4gICAgICAgIGlmICghX2hhbmRsZXJzKSB7XG4gICAgICAgICAgd3JhcHBlci5faGFuZGxlcnNbZXZlbnRdID0gX2hhbmRsZXJzID0gW107XG5cbiAgICAgICAgICAvLyByZWdpc3RlciB0aGUgc3RhdGljLCBwcm9wYWdhdGVkIGhhbmRsZXJcbiAgICAgICAgICBoYW1tZXIub24oZXZlbnQsIHByb3BhZ2F0ZWRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBfaGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gd3JhcHBlcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlciBhIGhhbmRsZXIgZm9yIG9uZSBvciBtdWx0aXBsZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnRzICAgICAgQSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIHdpdGggZXZlbnRzXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2hhbmRsZXJdIE9wdGlvbmFsLiBUaGUgcmVnaXN0ZXJlZCBoYW5kbGVyLiBJZiBub3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQsIGFsbCBoYW5kbGVycyBmb3IgZ2l2ZW4gZXZlbnRzXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSByZW1vdmVkLlxuICAgICAqIEByZXR1cm5zIHtIYW1tZXIuTWFuYWdlcn0gICBSZXR1cm5zIHRoZSBoYW1tZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICB3cmFwcGVyLm9mZiA9IGZ1bmN0aW9uIChldmVudHMsIGhhbmRsZXIpIHtcbiAgICAgIC8vIHVucmVnaXN0ZXIgdGhlIGhhbmRsZXJcbiAgICAgIHNwbGl0KGV2ZW50cykuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgdmFyIF9oYW5kbGVycyA9IHdyYXBwZXIuX2hhbmRsZXJzW2V2ZW50XTtcbiAgICAgICAgaWYgKF9oYW5kbGVycykge1xuICAgICAgICAgIF9oYW5kbGVycyA9IGhhbmRsZXIgPyBfaGFuZGxlcnMuZmlsdGVyKGZ1bmN0aW9uIChoKSB7XG4gICAgICAgICAgICByZXR1cm4gaCAhPT0gaGFuZGxlcjtcbiAgICAgICAgICB9KSA6IFtdO1xuXG4gICAgICAgICAgaWYgKF9oYW5kbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB3cmFwcGVyLl9oYW5kbGVyc1tldmVudF0gPSBfaGFuZGxlcnM7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHN0YXRpYywgcHJvcGFnYXRlZCBoYW5kbGVyXG4gICAgICAgICAgICBoYW1tZXIub2ZmKGV2ZW50LCBwcm9wYWdhdGVkSGFuZGxlcik7XG4gICAgICAgICAgICBkZWxldGUgd3JhcHBlci5faGFuZGxlcnNbZXZlbnRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB3cmFwcGVyO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHRvIHRoZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICAgKi9cbiAgICB3cmFwcGVyLmVtaXQgPSBmdW5jdGlvbihldmVudFR5cGUsIGV2ZW50KSB7XG4gICAgICBfZmlyc3RUYXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICBoYW1tZXIuZW1pdChldmVudFR5cGUsIGV2ZW50KTtcbiAgICB9O1xuXG4gICAgd3JhcHBlci5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gRGV0YWNoIGZyb20gRE9NIGVsZW1lbnRcbiAgICAgIHZhciBoYW1tZXJzID0gaGFtbWVyLmVsZW1lbnQuaGFtbWVyO1xuICAgICAgdmFyIGlkeCA9IGhhbW1lcnMuaW5kZXhPZih3cmFwcGVyKTtcbiAgICAgIGlmKGlkeCAhPT0gLTEpIGhhbW1lcnMuc3BsaWNlKGlkeCwxKTtcbiAgICAgIGlmKCFoYW1tZXJzLmxlbmd0aCkgZGVsZXRlIGhhbW1lci5lbGVtZW50LmhhbW1lcjtcblxuICAgICAgLy8gY2xlYXIgYWxsIGhhbmRsZXJzXG4gICAgICB3cmFwcGVyLl9oYW5kbGVycyA9IHt9O1xuXG4gICAgICAvLyBjYWxsIG9yaWdpbmFsIGhhbW1lciBkZXN0cm95XG4gICAgICBoYW1tZXIuZGVzdHJveSgpO1xuICAgIH07XG5cbiAgICAvLyBzcGxpdCBhIHN0cmluZyB3aXRoIHNwYWNlIHNlcGFyYXRlZCB3b3Jkc1xuICAgIGZ1bmN0aW9uIHNwbGl0KGV2ZW50cykge1xuICAgICAgcmV0dXJuIGV2ZW50cy5tYXRjaCgvW14gXSsvZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBzdGF0aWMgZXZlbnQgaGFuZGxlciwgYXBwbHlpbmcgZXZlbnQgcHJvcGFnYXRpb24uXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvcGFnYXRlZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgIC8vIGxldCBvbmx5IGEgc2luZ2xlIGhhbW1lciBpbnN0YW5jZSBoYW5kbGUgdGhpcyBldmVudFxuICAgICAgaWYgKGV2ZW50LnR5cGUgIT09ICdoYW1tZXIuaW5wdXQnKSB7XG4gICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHNhbWUgc3JjRXZlbnQgaXMgdXNlZCB3aXRoIG11bHRpcGxlIGhhbW1lciBldmVudHMsXG4gICAgICAgIC8vIHdlIGtlZXAgdHJhY2sgb24gd2hpY2ggZXZlbnRzIGFyZSBoYW5kbGVkIGluIGFuIG9iamVjdCBfaGFuZGxlZFxuICAgICAgICBpZiAoIWV2ZW50LnNyY0V2ZW50Ll9oYW5kbGVkKSB7XG4gICAgICAgICAgZXZlbnQuc3JjRXZlbnQuX2hhbmRsZWQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5zcmNFdmVudC5faGFuZGxlZFtldmVudC50eXBlXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBldmVudC5zcmNFdmVudC5faGFuZGxlZFtldmVudC50eXBlXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gYXR0YWNoIGEgc3RvcFByb3BhZ2F0aW9uIGZ1bmN0aW9uIHRvIHRoZSBldmVudFxuICAgICAgdmFyIHN0b3BwZWQgPSBmYWxzZTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3RvcHBlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICAvL3dyYXAgdGhlIHNyY0V2ZW50J3Mgc3RvcFByb3BhZ2F0aW9uIHRvIGFsc28gc3RvcCBoYW1tZXIgcHJvcGFnYXRpb246XG4gICAgICB2YXIgc3JjU3RvcCA9IGV2ZW50LnNyY0V2ZW50LnN0b3BQcm9wYWdhdGlvbi5iaW5kKGV2ZW50LnNyY0V2ZW50KTtcbiAgICAgIGlmKHR5cGVvZiBzcmNTdG9wID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBldmVudC5zcmNFdmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigpe1xuICAgICAgICAgIHNyY1N0b3AoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy8gYXR0YWNoIGZpcnN0VGFyZ2V0IHByb3BlcnR5IHRvIHRoZSBldmVudFxuICAgICAgZXZlbnQuZmlyc3RUYXJnZXQgPSBfZmlyc3RUYXJnZXQ7XG5cbiAgICAgIC8vIHByb3BhZ2F0ZSBvdmVyIGFsbCBlbGVtZW50cyAodW50aWwgc3RvcHBlZClcbiAgICAgIHZhciBlbGVtID0gX2ZpcnN0VGFyZ2V0O1xuICAgICAgd2hpbGUgKGVsZW0gJiYgIXN0b3BwZWQpIHtcbiAgICAgICAgdmFyIGVsZW1IYW1tZXIgPSBlbGVtLmhhbW1lcjtcbiAgICAgICAgaWYoZWxlbUhhbW1lcil7XG4gICAgICAgICAgdmFyIF9oYW5kbGVycztcbiAgICAgICAgICBmb3IodmFyIGsgPSAwOyBrIDwgZWxlbUhhbW1lci5sZW5ndGg7IGsrKyl7XG4gICAgICAgICAgICBfaGFuZGxlcnMgPSBlbGVtSGFtbWVyW2tdLl9oYW5kbGVyc1tldmVudC50eXBlXTtcbiAgICAgICAgICAgIGlmKF9oYW5kbGVycykgZm9yICh2YXIgaSA9IDA7IGkgPCBfaGFuZGxlcnMubGVuZ3RoICYmICFzdG9wcGVkOyBpKyspIHtcbiAgICAgICAgICAgICAgX2hhbmRsZXJzW2ldKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxuXG4gIHJldHVybiBwcm9wYWdhdGluZztcblxufSkpKTtcbiIsIi8qKlxyXG4gKiBDcmVhdGVkIGJ5IEFsZXggb24gMTEvNi8yMDE0LlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24ga2V5Y2hhcm0ob3B0aW9ucykge1xyXG4gIHZhciBwcmV2ZW50RGVmYXVsdCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5wcmV2ZW50RGVmYXVsdCB8fCBmYWxzZTtcclxuXHJcbiAgdmFyIGNvbnRhaW5lciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250YWluZXIgfHwgd2luZG93O1xyXG5cclxuICB2YXIgX2V4cG9ydEZ1bmN0aW9ucyA9IHt9O1xyXG4gIHZhciBfYm91bmQgPSB7a2V5ZG93bjp7fSwga2V5dXA6e319O1xyXG4gIHZhciBfa2V5cyA9IHt9O1xyXG4gIHZhciBpO1xyXG5cclxuICAvLyBhIC0gelxyXG4gIGZvciAoaSA9IDk3OyBpIDw9IDEyMjsgaSsrKSB7X2tleXNbU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSB7Y29kZTo2NSArIChpIC0gOTcpLCBzaGlmdDogZmFsc2V9O31cclxuICAvLyBBIC0gWlxyXG4gIGZvciAoaSA9IDY1OyBpIDw9IDkwOyBpKyspIHtfa2V5c1tTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IHtjb2RlOmksIHNoaWZ0OiB0cnVlfTt9XHJcbiAgLy8gMCAtIDlcclxuICBmb3IgKGkgPSAwOyAgaSA8PSA5OyAgIGkrKykge19rZXlzWycnICsgaV0gPSB7Y29kZTo0OCArIGksIHNoaWZ0OiBmYWxzZX07fVxyXG4gIC8vIEYxIC0gRjEyXHJcbiAgZm9yIChpID0gMTsgIGkgPD0gMTI7ICAgaSsrKSB7X2tleXNbJ0YnICsgaV0gPSB7Y29kZToxMTEgKyBpLCBzaGlmdDogZmFsc2V9O31cclxuICAvLyBudW0wIC0gbnVtOVxyXG4gIGZvciAoaSA9IDA7ICBpIDw9IDk7ICAgaSsrKSB7X2tleXNbJ251bScgKyBpXSA9IHtjb2RlOjk2ICsgaSwgc2hpZnQ6IGZhbHNlfTt9XHJcblxyXG4gIC8vIG51bXBhZCBtaXNjXHJcbiAgX2tleXNbJ251bSonXSA9IHtjb2RlOjEwNiwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snbnVtKyddID0ge2NvZGU6MTA3LCBzaGlmdDogZmFsc2V9O1xyXG4gIF9rZXlzWydudW0tJ10gPSB7Y29kZToxMDksIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ251bS8nXSA9IHtjb2RlOjExMSwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snbnVtLiddID0ge2NvZGU6MTEwLCBzaGlmdDogZmFsc2V9O1xyXG4gIC8vIGFycm93c1xyXG4gIF9rZXlzWydsZWZ0J10gID0ge2NvZGU6MzcsIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ3VwJ10gICAgPSB7Y29kZTozOCwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1sncmlnaHQnXSA9IHtjb2RlOjM5LCBzaGlmdDogZmFsc2V9O1xyXG4gIF9rZXlzWydkb3duJ10gID0ge2NvZGU6NDAsIHNoaWZ0OiBmYWxzZX07XHJcbiAgLy8gZXh0cmEga2V5c1xyXG4gIF9rZXlzWydzcGFjZSddID0ge2NvZGU6MzIsIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ2VudGVyJ10gPSB7Y29kZToxMywgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snc2hpZnQnXSA9IHtjb2RlOjE2LCBzaGlmdDogdW5kZWZpbmVkfTtcclxuICBfa2V5c1snZXNjJ10gICA9IHtjb2RlOjI3LCBzaGlmdDogZmFsc2V9O1xyXG4gIF9rZXlzWydiYWNrc3BhY2UnXSA9IHtjb2RlOjgsIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ3RhYiddICAgICAgID0ge2NvZGU6OSwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snY3RybCddICAgICAgPSB7Y29kZToxNywgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snYWx0J10gICAgICAgPSB7Y29kZToxOCwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1snZGVsZXRlJ10gICAgPSB7Y29kZTo0Niwgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1sncGFnZXVwJ10gICAgPSB7Y29kZTozMywgc2hpZnQ6IGZhbHNlfTtcclxuICBfa2V5c1sncGFnZWRvd24nXSAgPSB7Y29kZTozNCwgc2hpZnQ6IGZhbHNlfTtcclxuICAvLyBzeW1ib2xzXHJcbiAgX2tleXNbJz0nXSAgICAgPSB7Y29kZToxODcsIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJy0nXSAgICAgPSB7Y29kZToxODksIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ10nXSAgICAgPSB7Y29kZToyMjEsIHNoaWZ0OiBmYWxzZX07XHJcbiAgX2tleXNbJ1snXSAgICAgPSB7Y29kZToyMTksIHNoaWZ0OiBmYWxzZX07XHJcblxyXG5cclxuXHJcbiAgdmFyIGRvd24gPSBmdW5jdGlvbihldmVudCkge2hhbmRsZUV2ZW50KGV2ZW50LCdrZXlkb3duJyk7fTtcclxuICB2YXIgdXAgPSBmdW5jdGlvbihldmVudCkge2hhbmRsZUV2ZW50KGV2ZW50LCdrZXl1cCcpO307XHJcblxyXG4gIC8vIGhhbmRsZSB0aGUgYWN0dWFseSBib3VuZCBrZXkgd2l0aCB0aGUgZXZlbnRcclxuICB2YXIgaGFuZGxlRXZlbnQgPSBmdW5jdGlvbihldmVudCx0eXBlKSB7XHJcbiAgICBpZiAoX2JvdW5kW3R5cGVdW2V2ZW50LmtleUNvZGVdICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdmFyIGJvdW5kID0gX2JvdW5kW3R5cGVdW2V2ZW50LmtleUNvZGVdO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGJvdW5kW2ldLnNoaWZ0ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGJvdW5kW2ldLmZuKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoYm91bmRbaV0uc2hpZnQgPT0gdHJ1ZSAmJiBldmVudC5zaGlmdEtleSA9PSB0cnVlKSB7XHJcbiAgICAgICAgICBib3VuZFtpXS5mbihldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGJvdW5kW2ldLnNoaWZ0ID09IGZhbHNlICYmIGV2ZW50LnNoaWZ0S2V5ID09IGZhbHNlKSB7XHJcbiAgICAgICAgICBib3VuZFtpXS5mbihldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgPT0gdHJ1ZSkge1xyXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBiaW5kIGEga2V5IHRvIGEgY2FsbGJhY2tcclxuICBfZXhwb3J0RnVuY3Rpb25zLmJpbmQgPSBmdW5jdGlvbihrZXksIGNhbGxiYWNrLCB0eXBlKSB7XHJcbiAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHR5cGUgPSAna2V5ZG93bic7XHJcbiAgICB9XHJcbiAgICBpZiAoX2tleXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGtleTogXCIgKyBrZXkpO1xyXG4gICAgfVxyXG4gICAgaWYgKF9ib3VuZFt0eXBlXVtfa2V5c1trZXldLmNvZGVdID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgX2JvdW5kW3R5cGVdW19rZXlzW2tleV0uY29kZV0gPSBbXTtcclxuICAgIH1cclxuICAgIF9ib3VuZFt0eXBlXVtfa2V5c1trZXldLmNvZGVdLnB1c2goe2ZuOmNhbGxiYWNrLCBzaGlmdDpfa2V5c1trZXldLnNoaWZ0fSk7XHJcbiAgfTtcclxuXHJcblxyXG4gIC8vIGJpbmQgYWxsIGtleXMgdG8gYSBjYWxsIGJhY2sgKGRlbW8gcHVycG9zZXMpXHJcbiAgX2V4cG9ydEZ1bmN0aW9ucy5iaW5kQWxsID0gZnVuY3Rpb24oY2FsbGJhY2ssIHR5cGUpIHtcclxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdHlwZSA9ICdrZXlkb3duJztcclxuICAgIH1cclxuICAgIGZvciAodmFyIGtleSBpbiBfa2V5cykge1xyXG4gICAgICBpZiAoX2tleXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgIF9leHBvcnRGdW5jdGlvbnMuYmluZChrZXksY2FsbGJhY2ssdHlwZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyBnZXQgdGhlIGtleSBsYWJlbCBmcm9tIGFuIGV2ZW50XHJcbiAgX2V4cG9ydEZ1bmN0aW9ucy5nZXRLZXkgPSBmdW5jdGlvbihldmVudCkge1xyXG4gICAgZm9yICh2YXIga2V5IGluIF9rZXlzKSB7XHJcbiAgICAgIGlmIChfa2V5cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5ID09IHRydWUgJiYgX2tleXNba2V5XS5zaGlmdCA9PSB0cnVlICYmIGV2ZW50LmtleUNvZGUgPT0gX2tleXNba2V5XS5jb2RlKSB7XHJcbiAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChldmVudC5zaGlmdEtleSA9PSBmYWxzZSAmJiBfa2V5c1trZXldLnNoaWZ0ID09IGZhbHNlICYmIGV2ZW50LmtleUNvZGUgPT0gX2tleXNba2V5XS5jb2RlKSB7XHJcbiAgICAgICAgICByZXR1cm4ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChldmVudC5rZXlDb2RlID09IF9rZXlzW2tleV0uY29kZSAmJiBrZXkgPT0gJ3NoaWZ0Jykge1xyXG4gICAgICAgICAgcmV0dXJuIGtleTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBcInVua25vd24ga2V5LCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZFwiO1xyXG4gIH07XHJcblxyXG4gIC8vIHVuYmluZCBlaXRoZXIgYSBzcGVjaWZpYyBjYWxsYmFjayBmcm9tIGEga2V5IG9yIGFsbCBvZiB0aGVtIChieSBsZWF2aW5nIGNhbGxiYWNrIHVuZGVmaW5lZClcclxuICBfZXhwb3J0RnVuY3Rpb25zLnVuYmluZCA9IGZ1bmN0aW9uKGtleSwgY2FsbGJhY2ssIHR5cGUpIHtcclxuICAgIGlmICh0eXBlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdHlwZSA9ICdrZXlkb3duJztcclxuICAgIH1cclxuICAgIGlmIChfa2V5c1trZXldID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5zdXBwb3J0ZWQga2V5OiBcIiArIGtleSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB2YXIgbmV3QmluZGluZ3MgPSBbXTtcclxuICAgICAgdmFyIGJvdW5kID0gX2JvdW5kW3R5cGVdW19rZXlzW2tleV0uY29kZV07XHJcbiAgICAgIGlmIChib3VuZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBib3VuZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKCEoYm91bmRbaV0uZm4gPT0gY2FsbGJhY2sgJiYgYm91bmRbaV0uc2hpZnQgPT0gX2tleXNba2V5XS5zaGlmdCkpIHtcclxuICAgICAgICAgICAgbmV3QmluZGluZ3MucHVzaChfYm91bmRbdHlwZV1bX2tleXNba2V5XS5jb2RlXVtpXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIF9ib3VuZFt0eXBlXVtfa2V5c1trZXldLmNvZGVdID0gbmV3QmluZGluZ3M7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgX2JvdW5kW3R5cGVdW19rZXlzW2tleV0uY29kZV0gPSBbXTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyByZXNldCBhbGwgYm91bmQgdmFyaWFibGVzLlxyXG4gIF9leHBvcnRGdW5jdGlvbnMucmVzZXQgPSBmdW5jdGlvbigpIHtcclxuICAgIF9ib3VuZCA9IHtrZXlkb3duOnt9LCBrZXl1cDp7fX07XHJcbiAgfTtcclxuXHJcbiAgLy8gdW5iaW5kIGFsbCBsaXN0ZW5lcnMgYW5kIHJlc2V0IGFsbCB2YXJpYWJsZXMuXHJcbiAgX2V4cG9ydEZ1bmN0aW9ucy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfYm91bmQgPSB7a2V5ZG93bjp7fSwga2V5dXA6e319O1xyXG4gICAgY29udGFpbmVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBkb3duLCB0cnVlKTtcclxuICAgIGNvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHVwLCB0cnVlKTtcclxuICB9O1xyXG5cclxuICAvLyBjcmVhdGUgbGlzdGVuZXJzLlxyXG4gIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJyxkb3duLHRydWUpO1xyXG4gIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsdXAsdHJ1ZSk7XHJcblxyXG4gIC8vIHJldHVybiB0aGUgcHVibGljIGZ1bmN0aW9ucy5cclxuICByZXR1cm4gX2V4cG9ydEZ1bmN0aW9ucztcclxufVxyXG4iLCIvKipcbiAqIHZpcy10aW1lbGluZSBhbmQgdmlzLWdyYXBoMmRcbiAqIGh0dHBzOi8vdmlzanMuZ2l0aHViLmlvL3Zpcy10aW1lbGluZS9cbiAqXG4gKiBDcmVhdGUgYSBmdWxseSBjdXN0b21pemFibGUsIGludGVyYWN0aXZlIHRpbWVsaW5lIHdpdGggaXRlbXMgYW5kIHJhbmdlcy5cbiAqXG4gKiBAdmVyc2lvbiA3LjQuNlxuICogQGRhdGUgICAgMjAyMS0wMS0xNVQwOTowMDozMy41OTBaXG4gKlxuICogQGNvcHlyaWdodCAoYykgMjAxMS0yMDE3IEFsbWVuZGUgQi5WLCBodHRwOi8vYWxtZW5kZS5jb21cbiAqIEBjb3B5cmlnaHQgKGMpIDIwMTctMjAxOSB2aXNqcyBjb250cmlidXRvcnMsIGh0dHBzOi8vZ2l0aHViLmNvbS92aXNqc1xuICpcbiAqIEBsaWNlbnNlXG4gKiB2aXMuanMgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciBib3RoXG4gKlxuICogICAxLiBUaGUgQXBhY2hlIDIuMCBMaWNlbnNlXG4gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqICAgYW5kXG4gKlxuICogICAyLiBUaGUgTUlUIExpY2Vuc2VcbiAqICAgICAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIHZpcy5qcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IG1vbWVudCQzIGZyb20gJ21vbWVudCc7XG5pbXBvcnQgKiBhcyB1dGlsJDEgZnJvbSAndmlzLXV0aWwvZXNuZXh0L2VzbS92aXMtdXRpbC5qcyc7XG5pbXBvcnQgeyBpc051bWJlciwgaXNTdHJpbmcsIGdldFR5cGUgfSBmcm9tICd2aXMtdXRpbC9lc25leHQvZXNtL3Zpcy11dGlsLmpzJztcbmltcG9ydCB7IERhdGFTZXQsIGNyZWF0ZU5ld0RhdGFQaXBlRnJvbSwgaXNEYXRhVmlld0xpa2UsIERhdGFWaWV3IH0gZnJvbSAndmlzLWRhdGEvZXNuZXh0L2VzbS92aXMtZGF0YS5qcyc7XG5pbXBvcnQgeHNzIGZyb20gJ3hzcyc7XG5pbXBvcnQgRW1pdHRlciBmcm9tICdjb21wb25lbnQtZW1pdHRlcic7XG5pbXBvcnQgUHJvcGFnYXRpbmdIYW1tZXIgZnJvbSAncHJvcGFnYXRpbmctaGFtbWVyanMnO1xuaW1wb3J0IEhhbW1lciQxIGZyb20gJ0BlZ2pzL2hhbW1lcmpzJztcbmltcG9ydCBrZXljaGFybSBmcm9tICdrZXljaGFybSc7XG5pbXBvcnQgeyB2NCB9IGZyb20gJ3V1aWQnO1xuXG4vLyBmaXJzdCBjaGVjayBpZiBtb21lbnQuanMgaXMgYWxyZWFkeSBsb2FkZWQgaW4gdGhlIGJyb3dzZXIgd2luZG93LCBpZiBzbyxcbi8vIHVzZSB0aGlzIGluc3RhbmNlLiBFbHNlLCBsb2FkIHZpYSBjb21tb25qcy5cbi8vXG4vLyBOb3RlOiBUaGlzIGRvZXNuJ3Qgd29yayBpbiBFU00uXG52YXIgbW9tZW50ID0gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSAmJiB3aW5kb3dbJ21vbWVudCddIHx8IG1vbWVudCQzO1xuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xuXG4vLyBwYXJzZSBBU1AuTmV0IERhdGUgcGF0dGVybixcbi8vIGZvciBleGFtcGxlICcvRGF0ZSgxMTk4OTA4NzE3MDU2KS8nIG9yICcvRGF0ZSgxMTk4OTA4NzE3MDU2LTA3MDApLydcbi8vIGNvZGUgZnJvbSBodHRwOi8vbW9tZW50anMuY29tL1xuY29uc3QgQVNQRGF0ZVJlZ2V4ID0gL15cXC8/RGF0ZVxcKCgtP1xcZCspL2k7XG5jb25zdCBOdW1lcmljUmVnZXggPSAvXlxcZCskLztcbi8qKlxuICogQ29udmVydCBhbiBvYmplY3QgaW50byBhbm90aGVyIHR5cGVcbiAqXG4gKiBAcGFyYW0gb2JqZWN0IC0gVmFsdWUgb2YgdW5rbm93biB0eXBlLlxuICogQHBhcmFtIHR5cGUgLSBOYW1lIG9mIHRoZSBkZXNpcmVkIHR5cGUuXG4gKlxuICogQHJldHVybnMgT2JqZWN0IGluIHRoZSBkZXNpcmVkIHR5cGUuXG4gKiBAdGhyb3dzIEVycm9yXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnQob2JqZWN0LCB0eXBlKSB7XG4gIGxldCBtYXRjaDtcblxuICBpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChvYmplY3QgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICghdHlwZSkge1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgaWYgKCEodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpICYmICEodHlwZSBpbnN0YW5jZW9mIFN0cmluZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUeXBlIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gIH1cblxuICAvL25vaW5zcGVjdGlvbiBGYWxsdGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgICAgcmV0dXJuIEJvb2xlYW4ob2JqZWN0KTtcblxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiTnVtYmVyXCI6XG4gICAgICBpZiAoaXNTdHJpbmcob2JqZWN0KSAmJiAhaXNOYU4oRGF0ZS5wYXJzZShvYmplY3QpKSkge1xuICAgICAgICByZXR1cm4gbW9tZW50JDMob2JqZWN0KS52YWx1ZU9mKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBAVE9ETzogSSBkb24ndCB0aGluayB0aGF0IE51bWJlciBhbmQgU3RyaW5nIGNvbnN0cnVjdG9ycyBhcmUgYSBnb29kIGlkZWEuXG4gICAgICAgIC8vIFRoaXMgY291bGQgYWxzbyBmYWlsIGlmIHRoZSBvYmplY3QgZG9lc24ndCBoYXZlIHZhbHVlT2YgbWV0aG9kIG9yIGlmIGl0J3MgcmVkZWZpbmVkLlxuICAgICAgICAvLyBGb3IgZXhhbXBsZTogT2JqZWN0LmNyZWF0ZShudWxsKSBvciB7IHZhbHVlT2Y6IDcgfS5cbiAgICAgICAgcmV0dXJuIE51bWJlcihvYmplY3QudmFsdWVPZigpKTtcbiAgICAgIH1cbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFN0cmluZyhvYmplY3QpO1xuXG4gICAgY2FzZSBcIkRhdGVcIjpcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjb252ZXJ0KG9iamVjdCwgXCJNb21lbnRcIikudG9EYXRlKCk7XG4gICAgICB9XG4gICAgICBjYXRjaChlKXtcbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgXCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSBcIiArIGdldFR5cGUob2JqZWN0KSArIFwiIHRvIHR5cGUgXCIgKyB0eXBlXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICBjYXNlIFwiTW9tZW50XCI6XG4gICAgICBpZiAoaXNOdW1iZXIob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbW9tZW50JDMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiBtb21lbnQkMyhvYmplY3QudmFsdWVPZigpKTtcbiAgICAgIH0gZWxzZSBpZiAobW9tZW50JDMuaXNNb21lbnQob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gbW9tZW50JDMob2JqZWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1N0cmluZyhvYmplY3QpKSB7XG4gICAgICAgIG1hdGNoID0gQVNQRGF0ZVJlZ2V4LmV4ZWMob2JqZWN0KTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgLy8gb2JqZWN0IGlzIGFuIEFTUCBkYXRlXG4gICAgICAgICAgcmV0dXJuIG1vbWVudCQzKE51bWJlcihtYXRjaFsxXSkpOyAvLyBwYXJzZSBudW1iZXJcbiAgICAgICAgfSBcbiAgICAgICAgbWF0Y2ggPSBOdW1lcmljUmVnZXguZXhlYyhvYmplY3QpO1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBtb21lbnQkMyhOdW1iZXIob2JqZWN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBtb21lbnQkMyhvYmplY3QpOyAvLyBwYXJzZSBzdHJpbmdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJDYW5ub3QgY29udmVydCBvYmplY3Qgb2YgdHlwZSBcIiArIGdldFR5cGUob2JqZWN0KSArIFwiIHRvIHR5cGUgXCIgKyB0eXBlXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiSVNPRGF0ZVwiOlxuICAgICAgaWYgKGlzTnVtYmVyKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG9iamVjdCk7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdC50b0lTT1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChtb21lbnQkMy5pc01vbWVudChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QudG9EYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcob2JqZWN0KSkge1xuICAgICAgICBtYXRjaCA9IEFTUERhdGVSZWdleC5leGVjKG9iamVjdCk7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIC8vIG9iamVjdCBpcyBhbiBBU1AgZGF0ZVxuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShOdW1iZXIobWF0Y2hbMV0pKS50b0lTT1N0cmluZygpOyAvLyBwYXJzZSBudW1iZXJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbW9tZW50JDMob2JqZWN0KS5mb3JtYXQoKTsgLy8gSVNPIDg2MDFcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgZ2V0VHlwZShvYmplY3QpICtcbiAgICAgICAgICAgIFwiIHRvIHR5cGUgSVNPRGF0ZVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiQVNQRGF0ZVwiOlxuICAgICAgaWYgKGlzTnVtYmVyKG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIFwiL0RhdGUoXCIgKyBvYmplY3QgKyBcIikvXCI7XG4gICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIERhdGUgfHwgbW9tZW50JDMuaXNNb21lbnQob2JqZWN0KSkge1xuICAgICAgICByZXR1cm4gXCIvRGF0ZShcIiArIG9iamVjdC52YWx1ZU9mKCkgKyBcIikvXCI7XG4gICAgICB9IGVsc2UgaWYgKGlzU3RyaW5nKG9iamVjdCkpIHtcbiAgICAgICAgbWF0Y2ggPSBBU1BEYXRlUmVnZXguZXhlYyhvYmplY3QpO1xuICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIC8vIG9iamVjdCBpcyBhbiBBU1AgZGF0ZVxuICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoTnVtYmVyKG1hdGNoWzFdKSkudmFsdWVPZigpOyAvLyBwYXJzZSBudW1iZXJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IG5ldyBEYXRlKG9iamVjdCkudmFsdWVPZigpOyAvLyBwYXJzZSBzdHJpbmdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXCIvRGF0ZShcIiArIHZhbHVlICsgXCIpL1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIgK1xuICAgICAgICAgICAgZ2V0VHlwZShvYmplY3QpICtcbiAgICAgICAgICAgIFwiIHRvIHR5cGUgQVNQRGF0ZVwiXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHR5cGUgJHt0eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgRGF0YSBTZXQgbGlrZSB3cmFwcGVyIHRvIHNlYW1sZXNzbHkgY29lcmNlIGRhdGEgdHlwZXMuXG4gKlxuICogQHBhcmFtIHJhd0RTIC0gVGhlIERhdGEgU2V0IHdpdGggcmF3IHVuY29lcmNlZCBkYXRhLlxuICogQHBhcmFtIHR5cGUgLSBBIHJlY29yZCBhc3NpZ25pbmcgYSBkYXRhIHR5cGUgdG8gcHJvcGVydHkgbmFtZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhlIHdyaXRlIG9wZXJhdGlvbnMgKGBhZGRgLCBgcmVtb3ZlYCwgYHVwZGF0ZWAgYW5kIGB1cGRhdGVPbmx5YCkgd3JpdGUgaW50b1xuICogdGhlIHJhdyAodW5jb2VyY2VkKSBkYXRhIHNldC4gVGhlc2UgdmFsdWVzIGFyZSB0aGVuIHBpY2tlZCB1cCBieSBhIHBpcGVcbiAqIHdoaWNoIGNvZXJjZXMgdGhlIHZhbHVlcyB1c2luZyB0aGUgW1tjb252ZXJ0XV0gZnVuY3Rpb24gYW5kIGZlZWRzIHRoZW0gaW50b1xuICogdGhlIGNvZXJjZWQgZGF0YSBzZXQuIFdoZW4gcXVlcnlpbmcgKGBmb3JFYWNoYCwgYGdldGAsIGBnZXRJZHNgLCBgb2ZmYCBhbmRcbiAqIGBvbmApIHRoZSB2YWx1ZXMgYXJlIHRoZW4gZmV0Y2hlZCBmcm9tIHRoZSBjb2VyY2VkIGRhdGEgc2V0IGFuZCBhbHJlYWR5IGhhdmVcbiAqIHRoZSByZXF1aXJlZCBkYXRhIHR5cGVzLiBUaGUgdmFsdWVzIGFyZSBjb2VyY2VkIG9ubHkgb25jZSB3aGVuIGluc2VydGVkIGFuZFxuICogdGhlbiB0aGUgc2FtZSB2YWx1ZSBpcyByZXR1cm5lZCBlYWNoIHRpbWUgdW50aWwgaXQgaXMgdXBkYXRlZCBvciBkZWxldGVkLlxuICpcbiAqIEZvciBleGFtcGxlOiBgdHlwZUNvZXJjZWREYXRhU2V0LmFkZCh7IGlkOiA3LCBzdGFydDogXCIyMDIwLTAxLTIxXCIgfSlgIHdvdWxkXG4gKiByZXN1bHQgaW4gYHR5cGVDb2VyY2VkRGF0YVNldC5nZXQoNylgIHJldHVybmluZyBgeyBpZDogNywgc3RhcnQ6IG1vbWVudChuZXdcbiAqIERhdGUoXCIyMDIwLTAxLTIxXCIpKS50b0RhdGUoKSB9YC5cbiAqXG4gKiBVc2UgdGhlIGRpc3Bvc2UgbWV0aG9kIHByaW9yIHRvIHRocm93aW5nIGEgcmVmZXJlbmNlIHRvIHRoaXMgYXdheS4gT3RoZXJ3aXNlXG4gKiB0aGUgcGlwZSBjb25uZWN0aW5nIHRoZSB0d28gRGF0YSBTZXRzIHdpbGwga2VlcCB0aGUgdW5hY2Nlc3NpYmxlIGNvZXJjZWRcbiAqIERhdGEgU2V0IGFsaXZlIGFuZCB1cGRhdGVkIGFzIGxvbmcgYXMgdGhlIHJhdyBEYXRhIFNldCBleGlzdHMuXG4gKlxuICogQHJldHVybnMgQSBEYXRhIFNldCBsaWtlIG9iamVjdCB0aGF0IHNhdmVzIGRhdGEgaW50byB0aGUgcmF3IERhdGEgU2V0IGFuZFxuICogcmV0cmlldmVzIHRoZW0gZnJvbSB0aGUgY29lcmNlZCBEYXRhIFNldC5cbiAqL1xuZnVuY3Rpb24gdHlwZUNvZXJjZURhdGFTZXQoXG4gIHJhd0RTLFxuICB0eXBlID0geyBzdGFydDogXCJEYXRlXCIsIGVuZDogXCJEYXRlXCIgfVxuKSB7XG4gIGNvbnN0IGlkUHJvcCA9IHJhd0RTLl9pZFByb3A7XG4gIGNvbnN0IGNvZXJjZWREUyA9IG5ldyBEYXRhU2V0KHsgZmllbGRJZDogaWRQcm9wIH0pO1xuXG4gIGNvbnN0IHBpcGUgPSBjcmVhdGVOZXdEYXRhUGlwZUZyb20ocmF3RFMpXG4gICAgLm1hcChpdGVtID0+XG4gICAgICBPYmplY3Qua2V5cyhpdGVtKS5yZWR1Y2UoKGFjYywga2V5KSA9PiB7XG4gICAgICAgIGFjY1trZXldID0gY29udmVydChpdGVtW2tleV0sIHR5cGVba2V5XSk7XG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCB7fSlcbiAgICApXG4gICAgLnRvKGNvZXJjZWREUyk7XG5cbiAgcGlwZS5hbGwoKS5zdGFydCgpO1xuXG4gIHJldHVybiB7XG4gICAgLy8gV3JpdGUgb25seS5cbiAgICBhZGQ6ICguLi5hcmdzKSA9PiByYXdEUy5nZXREYXRhU2V0KCkuYWRkKC4uLmFyZ3MpLFxuICAgIHJlbW92ZTogKC4uLmFyZ3MpID0+IHJhd0RTLmdldERhdGFTZXQoKS5yZW1vdmUoLi4uYXJncyksXG4gICAgdXBkYXRlOiAoLi4uYXJncykgPT4gcmF3RFMuZ2V0RGF0YVNldCgpLnVwZGF0ZSguLi5hcmdzKSxcbiAgICB1cGRhdGVPbmx5OiAoLi4uYXJncykgPT4gcmF3RFMuZ2V0RGF0YVNldCgpLnVwZGF0ZU9ubHkoLi4uYXJncyksXG4gICAgY2xlYXIgOiAoLi4uYXJncykgPT4gcmF3RFMuZ2V0RGF0YVNldCgpLmNsZWFyKC4uLmFyZ3MpLFxuXG4gICAgLy8gUmVhZCBvbmx5LlxuICAgIGZvckVhY2g6IGNvZXJjZWREUy5mb3JFYWNoLmJpbmQoY29lcmNlZERTKSxcbiAgICBnZXQ6IGNvZXJjZWREUy5nZXQuYmluZChjb2VyY2VkRFMpLFxuICAgIGdldElkczogY29lcmNlZERTLmdldElkcy5iaW5kKGNvZXJjZWREUyksXG4gICAgb2ZmOiBjb2VyY2VkRFMub2ZmLmJpbmQoY29lcmNlZERTKSxcbiAgICBvbjogY29lcmNlZERTLm9uLmJpbmQoY29lcmNlZERTKSxcblxuICAgIGdldCBsZW5ndGgoKSB7XG4gICAgICByZXR1cm4gY29lcmNlZERTLmxlbmd0aDtcbiAgICB9LFxuXG4gICAgLy8gTm9uIHN0YW5kYXJkLlxuICAgIGlkUHJvcCxcbiAgICB0eXBlLFxuXG4gICAgcmF3RFMsXG4gICAgY29lcmNlZERTLFxuICAgIGRpc3Bvc2U6ICgpID0+IHBpcGUuc3RvcCgpXG4gIH07XG59XG5cbnZhciB1dGlsID0ge1xuICAuLi51dGlsJDEsXG4gIGNvbnZlcnQsXG4gIHhzc1xufTtcblxuLyoqIFByb3RvdHlwZSBmb3IgdmlzdWFsIGNvbXBvbmVudHMgKi9cbmNsYXNzIENvbXBvbmVudCB7XG4gIC8qKlxuICogQHBhcmFtIHt7ZG9tOiBPYmplY3QsIGRvbVByb3BzOiBPYmplY3QsIGVtaXR0ZXI6IEVtaXR0ZXIsIHJhbmdlOiBSYW5nZX19IFtib2R5XVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICovXG4gIGNvbnN0cnVjdG9yKGJvZHksIG9wdGlvbnMpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB0aGlzLm9wdGlvbnMgPSBudWxsO1xuICAgIHRoaXMucHJvcHMgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvcHRpb25zIGZvciB0aGUgY29tcG9uZW50LiBUaGUgbmV3IG9wdGlvbnMgd2lsbCBiZSBtZXJnZWQgaW50byB0aGVcbiAgICogY3VycmVudCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHV0aWwuZXh0ZW5kKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyByZXNpemVkXG4gICAqL1xuICByZWRyYXcoKSB7XG4gICAgLy8gc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb21wb25lbnRcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgY29tcG9uZW50LiBDbGVhbnVwIERPTSBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIC8vIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY29tcG9uZW50XG4gIH1cblxuICAvKipcbiAgICogVGVzdCB3aGV0aGVyIHRoZSBjb21wb25lbnQgaXMgcmVzaXplZCBzaW5jZSB0aGUgbGFzdCB0aW1lIF9pc1Jlc2l6ZWQoKSB3YXNcbiAgICogY2FsbGVkLlxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyByZXNpemVkXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9pc1Jlc2l6ZWQoKSB7XG4gICAgY29uc3QgcmVzaXplZCA9IChcbiAgICAgIHRoaXMucHJvcHMuX3ByZXZpb3VzV2lkdGggIT09IHRoaXMucHJvcHMud2lkdGggfHxcbiAgICAgIHRoaXMucHJvcHMuX3ByZXZpb3VzSGVpZ2h0ICE9PSB0aGlzLnByb3BzLmhlaWdodFxuICAgICk7XG5cbiAgICB0aGlzLnByb3BzLl9wcmV2aW91c1dpZHRoID0gdGhpcy5wcm9wcy53aWR0aDtcbiAgICB0aGlzLnByb3BzLl9wcmV2aW91c0hlaWdodCA9IHRoaXMucHJvcHMuaGVpZ2h0O1xuXG4gICAgcmV0dXJuIHJlc2l6ZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiB1c2VkIGluIENvcmUgdG8gY29udmVydCB0aGUgb3B0aW9ucyBpbnRvIGEgdm9sYXRpbGUgdmFyaWFibGVcbiAqIFxuICogQHBhcmFtIHtmdW5jdGlvbn0gbW9tZW50XG4gKiBAcGFyYW0ge09iamVjdH0gYm9keVxuICogQHBhcmFtIHtBcnJheSB8IE9iamVjdH0gaGlkZGVuRGF0ZXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRIaWRkZW5PcHRpb25zKG1vbWVudCwgYm9keSwgaGlkZGVuRGF0ZXMpIHtcbiAgaWYgKGhpZGRlbkRhdGVzICYmICFBcnJheS5pc0FycmF5KGhpZGRlbkRhdGVzKSkge1xuICAgIHJldHVybiBjb252ZXJ0SGlkZGVuT3B0aW9ucyhtb21lbnQsIGJvZHksIFtoaWRkZW5EYXRlc10pXG4gIH1cblxuICBib2R5LmhpZGRlbkRhdGVzID0gW107XG4gIGlmIChoaWRkZW5EYXRlcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGhpZGRlbkRhdGVzKSA9PSB0cnVlKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChoaWRkZW5EYXRlc1tpXS5yZXBlYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGRhdGVJdGVtID0ge307XG4gICAgICAgICAgZGF0ZUl0ZW0uc3RhcnQgPSBtb21lbnQoaGlkZGVuRGF0ZXNbaV0uc3RhcnQpLnRvRGF0ZSgpLnZhbHVlT2YoKTtcbiAgICAgICAgICBkYXRlSXRlbS5lbmQgPSBtb21lbnQoaGlkZGVuRGF0ZXNbaV0uZW5kKS50b0RhdGUoKS52YWx1ZU9mKCk7XG4gICAgICAgICAgYm9keS5oaWRkZW5EYXRlcy5wdXNoKGRhdGVJdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYm9keS5oaWRkZW5EYXRlcy5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCk7IC8vIHNvcnQgYnkgc3RhcnQgdGltZVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGNyZWF0ZSBuZXcgZW50cmVlcyBmb3IgdGhlIHJlcGVhdGluZyBoaWRkZW4gZGF0ZXNcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtb21lbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBib2R5XG4gKiBAcGFyYW0ge0FycmF5IHwgT2JqZWN0fSBoaWRkZW5EYXRlc1xuICogQHJldHVybnMge251bGx9XG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZUhpZGRlbkRhdGVzKG1vbWVudCwgYm9keSwgaGlkZGVuRGF0ZXMpIHtcbiAgaWYgKGhpZGRlbkRhdGVzICYmICFBcnJheS5pc0FycmF5KGhpZGRlbkRhdGVzKSkge1xuICAgIHJldHVybiB1cGRhdGVIaWRkZW5EYXRlcyhtb21lbnQsIGJvZHksIFtoaWRkZW5EYXRlc10pXG4gIH1cblxuICBpZiAoaGlkZGVuRGF0ZXMgJiYgYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIud2lkdGggIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnZlcnRIaWRkZW5PcHRpb25zKG1vbWVudCwgYm9keSwgaGlkZGVuRGF0ZXMpO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBtb21lbnQoYm9keS5yYW5nZS5zdGFydCk7XG4gICAgY29uc3QgZW5kID0gbW9tZW50KGJvZHkucmFuZ2UuZW5kKTtcblxuICAgIGNvbnN0IHRvdGFsUmFuZ2UgPSAoYm9keS5yYW5nZS5lbmQgLSBib2R5LnJhbmdlLnN0YXJ0KTtcbiAgICBjb25zdCBwaXhlbFRpbWUgPSB0b3RhbFJhbmdlIC8gYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIud2lkdGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlkZGVuRGF0ZXNbaV0ucmVwZWF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGhpZGRlbkRhdGVzW2ldLnN0YXJ0KTtcbiAgICAgICAgbGV0IGVuZERhdGUgPSBtb21lbnQoaGlkZGVuRGF0ZXNbaV0uZW5kKTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlLl9kID09IFwiSW52YWxpZCBEYXRlXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN1cHBsaWVkIHN0YXJ0IGRhdGUgaXMgbm90IHZhbGlkOiAke2hpZGRlbkRhdGVzW2ldLnN0YXJ0fWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbmREYXRlLl9kID09IFwiSW52YWxpZCBEYXRlXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN1cHBsaWVkIGVuZCBkYXRlIGlzIG5vdCB2YWxpZDogJHtoaWRkZW5EYXRlc1tpXS5lbmR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGVuZERhdGUgLSBzdGFydERhdGU7XG4gICAgICAgIGlmIChkdXJhdGlvbiA+PSA0ICogcGl4ZWxUaW1lKSB7XG5cbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICBjb25zdCBydW5VbnRpbCA9IGVuZC5jbG9uZSgpO1xuICAgICAgICAgIHN3aXRjaCAoaGlkZGVuRGF0ZXNbaV0ucmVwZWF0KSB7XG4gICAgICAgICAgICBjYXNlIFwiZGFpbHlcIjogLy8gY2FzZSBvZiB0aW1lXG4gICAgICAgICAgICAgIGlmIChzdGFydERhdGUuZGF5KCkgIT0gZW5kRGF0ZS5kYXkoKSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RhcnREYXRlLmRheU9mWWVhcihzdGFydC5kYXlPZlllYXIoKSk7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZS55ZWFyKHN0YXJ0LnllYXIoKSk7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZS5zdWJ0cmFjdCg3LCdkYXlzJyk7XG5cbiAgICAgICAgICAgICAgZW5kRGF0ZS5kYXlPZlllYXIoc3RhcnQuZGF5T2ZZZWFyKCkpO1xuICAgICAgICAgICAgICBlbmREYXRlLnllYXIoc3RhcnQueWVhcigpKTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS5zdWJ0cmFjdCg3IC0gb2Zmc2V0LCdkYXlzJyk7XG5cbiAgICAgICAgICAgICAgcnVuVW50aWwuYWRkKDEsICd3ZWVrcycpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJ3ZWVrbHlcIjoge1xuICAgICAgICAgICAgICBjb25zdCBkYXlPZmZzZXQgPSBlbmREYXRlLmRpZmYoc3RhcnREYXRlLCdkYXlzJyk7XG4gICAgICAgICAgICAgIGNvbnN0IGRheSA9IHN0YXJ0RGF0ZS5kYXkoKTtcblxuICAgICAgICAgICAgICAvLyBzZXQgdGhlIHN0YXJ0IGRhdGUgdG8gdGhlIHJhbmdlLnN0YXJ0XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZS5kYXRlKHN0YXJ0LmRhdGUoKSk7XG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZS5tb250aChzdGFydC5tb250aCgpKTtcbiAgICAgICAgICAgICAgc3RhcnREYXRlLnllYXIoc3RhcnQueWVhcigpKTtcbiAgICAgICAgICAgICAgZW5kRGF0ZSA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgIC8vIGZvcmNlXG4gICAgICAgICAgICAgIHN0YXJ0RGF0ZS5kYXkoZGF5KTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS5kYXkoZGF5KTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS5hZGQoZGF5T2Zmc2V0LCdkYXlzJyk7XG5cbiAgICAgICAgICAgICAgc3RhcnREYXRlLnN1YnRyYWN0KDEsJ3dlZWtzJyk7XG4gICAgICAgICAgICAgIGVuZERhdGUuc3VidHJhY3QoMSwnd2Vla3MnKTtcblxuICAgICAgICAgICAgICBydW5VbnRpbC5hZGQoMSwgJ3dlZWtzJyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIm1vbnRobHlcIjpcbiAgICAgICAgICAgICAgaWYgKHN0YXJ0RGF0ZS5tb250aCgpICE9IGVuZERhdGUubW9udGgoKSkge1xuICAgICAgICAgICAgICAgIG9mZnNldCA9IDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RhcnREYXRlLm1vbnRoKHN0YXJ0Lm1vbnRoKCkpO1xuICAgICAgICAgICAgICBzdGFydERhdGUueWVhcihzdGFydC55ZWFyKCkpO1xuICAgICAgICAgICAgICBzdGFydERhdGUuc3VidHJhY3QoMSwnbW9udGhzJyk7XG5cbiAgICAgICAgICAgICAgZW5kRGF0ZS5tb250aChzdGFydC5tb250aCgpKTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS55ZWFyKHN0YXJ0LnllYXIoKSk7XG4gICAgICAgICAgICAgIGVuZERhdGUuc3VidHJhY3QoMSwnbW9udGhzJyk7XG4gICAgICAgICAgICAgIGVuZERhdGUuYWRkKG9mZnNldCwnbW9udGhzJyk7XG5cbiAgICAgICAgICAgICAgcnVuVW50aWwuYWRkKDEsICdtb250aHMnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwieWVhcmx5XCI6XG4gICAgICAgICAgICAgIGlmIChzdGFydERhdGUueWVhcigpICE9IGVuZERhdGUueWVhcigpKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGFydERhdGUueWVhcihzdGFydC55ZWFyKCkpO1xuICAgICAgICAgICAgICBzdGFydERhdGUuc3VidHJhY3QoMSwneWVhcnMnKTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS55ZWFyKHN0YXJ0LnllYXIoKSk7XG4gICAgICAgICAgICAgIGVuZERhdGUuc3VidHJhY3QoMSwneWVhcnMnKTtcbiAgICAgICAgICAgICAgZW5kRGF0ZS5hZGQob2Zmc2V0LCd5ZWFycycpO1xuXG4gICAgICAgICAgICAgIHJ1blVudGlsLmFkZCgxLCAneWVhcnMnKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIldyb25nIHJlcGVhdCBmb3JtYXQsIGFsbG93ZWQgYXJlOiBkYWlseSwgd2Vla2x5LCBtb250aGx5LCB5ZWFybHkuIEdpdmVuOlwiLCBoaWRkZW5EYXRlc1tpXS5yZXBlYXQpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChzdGFydERhdGUgPCBydW5VbnRpbCkge1xuICAgICAgICAgICAgYm9keS5oaWRkZW5EYXRlcy5wdXNoKHtzdGFydDogc3RhcnREYXRlLnZhbHVlT2YoKSwgZW5kOiBlbmREYXRlLnZhbHVlT2YoKX0pO1xuICAgICAgICAgICAgc3dpdGNoIChoaWRkZW5EYXRlc1tpXS5yZXBlYXQpIHtcbiAgICAgICAgICAgICAgY2FzZSBcImRhaWx5XCI6XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlLmFkZCgxLCAnZGF5cycpO1xuICAgICAgICAgICAgICAgIGVuZERhdGUuYWRkKDEsICdkYXlzJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgXCJ3ZWVrbHlcIjpcbiAgICAgICAgICAgICAgICBzdGFydERhdGUuYWRkKDEsICd3ZWVrcycpO1xuICAgICAgICAgICAgICAgIGVuZERhdGUuYWRkKDEsICd3ZWVrcycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIFwibW9udGhseVwiOlxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZS5hZGQoMSwgJ21vbnRocycpO1xuICAgICAgICAgICAgICAgIGVuZERhdGUuYWRkKDEsICdtb250aHMnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBcInllYXJseVwiOlxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZS5hZGQoMSwgJ3knKTtcbiAgICAgICAgICAgICAgICBlbmREYXRlLmFkZCgxLCAneScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiV3JvbmcgcmVwZWF0IGZvcm1hdCwgYWxsb3dlZCBhcmU6IGRhaWx5LCB3ZWVrbHksIG1vbnRobHksIHllYXJseS4gR2l2ZW46XCIsIGhpZGRlbkRhdGVzW2ldLnJlcGVhdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBib2R5LmhpZGRlbkRhdGVzLnB1c2goe3N0YXJ0OiBzdGFydERhdGUudmFsdWVPZigpLCBlbmQ6IGVuZERhdGUudmFsdWVPZigpfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gcmVtb3ZlIGR1cGxpY2F0ZXMsIG1lcmdlIHdoZXJlIHBvc3NpYmxlXG4gICAgcmVtb3ZlRHVwbGljYXRlcyhib2R5KTtcbiAgICAvLyBlbnN1cmUgdGhlIG5ldyBwb3NpdGlvbnMgYXJlIG5vdCBvbiBoaWRkZW4gZGF0ZXNcbiAgICBjb25zdCBzdGFydEhpZGRlbiA9IGdldElzSGlkZGVuKGJvZHkucmFuZ2Uuc3RhcnQsIGJvZHkuaGlkZGVuRGF0ZXMpO1xuICAgIGNvbnN0IGVuZEhpZGRlbiA9IGdldElzSGlkZGVuKGJvZHkucmFuZ2UuZW5kLGJvZHkuaGlkZGVuRGF0ZXMpO1xuICAgIGxldCByYW5nZVN0YXJ0ID0gYm9keS5yYW5nZS5zdGFydDtcbiAgICBsZXQgcmFuZ2VFbmQgPSBib2R5LnJhbmdlLmVuZDtcbiAgICBpZiAoc3RhcnRIaWRkZW4uaGlkZGVuID09IHRydWUpIHtyYW5nZVN0YXJ0ID0gYm9keS5yYW5nZS5zdGFydFRvRnJvbnQgPT0gdHJ1ZSA/IHN0YXJ0SGlkZGVuLnN0YXJ0RGF0ZSAtIDEgOiBzdGFydEhpZGRlbi5lbmREYXRlICsgMTt9XG4gICAgaWYgKGVuZEhpZGRlbi5oaWRkZW4gPT0gdHJ1ZSkgICB7cmFuZ2VFbmQgICA9IGJvZHkucmFuZ2UuZW5kVG9Gcm9udCA9PSB0cnVlID8gICBlbmRIaWRkZW4uc3RhcnREYXRlIC0gMSAgIDogZW5kSGlkZGVuLmVuZERhdGUgKyAxO31cbiAgICBpZiAoc3RhcnRIaWRkZW4uaGlkZGVuID09IHRydWUgfHwgZW5kSGlkZGVuLmhpZGRlbiA9PSB0cnVlKSB7XG4gICAgICBib2R5LnJhbmdlLl9hcHBseVJhbmdlKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTtcbiAgICB9XG4gIH1cblxufVxuXG4vKipcbiAqIHJlbW92ZSBkdXBsaWNhdGVzIGZyb20gdGhlIGhpZGRlbiBkYXRlcyBsaXN0LiBEdXBsaWNhdGVzIGFyZSBldmlsLiBUaGV5IG1lc3MgZXZlcnl0aGluZyB1cC5cbiAqIFNjYWxlcyB3aXRoIE5eMlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBib2R5XG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXMoYm9keSkge1xuICBjb25zdCBoaWRkZW5EYXRlcyA9IGJvZHkuaGlkZGVuRGF0ZXM7XG4gIGNvbnN0IHNhZmVEYXRlcyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBoaWRkZW5EYXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgaWYgKGkgIT0gaiAmJiBoaWRkZW5EYXRlc1tqXS5yZW1vdmUgIT0gdHJ1ZSAmJiBoaWRkZW5EYXRlc1tpXS5yZW1vdmUgIT0gdHJ1ZSkge1xuICAgICAgICAvLyBqIGluc2lkZSBpXG4gICAgICAgIGlmIChoaWRkZW5EYXRlc1tqXS5zdGFydCA+PSBoaWRkZW5EYXRlc1tpXS5zdGFydCAmJiBoaWRkZW5EYXRlc1tqXS5lbmQgPD0gaGlkZGVuRGF0ZXNbaV0uZW5kKSB7XG4gICAgICAgICAgaGlkZGVuRGF0ZXNbal0ucmVtb3ZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBqIHN0YXJ0IGluc2lkZSBpXG4gICAgICAgIGVsc2UgaWYgKGhpZGRlbkRhdGVzW2pdLnN0YXJ0ID49IGhpZGRlbkRhdGVzW2ldLnN0YXJ0ICYmIGhpZGRlbkRhdGVzW2pdLnN0YXJ0IDw9IGhpZGRlbkRhdGVzW2ldLmVuZCkge1xuICAgICAgICAgIGhpZGRlbkRhdGVzW2ldLmVuZCA9IGhpZGRlbkRhdGVzW2pdLmVuZDtcbiAgICAgICAgICBoaWRkZW5EYXRlc1tqXS5yZW1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGogZW5kIGluc2lkZSBpXG4gICAgICAgIGVsc2UgaWYgKGhpZGRlbkRhdGVzW2pdLmVuZCA+PSBoaWRkZW5EYXRlc1tpXS5zdGFydCAmJiBoaWRkZW5EYXRlc1tqXS5lbmQgPD0gaGlkZGVuRGF0ZXNbaV0uZW5kKSB7XG4gICAgICAgICAgaGlkZGVuRGF0ZXNbaV0uc3RhcnQgPSBoaWRkZW5EYXRlc1tqXS5zdGFydDtcbiAgICAgICAgICBoaWRkZW5EYXRlc1tqXS5yZW1vdmUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGhpZGRlbkRhdGVzW2ldLnJlbW92ZSAhPT0gdHJ1ZSkge1xuICAgICAgc2FmZURhdGVzLnB1c2goaGlkZGVuRGF0ZXNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIGJvZHkuaGlkZGVuRGF0ZXMgPSBzYWZlRGF0ZXM7XG4gIGJvZHkuaGlkZGVuRGF0ZXMuc29ydCgoYSwgYikgPT4gYS5zdGFydCAtIGIuc3RhcnQpOyAvLyBzb3J0IGJ5IHN0YXJ0IHRpbWVcbn1cblxuLyoqXG4gKiBQcmludHMgZGF0ZXMgdG8gY29uc29sZVxuICogQHBhcmFtIHthcnJheX0gZGF0ZXNcbiAqL1xuZnVuY3Rpb24gcHJpbnREYXRlcyhkYXRlcykge1xuICBmb3IgKGxldCBpID0wOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zb2xlLmxvZyhpLCBuZXcgRGF0ZShkYXRlc1tpXS5zdGFydCksbmV3IERhdGUoZGF0ZXNbaV0uZW5kKSwgZGF0ZXNbaV0uc3RhcnQsIGRhdGVzW2ldLmVuZCwgZGF0ZXNbaV0ucmVtb3ZlKTtcbiAgfVxufVxuXG4vKipcbiAqIFVzZWQgaW4gVGltZVN0ZXAgdG8gYXZvaWQgdGhlIGhpZGRlbiB0aW1lcy5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG1vbWVudFxuICogQHBhcmFtIHtUaW1lU3RlcH0gdGltZVN0ZXBcbiAqIEBwYXJhbSB7RGF0ZX0gcHJldmlvdXNUaW1lXG4gKi9cbmZ1bmN0aW9uIHN0ZXBPdmVySGlkZGVuRGF0ZXMobW9tZW50LCB0aW1lU3RlcCwgcHJldmlvdXNUaW1lKSB7XG4gIGxldCBzdGVwSW5IaWRkZW4gPSBmYWxzZTtcbiAgY29uc3QgY3VycmVudFZhbHVlID0gdGltZVN0ZXAuY3VycmVudC52YWx1ZU9mKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGltZVN0ZXAuaGlkZGVuRGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGFydERhdGUgPSB0aW1lU3RlcC5oaWRkZW5EYXRlc1tpXS5zdGFydDtcbiAgICB2YXIgZW5kRGF0ZSA9IHRpbWVTdGVwLmhpZGRlbkRhdGVzW2ldLmVuZDtcbiAgICBpZiAoY3VycmVudFZhbHVlID49IHN0YXJ0RGF0ZSAmJiBjdXJyZW50VmFsdWUgPCBlbmREYXRlKSB7XG4gICAgICBzdGVwSW5IaWRkZW4gPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0ZXBJbkhpZGRlbiA9PSB0cnVlICYmIGN1cnJlbnRWYWx1ZSA8IHRpbWVTdGVwLl9lbmQudmFsdWVPZigpICYmIGN1cnJlbnRWYWx1ZSAhPSBwcmV2aW91c1RpbWUpIHtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBtb21lbnQocHJldmlvdXNUaW1lKTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IG1vbWVudChlbmREYXRlKTtcbiAgICAvL2NoZWNrIGlmIHRoZSBuZXh0IHN0ZXAgc2hvdWxkIGJlIG1ham9yXG4gICAgaWYgKHByZXZWYWx1ZS55ZWFyKCkgIT0gbmV3VmFsdWUueWVhcigpKSB7dGltZVN0ZXAuc3dpdGNoZWRZZWFyID0gdHJ1ZTt9XG4gICAgZWxzZSBpZiAocHJldlZhbHVlLm1vbnRoKCkgIT0gbmV3VmFsdWUubW9udGgoKSkge3RpbWVTdGVwLnN3aXRjaGVkTW9udGggPSB0cnVlO31cbiAgICBlbHNlIGlmIChwcmV2VmFsdWUuZGF5T2ZZZWFyKCkgIT0gbmV3VmFsdWUuZGF5T2ZZZWFyKCkpIHt0aW1lU3RlcC5zd2l0Y2hlZERheSA9IHRydWU7fVxuXG4gICAgdGltZVN0ZXAuY3VycmVudCA9IG5ld1ZhbHVlO1xuICB9XG59XG5cbi8vLyoqXG4vLyAqIFVzZWQgaW4gVGltZVN0ZXAgdG8gYXZvaWQgdGhlIGhpZGRlbiB0aW1lcy5cbi8vICogQHBhcmFtIHRpbWVTdGVwXG4vLyAqIEBwYXJhbSBwcmV2aW91c1RpbWVcbi8vICovXG4vL2NoZWNrRmlyc3RTdGVwID0gZnVuY3Rpb24odGltZVN0ZXApIHtcbi8vICB2YXIgc3RlcEluSGlkZGVuID0gZmFsc2U7XG4vLyAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRpbWVTdGVwLmN1cnJlbnQudmFsdWVPZigpO1xuLy8gIGZvciAodmFyIGkgPSAwOyBpIDwgdGltZVN0ZXAuaGlkZGVuRGF0ZXMubGVuZ3RoOyBpKyspIHtcbi8vICAgIHZhciBzdGFydERhdGUgPSB0aW1lU3RlcC5oaWRkZW5EYXRlc1tpXS5zdGFydDtcbi8vICAgIHZhciBlbmREYXRlID0gdGltZVN0ZXAuaGlkZGVuRGF0ZXNbaV0uZW5kO1xuLy8gICAgaWYgKGN1cnJlbnRWYWx1ZSA+PSBzdGFydERhdGUgJiYgY3VycmVudFZhbHVlIDwgZW5kRGF0ZSkge1xuLy8gICAgICBzdGVwSW5IaWRkZW4gPSB0cnVlO1xuLy8gICAgICBicmVhaztcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIGlmIChzdGVwSW5IaWRkZW4gPT0gdHJ1ZSAmJiBjdXJyZW50VmFsdWUgPD0gdGltZVN0ZXAuX2VuZC52YWx1ZU9mKCkpIHtcbi8vICAgIHZhciBuZXdWYWx1ZSA9IG1vbWVudChlbmREYXRlKTtcbi8vICAgIHRpbWVTdGVwLmN1cnJlbnQgPSBuZXdWYWx1ZS50b0RhdGUoKTtcbi8vICB9XG4vL307XG5cbi8qKlxuICogcmVwbGFjZXMgdGhlIENvcmUgdG9TY3JlZW4gbWV0aG9kc1xuICpcbiAqIEBwYXJhbSB7dGltZWxpbmUuQ29yZX0gQ29yZVxuICogQHBhcmFtIHtEYXRlfSB0aW1lXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHRvU2NyZWVuKENvcmUsIHRpbWUsIHdpZHRoKSB7XG4gIGxldCBjb252ZXJzaW9uO1xuICBpZiAoQ29yZS5ib2R5LmhpZGRlbkRhdGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICBjb252ZXJzaW9uID0gQ29yZS5yYW5nZS5jb252ZXJzaW9uKHdpZHRoKTtcbiAgICAgIHJldHVybiAodGltZS52YWx1ZU9mKCkgLSBjb252ZXJzaW9uLm9mZnNldCkgKiBjb252ZXJzaW9uLnNjYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoaWRkZW4gPSBnZXRJc0hpZGRlbih0aW1lLCBDb3JlLmJvZHkuaGlkZGVuRGF0ZXMpO1xuICAgICAgaWYgKGhpZGRlbi5oaWRkZW4gPT0gdHJ1ZSkge1xuICAgICAgICB0aW1lID0gaGlkZGVuLnN0YXJ0RGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHVyYXRpb24gPSBnZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4oQ29yZS5ib2R5LmhpZGRlbkRhdGVzLCBDb3JlLnJhbmdlLnN0YXJ0LCBDb3JlLnJhbmdlLmVuZCk7XG4gICAgICBpZiAodGltZSA8IENvcmUucmFuZ2Uuc3RhcnQpIHtcbiAgICAgICAgY29udmVyc2lvbiA9IENvcmUucmFuZ2UuY29udmVyc2lvbih3aWR0aCwgZHVyYXRpb24pO1xuICAgICAgICBjb25zdCBoaWRkZW5CZWZvcmVTdGFydCA9IGdldEhpZGRlbkR1cmF0aW9uQmVmb3JlU3RhcnQoQ29yZS5ib2R5LmhpZGRlbkRhdGVzLCB0aW1lLCBjb252ZXJzaW9uLm9mZnNldCk7XG4gICAgICAgIHRpbWUgPSBDb3JlLm9wdGlvbnMubW9tZW50KHRpbWUpLnRvRGF0ZSgpLnZhbHVlT2YoKTtcbiAgICAgICAgdGltZSA9IHRpbWUgKyBoaWRkZW5CZWZvcmVTdGFydDtcbiAgICAgICAgcmV0dXJuIC0oY29udmVyc2lvbi5vZmZzZXQgLSB0aW1lLnZhbHVlT2YoKSkgKiBjb252ZXJzaW9uLnNjYWxlO1xuICAgICAgICBcbiAgICAgIH0gZWxzZSBpZiAodGltZSA+IENvcmUucmFuZ2UuZW5kKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlQWZ0ZXJFbmQgPSB7c3RhcnQ6IENvcmUucmFuZ2Uuc3RhcnQsIGVuZDogdGltZX07XG4gICAgICAgIHRpbWUgPSBjb3JyZWN0VGltZUZvckhpZGRlbihDb3JlLm9wdGlvbnMubW9tZW50LCBDb3JlLmJvZHkuaGlkZGVuRGF0ZXMsIHJhbmdlQWZ0ZXJFbmQsIHRpbWUpO1xuICAgICAgICBjb252ZXJzaW9uID0gQ29yZS5yYW5nZS5jb252ZXJzaW9uKHdpZHRoLCBkdXJhdGlvbik7XG4gICAgICAgIHJldHVybiAodGltZS52YWx1ZU9mKCkgLSBjb252ZXJzaW9uLm9mZnNldCkgKiBjb252ZXJzaW9uLnNjYWxlO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aW1lID0gY29ycmVjdFRpbWVGb3JIaWRkZW4oQ29yZS5vcHRpb25zLm1vbWVudCwgQ29yZS5ib2R5LmhpZGRlbkRhdGVzLCBDb3JlLnJhbmdlLCB0aW1lKTtcbiAgICAgICAgY29udmVyc2lvbiA9IENvcmUucmFuZ2UuY29udmVyc2lvbih3aWR0aCwgZHVyYXRpb24pO1xuICAgICAgICByZXR1cm4gKHRpbWUudmFsdWVPZigpIC0gY29udmVyc2lvbi5vZmZzZXQpICogY29udmVyc2lvbi5zY2FsZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuLyoqXG4gKiBSZXBsYWNlcyB0aGUgY29yZSB0b1RpbWUgbWV0aG9kc1xuICpcbiAqIEBwYXJhbSB7dGltZWxpbmUuQ29yZX0gQ29yZVxuICogQHBhcmFtIHtudW1iZXJ9IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICogQHJldHVybnMge0RhdGV9XG4gKi9cbmZ1bmN0aW9uIHRvVGltZShDb3JlLCB4LCB3aWR0aCkge1xuICBpZiAoQ29yZS5ib2R5LmhpZGRlbkRhdGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgY29uc3QgY29udmVyc2lvbiA9IENvcmUucmFuZ2UuY29udmVyc2lvbih3aWR0aCk7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHggLyBjb252ZXJzaW9uLnNjYWxlICsgY29udmVyc2lvbi5vZmZzZXQpO1xuICB9XG4gIGVsc2Uge1xuICAgIGNvbnN0IGhpZGRlbkR1cmF0aW9uID0gZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuKENvcmUuYm9keS5oaWRkZW5EYXRlcywgQ29yZS5yYW5nZS5zdGFydCwgQ29yZS5yYW5nZS5lbmQpO1xuICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSBDb3JlLnJhbmdlLmVuZCAtIENvcmUucmFuZ2Uuc3RhcnQgLSBoaWRkZW5EdXJhdGlvbjtcbiAgICBjb25zdCBwYXJ0aWFsRHVyYXRpb24gPSB0b3RhbER1cmF0aW9uICogeCAvIHdpZHRoO1xuICAgIGNvbnN0IGFjY3VtdWxhdGVkSGlkZGVuRHVyYXRpb24gPSBnZXRBY2N1bXVsYXRlZEhpZGRlbkR1cmF0aW9uKENvcmUuYm9keS5oaWRkZW5EYXRlcywgQ29yZS5yYW5nZSwgcGFydGlhbER1cmF0aW9uKTtcblxuICAgIHJldHVybiBuZXcgRGF0ZShhY2N1bXVsYXRlZEhpZGRlbkR1cmF0aW9uICsgcGFydGlhbER1cmF0aW9uICsgQ29yZS5yYW5nZS5zdGFydCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTdXBwb3J0IGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtBcnJheS48e3N0YXJ0OiBXaW5kb3cuc3RhcnQsIGVuZDogKn0+fSBoaWRkZW5EYXRlc1xuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBnZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4oaGlkZGVuRGF0ZXMsIHN0YXJ0LCBlbmQpIHtcbiAgbGV0IGR1cmF0aW9uID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaWRkZW5EYXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGhpZGRlbkRhdGVzW2ldLnN0YXJ0O1xuICAgIGNvbnN0IGVuZERhdGUgPSBoaWRkZW5EYXRlc1tpXS5lbmQ7XG4gICAgLy8gaWYgdGltZSBhZnRlciB0aGUgY3V0b3V0LCBhbmQgdGhlXG4gICAgaWYgKHN0YXJ0RGF0ZSA+PSBzdGFydCAmJiBlbmREYXRlIDwgZW5kKSB7XG4gICAgICBkdXJhdGlvbiArPSBlbmREYXRlIC0gc3RhcnREYXRlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZHVyYXRpb247XG59XG5cbi8qKlxuICogU3VwcG9ydCBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPHtzdGFydDogV2luZG93LnN0YXJ0LCBlbmQ6ICp9Pn0gaGlkZGVuRGF0ZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmVTdGFydChoaWRkZW5EYXRlcywgc3RhcnQsIGVuZCkge1xuICBsZXQgZHVyYXRpb24gPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gaGlkZGVuRGF0ZXNbaV0uc3RhcnQ7XG4gICAgY29uc3QgZW5kRGF0ZSA9IGhpZGRlbkRhdGVzW2ldLmVuZDtcblxuICAgIGlmIChzdGFydERhdGUgPj0gc3RhcnQgJiYgZW5kRGF0ZSA8PSBlbmQpIHtcbiAgICAgIGR1cmF0aW9uICs9IGVuZERhdGUgLSBzdGFydERhdGU7XG4gICAgfVxuICB9XG4gIHJldHVybiBkdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IGZ1bmN0aW9uXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBtb21lbnRcbiAqIEBwYXJhbSB7QXJyYXkuPHtzdGFydDogV2luZG93LnN0YXJ0LCBlbmQ6ICp9Pn0gaGlkZGVuRGF0ZXNcbiAqIEBwYXJhbSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gcmFuZ2VcbiAqIEBwYXJhbSB7RGF0ZX0gdGltZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY29ycmVjdFRpbWVGb3JIaWRkZW4obW9tZW50LCBoaWRkZW5EYXRlcywgcmFuZ2UsIHRpbWUpIHtcbiAgdGltZSA9IG1vbWVudCh0aW1lKS50b0RhdGUoKS52YWx1ZU9mKCk7XG4gIHRpbWUgLT0gZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUobW9tZW50LCBoaWRkZW5EYXRlcyxyYW5nZSx0aW1lKTtcbiAgcmV0dXJuIHRpbWU7XG59XG5cbi8qKlxuICogU3VwcG9ydCBmdW5jdGlvblxuICogQHBhcmFtIHtmdW5jdGlvbn0gbW9tZW50XG4gKiBAcGFyYW0ge0FycmF5Ljx7c3RhcnQ6IFdpbmRvdy5zdGFydCwgZW5kOiAqfT59IGhpZGRlbkRhdGVzXG4gKiBAcGFyYW0ge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IHJhbmdlXG4gKiBAcGFyYW0ge0RhdGV9IHRpbWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKG1vbWVudCwgaGlkZGVuRGF0ZXMsIHJhbmdlLCB0aW1lKSB7XG4gIGxldCB0aW1lT2Zmc2V0ID0gMDtcbiAgdGltZSA9IG1vbWVudCh0aW1lKS50b0RhdGUoKS52YWx1ZU9mKCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaWRkZW5EYXRlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGhpZGRlbkRhdGVzW2ldLnN0YXJ0O1xuICAgIGNvbnN0IGVuZERhdGUgPSBoaWRkZW5EYXRlc1tpXS5lbmQ7XG4gICAgLy8gaWYgdGltZSBhZnRlciB0aGUgY3V0b3V0LCBhbmQgdGhlXG4gICAgaWYgKHN0YXJ0RGF0ZSA+PSByYW5nZS5zdGFydCAmJiBlbmREYXRlIDwgcmFuZ2UuZW5kKSB7XG4gICAgICBpZiAodGltZSA+PSBlbmREYXRlKSB7XG4gICAgICAgIHRpbWVPZmZzZXQgKz0gKGVuZERhdGUgLSBzdGFydERhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGltZU9mZnNldDtcbn1cblxuLyoqXG4gKiBzdW0gdGhlIGR1cmF0aW9uIGZyb20gc3RhcnQgdG8gZmluaXNoLCBpbmNsdWRpbmcgdGhlIGhpZGRlbiBkdXJhdGlvbixcbiAqIHVudGlsIHRoZSByZXF1aXJlZCBhbW91bnQgaGFzIGJlZW4gcmVhY2hlZCwgcmV0dXJuIHRoZSBhY2N1bXVsYXRlZCBoaWRkZW4gZHVyYXRpb25cbiAqIEBwYXJhbSB7QXJyYXkuPHtzdGFydDogV2luZG93LnN0YXJ0LCBlbmQ6ICp9Pn0gaGlkZGVuRGF0ZXNcbiAqIEBwYXJhbSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gcmFuZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcmVxdWlyZWREdXJhdGlvbj0wXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbihoaWRkZW5EYXRlcywgcmFuZ2UsIHJlcXVpcmVkRHVyYXRpb24pIHtcbiAgbGV0IGhpZGRlbkR1cmF0aW9uID0gMDtcbiAgbGV0IGR1cmF0aW9uID0gMDtcbiAgbGV0IHByZXZpb3VzUG9pbnQgPSByYW5nZS5zdGFydDtcbiAgLy9wcmludERhdGVzKGhpZGRlbkRhdGVzKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RhcnREYXRlID0gaGlkZGVuRGF0ZXNbaV0uc3RhcnQ7XG4gICAgY29uc3QgZW5kRGF0ZSA9IGhpZGRlbkRhdGVzW2ldLmVuZDtcbiAgICAvLyBpZiB0aW1lIGFmdGVyIHRoZSBjdXRvdXQsIGFuZCB0aGVcbiAgICBpZiAoc3RhcnREYXRlID49IHJhbmdlLnN0YXJ0ICYmIGVuZERhdGUgPCByYW5nZS5lbmQpIHtcbiAgICAgIGR1cmF0aW9uICs9IHN0YXJ0RGF0ZSAtIHByZXZpb3VzUG9pbnQ7XG4gICAgICBwcmV2aW91c1BvaW50ID0gZW5kRGF0ZTtcbiAgICAgIGlmIChkdXJhdGlvbiA+PSByZXF1aXJlZER1cmF0aW9uKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGhpZGRlbkR1cmF0aW9uICs9IGVuZERhdGUgLSBzdGFydERhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhpZGRlbkR1cmF0aW9uO1xufVxuXG4vKipcbiAqIHVzZWQgdG8gc3RlcCBvdmVyIHRvIGVpdGhlciBzaWRlIG9mIGEgaGlkZGVuIGJsb2NrLiBDb3JyZWN0aW9uIGlzIGRpc2FibGVkIG9uIHRhYmxldHMsIG1pZ2h0IGJlIHNldCB0byB0cnVlXG4gKiBAcGFyYW0ge0FycmF5Ljx7c3RhcnQ6IFdpbmRvdy5zdGFydCwgZW5kOiAqfT59IGhpZGRlbkRhdGVzXG4gKiBAcGFyYW0ge0RhdGV9IHRpbWVcbiAqIEBwYXJhbSB7bnVtYmVyfSBkaXJlY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gY29ycmVjdGlvbkVuYWJsZWRcbiAqIEByZXR1cm5zIHtEYXRlfG51bWJlcn1cbiAqL1xuZnVuY3Rpb24gc25hcEF3YXlGcm9tSGlkZGVuKGhpZGRlbkRhdGVzLCB0aW1lLCBkaXJlY3Rpb24sIGNvcnJlY3Rpb25FbmFibGVkKSB7XG4gIGNvbnN0IGlzSGlkZGVuID0gZ2V0SXNIaWRkZW4odGltZSwgaGlkZGVuRGF0ZXMpO1xuICBpZiAoaXNIaWRkZW4uaGlkZGVuID09IHRydWUpIHtcbiAgICBpZiAoZGlyZWN0aW9uIDwgMCkge1xuICAgICAgaWYgKGNvcnJlY3Rpb25FbmFibGVkID09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGlzSGlkZGVuLnN0YXJ0RGF0ZSAtIChpc0hpZGRlbi5lbmREYXRlIC0gdGltZSkgLSAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBpc0hpZGRlbi5zdGFydERhdGUgLSAxO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjb3JyZWN0aW9uRW5hYmxlZCA9PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBpc0hpZGRlbi5lbmREYXRlICsgKHRpbWUgLSBpc0hpZGRlbi5zdGFydERhdGUpICsgMTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNIaWRkZW4uZW5kRGF0ZSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiB0aW1lO1xuICB9XG5cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRpbWUgaXMgaGlkZGVuXG4gKlxuICogQHBhcmFtIHtEYXRlfSB0aW1lXG4gKiBAcGFyYW0ge0FycmF5Ljx7c3RhcnQ6IFdpbmRvdy5zdGFydCwgZW5kOiAqfT59IGhpZGRlbkRhdGVzXG4gKiBAcmV0dXJucyB7e2hpZGRlbjogYm9vbGVhbiwgc3RhcnREYXRlOiBXaW5kb3cuc3RhcnQsIGVuZERhdGU6ICp9fVxuICovXG5mdW5jdGlvbiBnZXRJc0hpZGRlbih0aW1lLCBoaWRkZW5EYXRlcykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbkRhdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHN0YXJ0RGF0ZSA9IGhpZGRlbkRhdGVzW2ldLnN0YXJ0O1xuICAgIHZhciBlbmREYXRlID0gaGlkZGVuRGF0ZXNbaV0uZW5kO1xuXG4gICAgaWYgKHRpbWUgPj0gc3RhcnREYXRlICYmIHRpbWUgPCBlbmREYXRlKSB7IC8vIGlmIHRoZSBzdGFydCBpcyBlbnRlcmluZyBhIGhpZGRlbiB6b25lXG4gICAgICByZXR1cm4ge2hpZGRlbjogdHJ1ZSwgc3RhcnREYXRlLCBlbmREYXRlfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtoaWRkZW46IGZhbHNlLCBzdGFydERhdGUsIGVuZERhdGV9O1xufVxuXG52YXIgRGF0ZVV0aWwgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgY29udmVydEhpZGRlbk9wdGlvbnM6IGNvbnZlcnRIaWRkZW5PcHRpb25zLFxuICB1cGRhdGVIaWRkZW5EYXRlczogdXBkYXRlSGlkZGVuRGF0ZXMsXG4gIHJlbW92ZUR1cGxpY2F0ZXM6IHJlbW92ZUR1cGxpY2F0ZXMsXG4gIHByaW50RGF0ZXM6IHByaW50RGF0ZXMsXG4gIHN0ZXBPdmVySGlkZGVuRGF0ZXM6IHN0ZXBPdmVySGlkZGVuRGF0ZXMsXG4gIHRvU2NyZWVuOiB0b1NjcmVlbixcbiAgdG9UaW1lOiB0b1RpbWUsXG4gIGdldEhpZGRlbkR1cmF0aW9uQmV0d2VlbjogZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuLFxuICBnZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0OiBnZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0LFxuICBjb3JyZWN0VGltZUZvckhpZGRlbjogY29ycmVjdFRpbWVGb3JIaWRkZW4sXG4gIGdldEhpZGRlbkR1cmF0aW9uQmVmb3JlOiBnZXRIaWRkZW5EdXJhdGlvbkJlZm9yZSxcbiAgZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbjogZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbixcbiAgc25hcEF3YXlGcm9tSGlkZGVuOiBzbmFwQXdheUZyb21IaWRkZW4sXG4gIGdldElzSGlkZGVuOiBnZXRJc0hpZGRlblxufSk7XG5cbi8qKlxuICogQSBSYW5nZSBjb250cm9scyBhIG51bWVyaWMgcmFuZ2Ugd2l0aCBhIHN0YXJ0IGFuZCBlbmQgdmFsdWUuXG4gKiBUaGUgUmFuZ2UgYWRqdXN0cyB0aGUgcmFuZ2UgYmFzZWQgb24gbW91c2UgZXZlbnRzIG9yIHByb2dyYW1tYXRpYyBjaGFuZ2VzLFxuICogYW5kIHRyaWdnZXJzIGV2ZW50cyB3aGVuIHRoZSByYW5nZSBpcyBjaGFuZ2luZyBvciBoYXMgYmVlbiBjaGFuZ2VkLlxuICovXG5jbGFzcyBSYW5nZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIC8qKlxuICogQHBhcmFtIHt7ZG9tOiBPYmplY3QsIGRvbVByb3BzOiBPYmplY3QsIGVtaXR0ZXI6IEVtaXR0ZXJ9fSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdICAgIFNlZSBkZXNjcmlwdGlvbiBhdCBSYW5nZS5zZXRPcHRpb25zXG4gKiBAY29uc3RydWN0b3IgUmFuZ2VcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG4gIGNvbnN0cnVjdG9yKGJvZHksIG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IG5vdyA9IG1vbWVudCgpLmhvdXJzKDApLm1pbnV0ZXMoMCkuc2Vjb25kcygwKS5taWxsaXNlY29uZHMoMCk7XG4gICAgY29uc3Qgc3RhcnQgPSBub3cuY2xvbmUoKS5hZGQoLTMsICdkYXlzJykudmFsdWVPZigpO1xuICAgIGNvbnN0IGVuZCA9IG5vdy5jbG9uZSgpLmFkZCgzLCAnZGF5cycpLnZhbHVlT2YoKTsgXG4gICAgdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlID0gdW5kZWZpbmVkO1xuICAgIFxuICAgIGlmKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0O1xuICAgICAgdGhpcy5lbmQgPSBlbmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhcnQgPSBvcHRpb25zLnN0YXJ0IHx8IHN0YXJ0O1xuICAgICAgdGhpcy5lbmQgPSBvcHRpb25zLmVuZCB8fCBlbmQ7XG4gICAgfVxuXG4gICAgdGhpcy5yb2xsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgIHRoaXMuZGVsdGFEaWZmZXJlbmNlID0gMDtcbiAgICB0aGlzLnNjYWxlT2Zmc2V0ID0gMDtcbiAgICB0aGlzLnN0YXJ0VG9Gcm9udCA9IGZhbHNlO1xuICAgIHRoaXMuZW5kVG9Gcm9udCA9IHRydWU7XG5cbiAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgcnRsOiBmYWxzZSxcbiAgICAgIHN0YXJ0OiBudWxsLFxuICAgICAgZW5kOiBudWxsLFxuICAgICAgbW9tZW50LFxuICAgICAgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCcsIC8vICdob3Jpem9udGFsJyBvciAndmVydGljYWwnXG4gICAgICBtb3ZlYWJsZTogdHJ1ZSxcbiAgICAgIHpvb21hYmxlOiB0cnVlLFxuICAgICAgbWluOiBudWxsLFxuICAgICAgbWF4OiBudWxsLFxuICAgICAgem9vbU1pbjogMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxsaXNlY29uZHNcbiAgICAgIHpvb21NYXg6IDEwMDAgKiA2MCAqIDYwICogMjQgKiAzNjUgKiAxMDAwMCwgIC8vIG1pbGxpc2Vjb25kc1xuICAgICAgcm9sbGluZ01vZGU6IHtcbiAgICAgICAgZm9sbG93OiBmYWxzZSxcbiAgICAgICAgb2Zmc2V0OiAwLjVcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRPcHRpb25zKTtcbiAgICB0aGlzLnByb3BzID0ge1xuICAgICAgdG91Y2g6IHt9XG4gICAgfTtcbiAgICB0aGlzLmFuaW1hdGlvblRpbWVyID0gbnVsbDtcblxuICAgIC8vIGRyYWcgbGlzdGVuZXJzIGZvciBkcmFnZ2luZ1xuICAgIHRoaXMuYm9keS5lbWl0dGVyLm9uKCdwYW5zdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpO1xuICAgIHRoaXMuYm9keS5lbWl0dGVyLm9uKCdwYW5tb3ZlJywgIHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5vbigncGFuZW5kJywgICB0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBtb3VzZSB3aGVlbCBmb3Igem9vbWluZ1xuICAgIHRoaXMuYm9keS5lbWl0dGVyLm9uKCdtb3VzZXdoZWVsJywgdGhpcy5fb25Nb3VzZVdoZWVsLmJpbmQodGhpcykpO1xuXG4gICAgLy8gcGluY2ggdG8gem9vbVxuICAgIHRoaXMuYm9keS5lbWl0dGVyLm9uKCd0b3VjaCcsIHRoaXMuX29uVG91Y2guYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIub24oJ3BpbmNoJywgdGhpcy5fb25QaW5jaC5iaW5kKHRoaXMpKTtcblxuICAgIC8vIG9uIGNsaWNrIG9mIHJvbGxpbmcgbW9kZSBidXR0b25cbiAgICB0aGlzLmJvZHkuZG9tLnJvbGxpbmdNb2RlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5zdGFydFJvbGxpbmcuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9wdGlvbnMgZm9yIHRoZSByYW5nZSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgICAgQXZhaWxhYmxlIG9wdGlvbnM6XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge251bWJlciB8IERhdGUgfCBTdHJpbmd9IHN0YXJ0ICBTdGFydCBkYXRlIGZvciB0aGUgcmFuZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyIHwgRGF0ZSB8IFN0cmluZ30gZW5kICAgIEVuZCBkYXRlIGZvciB0aGUgcmFuZ2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyfSBtaW4gICAgTWluaW11bSB2YWx1ZSBmb3Igc3RhcnRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyfSBtYXggICAgTWF4aW11bSB2YWx1ZSBmb3IgZW5kXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge251bWJlcn0gem9vbU1pbiAgICBTZXQgYSBtaW5pbXVtIHZhbHVlIGZvclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVuZCAtIHN0YXJ0KS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyfSB6b29tTWF4ICAgIFNldCBhIG1heGltdW0gdmFsdWUgZm9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5kIC0gc3RhcnQpLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtib29sZWFufSBtb3ZlYWJsZSBFbmFibGUgbW92aW5nIG9mIHRoZSByYW5nZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBkcmFnZ2luZy4gVHJ1ZSBieSBkZWZhdWx0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IHpvb21hYmxlIEVuYWJsZSB6b29taW5nIG9mIHRoZSByYW5nZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBwaW5jaGluZy9zY3JvbGxpbmcuIFRydWUgYnkgZGVmYXVsdFxuICAgKi9cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIC8vIGNvcHkgdGhlIG9wdGlvbnMgdGhhdCB3ZSBrbm93XG4gICAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICAgICdhbmltYXRpb24nLCAnZGlyZWN0aW9uJywgJ21pbicsICdtYXgnLCAnem9vbU1pbicsICd6b29tTWF4JywgJ21vdmVhYmxlJywgJ3pvb21hYmxlJyxcbiAgICAgICAgJ21vbWVudCcsICdhY3RpdmF0ZScsICdoaWRkZW5EYXRlcycsICd6b29tS2V5JywgJ3pvb21GcmljdGlvbicsICdydGwnLCAnc2hvd0N1cnJlbnRUaW1lJywgJ3JvbGxpbmdNb2RlJywgJ2hvcml6b250YWxTY3JvbGwnXG4gICAgICBdO1xuICAgICAgdXRpbC5zZWxlY3RpdmVFeHRlbmQoZmllbGRzLCB0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICBpZiAob3B0aW9ucy5yb2xsaW5nTW9kZSAmJiBvcHRpb25zLnJvbGxpbmdNb2RlLmZvbGxvdykge1xuICAgICAgICB0aGlzLnN0YXJ0Um9sbGluZygpO1xuICAgICAgfVxuICAgICAgaWYgKCdzdGFydCcgaW4gb3B0aW9ucyB8fCAnZW5kJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIC8vIGFwcGx5IGEgbmV3IHJhbmdlLiBib3RoIHN0YXJ0IGFuZCBlbmQgYXJlIG9wdGlvbmFsXG4gICAgICAgIHRoaXMuc2V0UmFuZ2Uob3B0aW9ucy5zdGFydCwgb3B0aW9ucy5lbmQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhdXRvIHJlZnJlc2hpbmcgdGhlIGN1cnJlbnQgdGltZSBiYXJcbiAgICovXG4gIHN0YXJ0Um9sbGluZygpIHtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG5cbiAgICAvKipcbiAgICAgKiAgVXBkYXRlcyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZSAoKSB7XG4gICAgICBtZS5zdG9wUm9sbGluZygpO1xuICAgICAgbWUucm9sbGluZyA9IHRydWU7XG5cblxuICAgICAgbGV0IGludGVydmFsID0gbWUuZW5kIC0gbWUuc3RhcnQ7XG4gICAgICBjb25zdCB0ID0gdXRpbC5jb252ZXJ0KG5ldyBEYXRlKCksICdEYXRlJykudmFsdWVPZigpO1xuICAgICAgY29uc3Qgcm9sbGluZ01vZGVPZmZzZXQgPSBtZS5vcHRpb25zLnJvbGxpbmdNb2RlICYmIG1lLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0IHx8IDAuNTtcblxuICAgICAgY29uc3Qgc3RhcnQgPSB0IC0gaW50ZXJ2YWwgKiAocm9sbGluZ01vZGVPZmZzZXQpO1xuICAgICAgY29uc3QgZW5kID0gdCArIGludGVydmFsICogKDEgLSByb2xsaW5nTW9kZU9mZnNldCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGFuaW1hdGlvbjogZmFsc2VcbiAgICAgIH07XG4gICAgICBtZS5zZXRSYW5nZShzdGFydCwgZW5kLCBvcHRpb25zKTtcblxuICAgICAgLy8gZGV0ZXJtaW5lIGludGVydmFsIHRvIHJlZnJlc2hcbiAgICAgIGNvbnN0IHNjYWxlID0gbWUuY29udmVyc2lvbihtZS5ib2R5LmRvbVByb3BzLmNlbnRlci53aWR0aCkuc2NhbGU7XG4gICAgICBpbnRlcnZhbCA9IDEgLyBzY2FsZSAvIDEwO1xuICAgICAgaWYgKGludGVydmFsIDwgMzApICAgaW50ZXJ2YWwgPSAzMDtcbiAgICAgIGlmIChpbnRlcnZhbCA+IDEwMDApIGludGVydmFsID0gMTAwMDtcblxuICAgICAgbWUuYm9keS5kb20ucm9sbGluZ01vZGVCdG4uc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gICAgICAvLyBzdGFydCBhIHJlbmRlclRpbWVyIHRvIGFkanVzdCBmb3IgdGhlIG5ldyB0aW1lXG4gICAgICBtZS5jdXJyZW50VGltZVRpbWVyID0gc2V0VGltZW91dCh1cGRhdGUsIGludGVydmFsKTtcbiAgICB9XG5cbiAgICB1cGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGF1dG8gcmVmcmVzaGluZyB0aGUgY3VycmVudCB0aW1lIGJhclxuICAgKi9cbiAgc3RvcFJvbGxpbmcoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFRpbWVUaW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZVRpbWVyKTtcbiAgICAgIHRoaXMucm9sbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gXCJ2aXNpYmxlXCI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBzdGFydCBhbmQgZW5kIHJhbmdlXG4gICAqIEBwYXJhbSB7RGF0ZSB8IG51bWJlciB8IHN0cmluZ30gc3RhcnRcbiAgICogQHBhcmFtIHtEYXRlIHwgbnVtYmVyIHwgc3RyaW5nfSBlbmRcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAgICBBdmFpbGFibGUgb3B0aW9uczpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfX0gW2FuaW1hdGlvbj1mYWxzZV1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlLCB0aGUgcmFuZ2UgaXMgYW5pbWF0ZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhseSB0byB0aGUgbmV3IHdpbmRvdy4gQW4gb2JqZWN0IGNhbiBiZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRvIHNwZWNpZnkgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGR1cmF0aW9uIGlzIDUwMCBtcywgYW5kIGRlZmF1bHQgZWFzaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgJ2Vhc2VJbk91dFF1YWQnLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtib29sZWFufSBbYnlVc2VyPWZhbHNlXVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtFdmVudH0gIGV2ZW50ICBNb3VzZSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAgICAgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24gIFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmcmFtZUNhbGxiYWNrICAgIGEgY2FsbGJhY2sgZnVuY3Rpb24gZXhlY3V0ZWQgZWFjaCBmcmFtZSBvZiB0aGUgcmFuZ2UgYW5pbWF0aW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aHJlZSBwYXJhbWV0ZXJzOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtudW1iZXJ9IGVhc2VDb2VmZmljaWVudCAgICBhbiBlYXNpbmcgY29lZmZpY2VudFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtib29sZWFufSB3aWxsRHJhdyAgICAgICAgICBJZiB0cnVlIHRoZSBjYWxsZXIgd2lsbCByZWRyYXcgYWZ0ZXIgdGhlIGNhbGxiYWNrIGNvbXBsZXRlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtib29sZWFufSBkb25lICAgICAgICAgICAgICBJZiB0cnVlIHRoZW4gYW5pbWF0aW9uIGlzIGVuZGluZyBhZnRlciB0aGUgY3VycmVudCBmcmFtZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgb3B0aW9ucywgY2FsbGJhY2ssIGZyYW1lQ2FsbGJhY2spIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuYnlVc2VyICE9PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLmJ5VXNlciA9IGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgY29uc3QgZmluYWxTdGFydCA9IHN0YXJ0ICE9IHVuZGVmaW5lZCA/IHV0aWwuY29udmVydChzdGFydCwgJ0RhdGUnKS52YWx1ZU9mKCkgOiBudWxsO1xuICAgIGNvbnN0IGZpbmFsRW5kICAgPSBlbmQgIT0gdW5kZWZpbmVkICAgPyB1dGlsLmNvbnZlcnQoZW5kLCAnRGF0ZScpLnZhbHVlT2YoKSAgIDogbnVsbDtcbiAgICB0aGlzLl9jYW5jZWxBbmltYXRpb24oKTtcbiAgICB0aGlzLm1pbGxpc2Vjb25kc1BlclBpeGVsQ2FjaGUgPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHsgLy8gdHJ1ZSBvciBhbiBPYmplY3RcbiAgICAgIGNvbnN0IGluaXRTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICBjb25zdCBpbml0RW5kID0gdGhpcy5lbmQ7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9ICh0eXBlb2Ygb3B0aW9ucy5hbmltYXRpb24gPT09ICdvYmplY3QnICYmICdkdXJhdGlvbicgaW4gb3B0aW9ucy5hbmltYXRpb24pID8gb3B0aW9ucy5hbmltYXRpb24uZHVyYXRpb24gOiA1MDA7XG4gICAgICBjb25zdCBlYXNpbmdOYW1lID0gKHR5cGVvZiBvcHRpb25zLmFuaW1hdGlvbiA9PT0gJ29iamVjdCcgJiYgJ2Vhc2luZ0Z1bmN0aW9uJyBpbiBvcHRpb25zLmFuaW1hdGlvbikgPyBvcHRpb25zLmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbiA6ICdlYXNlSW5PdXRRdWFkJztcbiAgICAgIGNvbnN0IGVhc2luZ0Z1bmN0aW9uID0gdXRpbC5lYXNpbmdGdW5jdGlvbnNbZWFzaW5nTmFtZV07XG4gICAgICBpZiAoIWVhc2luZ0Z1bmN0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBlYXNpbmcgZnVuY3Rpb24gJHtKU09OLnN0cmluZ2lmeShlYXNpbmdOYW1lKX0uIENob29zZSBmcm9tOiAke09iamVjdC5rZXlzKHV0aWwuZWFzaW5nRnVuY3Rpb25zKS5qb2luKCcsICcpfWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbml0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBsZXQgYW55Q2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBuZXh0ID0gKCkgPT4ge1xuICAgICAgICBpZiAoIW1lLnByb3BzLnRvdWNoLmRyYWdnaW5nKSB7XG4gICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCB0aW1lID0gbm93IC0gaW5pdFRpbWU7XG4gICAgICAgICAgY29uc3QgZWFzZSA9IGVhc2luZ0Z1bmN0aW9uKHRpbWUgLyBkdXJhdGlvbik7XG4gICAgICAgICAgY29uc3QgZG9uZSA9IHRpbWUgPiBkdXJhdGlvbjtcbiAgICAgICAgICBjb25zdCBzID0gKGRvbmUgfHwgZmluYWxTdGFydCA9PT0gbnVsbCkgPyBmaW5hbFN0YXJ0IDogaW5pdFN0YXJ0ICsgKGZpbmFsU3RhcnQgLSBpbml0U3RhcnQpICogZWFzZTtcbiAgICAgICAgICBjb25zdCBlID0gKGRvbmUgfHwgZmluYWxFbmQgICA9PT0gbnVsbCkgPyBmaW5hbEVuZCAgIDogaW5pdEVuZCAgICsgKGZpbmFsRW5kICAgLSBpbml0RW5kKSAgICogZWFzZTtcblxuICAgICAgICAgIGNoYW5nZWQgPSBtZS5fYXBwbHlSYW5nZShzLCBlKTtcbiAgICAgICAgICB1cGRhdGVIaWRkZW5EYXRlcyhtZS5vcHRpb25zLm1vbWVudCwgbWUuYm9keSwgbWUub3B0aW9ucy5oaWRkZW5EYXRlcyk7XG4gICAgICAgICAgYW55Q2hhbmdlZCA9IGFueUNoYW5nZWQgfHwgY2hhbmdlZDtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZShtZS5zdGFydCksIFxuICAgICAgICAgICAgZW5kOiBuZXcgRGF0ZShtZS5lbmQpLCBcbiAgICAgICAgICAgIGJ5VXNlcjogb3B0aW9ucy5ieVVzZXIsXG4gICAgICAgICAgICBldmVudDogb3B0aW9ucy5ldmVudFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoZnJhbWVDYWxsYmFjaykgeyBmcmFtZUNhbGxiYWNrKGVhc2UsIGNoYW5nZWQsIGRvbmUpOyB9XG5cbiAgICAgICAgICBpZiAoY2hhbmdlZCkgeyAgICAgICAgICBcbiAgICAgICAgICAgIG1lLmJvZHkuZW1pdHRlci5lbWl0KCdyYW5nZWNoYW5nZScsIHBhcmFtcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICAgIGlmIChhbnlDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgIG1lLmJvZHkuZW1pdHRlci5lbWl0KCdyYW5nZWNoYW5nZWQnLCBwYXJhbXMpO1xuICAgICAgICAgICAgICBpZiAoY2FsbGJhY2spIHsgcmV0dXJuIGNhbGxiYWNrKCkgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGFuaW1hdGUgd2l0aCBhcyBoaWdoIGFzIHBvc3NpYmxlIGZyYW1lIHJhdGUsIGxlYXZlIDIwIG1zIGluIGJldHdlZW5cbiAgICAgICAgICAgIC8vIGVhY2ggdG8gcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIGJsb2NraW5nXG4gICAgICAgICAgICBtZS5hbmltYXRpb25UaW1lciA9IHNldFRpbWVvdXQobmV4dCwgMjApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIG5leHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgY2hhbmdlZCA9IHRoaXMuX2FwcGx5UmFuZ2UoZmluYWxTdGFydCwgZmluYWxFbmQpO1xuICAgICAgdXBkYXRlSGlkZGVuRGF0ZXModGhpcy5vcHRpb25zLm1vbWVudCwgdGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZSh0aGlzLnN0YXJ0KSwgXG4gICAgICAgICAgZW5kOiBuZXcgRGF0ZSh0aGlzLmVuZCksIFxuICAgICAgICAgIGJ5VXNlcjogb3B0aW9ucy5ieVVzZXIsIFxuICAgICAgICAgIGV2ZW50OiBvcHRpb25zLmV2ZW50XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgncmFuZ2VjaGFuZ2UnLCBwYXJhbXMpO1xuICAgICAgICBjbGVhclRpbWVvdXQoIG1lLnRpbWVvdXRJRCApO1xuICAgICAgICBtZS50aW1lb3V0SUQgPSBzZXRUaW1lb3V0KCAoKSA9PiB7XG4gICAgICAgICAgbWUuYm9keS5lbWl0dGVyLmVtaXQoJ3JhbmdlY2hhbmdlZCcsIHBhcmFtcyk7XG4gICAgICAgIH0sIDIwMCApO1xuICAgICAgICBpZiAoY2FsbGJhY2spIHsgcmV0dXJuIGNhbGxiYWNrKCkgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgcGVyIHBpeGVsLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dW5kZWZpbmVkfG51bWJlcn1cbiAgICovXG4gIGdldE1pbGxpc2Vjb25kc1BlclBpeGVsKCkge1xuICAgIGlmICh0aGlzLm1pbGxpc2Vjb25kc1BlclBpeGVsQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlID0gKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgLyB0aGlzLmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmRzUGVyUGl4ZWxDYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGFuIGFuaW1hdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NhbmNlbEFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25UaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuYW5pbWF0aW9uVGltZXIpO1xuICAgICAgdGhpcy5hbmltYXRpb25UaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG5ldyBzdGFydCBhbmQgZW5kIHJhbmdlLiBUaGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBzZXRSYW5nZSwgYnV0XG4gICAqIGRvZXMgbm90IHRyaWdnZXIgYSByYW5nZSBjaGFuZ2UgYW5kIHJhbmdlIGNoYW5nZWQgZXZlbnQsIGFuZCBpdCByZXR1cm5zXG4gICAqIHRydWUgd2hlbiB0aGUgcmFuZ2UgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0XVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZF1cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gY2hhbmdlZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FwcGx5UmFuZ2Uoc3RhcnQsIGVuZCkge1xuICAgIGxldCBuZXdTdGFydCA9IChzdGFydCAhPSBudWxsKSA/IHV0aWwuY29udmVydChzdGFydCwgJ0RhdGUnKS52YWx1ZU9mKCkgOiB0aGlzLnN0YXJ0O1xuICAgIGxldCBuZXdFbmQgICA9IChlbmQgIT0gbnVsbCkgICA/IHV0aWwuY29udmVydChlbmQsICdEYXRlJykudmFsdWVPZigpICAgOiB0aGlzLmVuZDtcbiAgICBjb25zdCBtYXggPSAodGhpcy5vcHRpb25zLm1heCAhPSBudWxsKSA/IHV0aWwuY29udmVydCh0aGlzLm9wdGlvbnMubWF4LCAnRGF0ZScpLnZhbHVlT2YoKSA6IG51bGw7XG4gICAgY29uc3QgbWluID0gKHRoaXMub3B0aW9ucy5taW4gIT0gbnVsbCkgPyB1dGlsLmNvbnZlcnQodGhpcy5vcHRpb25zLm1pbiwgJ0RhdGUnKS52YWx1ZU9mKCkgOiBudWxsO1xuICAgIGxldCBkaWZmO1xuXG4gICAgLy8gY2hlY2sgZm9yIHZhbGlkIG51bWJlclxuICAgIGlmIChpc05hTihuZXdTdGFydCkgfHwgbmV3U3RhcnQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGFydCBcIiR7c3RhcnR9XCJgKTtcbiAgICB9XG4gICAgaWYgKGlzTmFOKG5ld0VuZCkgfHwgbmV3RW5kID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZW5kIFwiJHtlbmR9XCJgKTtcbiAgICB9XG5cbiAgICAvLyBwcmV2ZW50IGVuZCA8IHN0YXJ0XG4gICAgaWYgKG5ld0VuZCA8IG5ld1N0YXJ0KSB7XG4gICAgICBuZXdFbmQgPSBuZXdTdGFydDtcbiAgICB9XG5cbiAgICAvLyBwcmV2ZW50IHN0YXJ0IDwgbWluXG4gICAgaWYgKG1pbiAhPT0gbnVsbCkge1xuICAgICAgaWYgKG5ld1N0YXJ0IDwgbWluKSB7XG4gICAgICAgIGRpZmYgPSAobWluIC0gbmV3U3RhcnQpO1xuICAgICAgICBuZXdTdGFydCArPSBkaWZmO1xuICAgICAgICBuZXdFbmQgKz0gZGlmZjtcblxuICAgICAgICAvLyBwcmV2ZW50IGVuZCA+IG1heFxuICAgICAgICBpZiAobWF4ICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAobmV3RW5kID4gbWF4KSB7XG4gICAgICAgICAgICBuZXdFbmQgPSBtYXg7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gcHJldmVudCBlbmQgPiBtYXhcbiAgICBpZiAobWF4ICE9PSBudWxsKSB7XG4gICAgICBpZiAobmV3RW5kID4gbWF4KSB7XG4gICAgICAgIGRpZmYgPSAobmV3RW5kIC0gbWF4KTtcbiAgICAgICAgbmV3U3RhcnQgLT0gZGlmZjtcbiAgICAgICAgbmV3RW5kIC09IGRpZmY7XG5cbiAgICAgICAgLy8gcHJldmVudCBzdGFydCA8IG1pblxuICAgICAgICBpZiAobWluICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAobmV3U3RhcnQgPCBtaW4pIHtcbiAgICAgICAgICAgIG5ld1N0YXJ0ID0gbWluO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHByZXZlbnQgKGVuZC1zdGFydCkgPCB6b29tTWluXG4gICAgaWYgKHRoaXMub3B0aW9ucy56b29tTWluICE9PSBudWxsKSB7XG4gICAgICBsZXQgem9vbU1pbiA9IHBhcnNlRmxvYXQodGhpcy5vcHRpb25zLnpvb21NaW4pO1xuICAgICAgaWYgKHpvb21NaW4gPCAwKSB7XG4gICAgICAgIHpvb21NaW4gPSAwO1xuICAgICAgfVxuICAgICAgaWYgKChuZXdFbmQgLSBuZXdTdGFydCkgPCB6b29tTWluKSB7XG4gICAgICAgIC8vIGNvbXBlbnNhdGUgZm9yIGEgc2NhbGUgb2YgMC41IG1zXG4gICAgICAgIGNvbnN0IGNvbXBlbnNhdGlvbiA9IDAuNTtcbiAgICAgICAgaWYgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpID09PSB6b29tTWluICYmIG5ld1N0YXJ0ID49IHRoaXMuc3RhcnQgLSBjb21wZW5zYXRpb24gJiYgbmV3RW5kIDw9IHRoaXMuZW5kKSB7XG4gICAgICAgICAgLy8gaWdub3JlIHRoaXMgYWN0aW9uLCB3ZSBhcmUgYWxyZWFkeSB6b29tZWQgdG8gdGhlIG1pbmltdW1cbiAgICAgICAgICBuZXdTdGFydCA9IHRoaXMuc3RhcnQ7XG4gICAgICAgICAgbmV3RW5kID0gdGhpcy5lbmQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gem9vbSB0byB0aGUgbWluaW11bVxuICAgICAgICAgIGRpZmYgPSAoem9vbU1pbiAtIChuZXdFbmQgLSBuZXdTdGFydCkpO1xuICAgICAgICAgIG5ld1N0YXJ0IC09IGRpZmYgLyAyO1xuICAgICAgICAgIG5ld0VuZCArPSBkaWZmIC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHByZXZlbnQgKGVuZC1zdGFydCkgPiB6b29tTWF4XG4gICAgaWYgKHRoaXMub3B0aW9ucy56b29tTWF4ICE9PSBudWxsKSB7XG4gICAgICBsZXQgem9vbU1heCA9IHBhcnNlRmxvYXQodGhpcy5vcHRpb25zLnpvb21NYXgpO1xuICAgICAgaWYgKHpvb21NYXggPCAwKSB7XG4gICAgICAgIHpvb21NYXggPSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG5ld0VuZCAtIG5ld1N0YXJ0KSA+IHpvb21NYXgpIHtcbiAgICAgICAgaWYgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpID09PSB6b29tTWF4ICYmIG5ld1N0YXJ0IDwgdGhpcy5zdGFydCAmJiBuZXdFbmQgPiB0aGlzLmVuZCkge1xuICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGFjdGlvbiwgd2UgYXJlIGFscmVhZHkgem9vbWVkIHRvIHRoZSBtYXhpbXVtXG4gICAgICAgICAgbmV3U3RhcnQgPSB0aGlzLnN0YXJ0O1xuICAgICAgICAgIG5ld0VuZCA9IHRoaXMuZW5kO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIHpvb20gdG8gdGhlIG1heGltdW1cbiAgICAgICAgICBkaWZmID0gKChuZXdFbmQgLSBuZXdTdGFydCkgLSB6b29tTWF4KTtcbiAgICAgICAgICBuZXdTdGFydCArPSBkaWZmIC8gMjtcbiAgICAgICAgICBuZXdFbmQgLT0gZGlmZiAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VkID0gKHRoaXMuc3RhcnQgIT0gbmV3U3RhcnQgfHwgdGhpcy5lbmQgIT0gbmV3RW5kKTtcblxuICAgIC8vIGlmIHRoZSBuZXcgcmFuZ2UgZG9lcyBOT1Qgb3ZlcmxhcCB3aXRoIHRoZSBvbGQgcmFuZ2UsIGVtaXQgY2hlY2tSYW5nZWRJdGVtcyB0byBhdm9pZCBub3Qgc2hvd2luZyByYW5nZWQgaXRlbXMgKHJhbmdlZCBtZWFuaW5nIGhhcyBlbmQgdGltZSwgbm90IG5lY2Vzc2FyaWx5IG9mIHR5cGUgUmFuZ2UpXG4gICAgaWYgKCEoKG5ld1N0YXJ0ID49IHRoaXMuc3RhcnQgJiYgbmV3U3RhcnQgICA8PSB0aGlzLmVuZCkgfHwgKG5ld0VuZCAgID49IHRoaXMuc3RhcnQgJiYgbmV3RW5kICAgPD0gdGhpcy5lbmQpKSAmJlxuICAgICAgICAhKCh0aGlzLnN0YXJ0ID49IG5ld1N0YXJ0ICYmIHRoaXMuc3RhcnQgPD0gbmV3RW5kKSAgIHx8ICh0aGlzLmVuZCA+PSBuZXdTdGFydCAgICYmIHRoaXMuZW5kIDw9IG5ld0VuZCkgKSkge1xuICAgICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnY2hlY2tSYW5nZWRJdGVtcycpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnQgPSBuZXdTdGFydDtcbiAgICB0aGlzLmVuZCA9IG5ld0VuZDtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCByYW5nZS5cbiAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBzdGFydCBhbmQgZW5kIHByb3BlcnRpZXNcbiAgICovXG4gIGdldFJhbmdlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogdGhpcy5zdGFydCxcbiAgICAgIGVuZDogdGhpcy5lbmRcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgY29udmVyc2lvbiBvZmZzZXQgYW5kIHNjYWxlIGZvciBjdXJyZW50IHJhbmdlLCBiYXNlZCBvblxuICAgKiB0aGUgcHJvdmlkZWQgd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbdG90YWxIaWRkZW49MF1cbiAgICogQHJldHVybnMge3tvZmZzZXQ6IG51bWJlciwgc2NhbGU6IG51bWJlcn19IGNvbnZlcnNpb25cbiAgICovXG4gIGNvbnZlcnNpb24od2lkdGgsIHRvdGFsSGlkZGVuKSB7XG4gICAgcmV0dXJuIFJhbmdlLmNvbnZlcnNpb24odGhpcy5zdGFydCwgdGhpcy5lbmQsIHdpZHRoLCB0b3RhbEhpZGRlbik7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBjYWxjdWxhdGUgdGhlIGNvbnZlcnNpb24gb2Zmc2V0IGFuZCBzY2FsZSBmb3IgYSByYW5nZSxcbiAgICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIHN0YXJ0LCBlbmQsIGFuZCB3aWR0aFxuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAgICogQHBhcmFtIHtudW1iZXJ9IFt0b3RhbEhpZGRlbj0wXVxuICAgKiBAcmV0dXJucyB7e29mZnNldDogbnVtYmVyLCBzY2FsZTogbnVtYmVyfX0gY29udmVyc2lvblxuICAgKi9cbiAgc3RhdGljIGNvbnZlcnNpb24oc3RhcnQsIGVuZCwgd2lkdGgsIHRvdGFsSGlkZGVuKSB7XG4gICAgaWYgKHRvdGFsSGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRvdGFsSGlkZGVuID0gMDtcbiAgICB9XG4gICAgaWYgKHdpZHRoICE9IDAgJiYgKGVuZCAtIHN0YXJ0ICE9IDApKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXQ6IHN0YXJ0LFxuICAgICAgICBzY2FsZTogd2lkdGggLyAoZW5kIC0gc3RhcnQgLSB0b3RhbEhpZGRlbilcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIHNjYWxlOiAxXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBkcmFnZ2luZyBob3Jpem9udGFsbHkgb3IgdmVydGljYWxseVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgdGhpcy5kZWx0YURpZmZlcmVuY2UgPSAwO1xuICAgIHRoaXMucHJldmlvdXNEZWx0YSA9IDA7XG5cbiAgICAvLyBvbmx5IGFsbG93IGRyYWdnaW5nIHdoZW4gY29uZmlndXJlZCBhcyBtb3ZhYmxlXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMubW92ZWFibGUpIHJldHVybjtcblxuICAgIC8vIG9ubHkgc3RhcnQgZHJhZ2dpbmcgd2hlbiB0aGUgbW91c2UgaXMgaW5zaWRlIHRoZSBjdXJyZW50IHJhbmdlXG4gICAgaWYgKCF0aGlzLl9pc0luc2lkZVJhbmdlKGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgLy8gcmVmdXNlIHRvIGRyYWcgd2hlbiB3ZSB3aGVyZSBwaW5jaGluZyB0byBwcmV2ZW50IHRoZSB0aW1lbGluZSBtYWtlIGEganVtcFxuICAgIC8vIHdoZW4gcmVsZWFzaW5nIHRoZSBmaW5nZXJzIGluIG9wcG9zaXRlIG9yZGVyIGZyb20gdGhlIHRvdWNoIHNjcmVlblxuICAgIGlmICghdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLnN0b3BSb2xsaW5nKCk7XG5cbiAgICB0aGlzLnByb3BzLnRvdWNoLnN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICB0aGlzLnByb3BzLnRvdWNoLmVuZCA9IHRoaXMuZW5kO1xuICAgIHRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMuYm9keS5kb20ucm9vdCkge1xuICAgICAgdGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvciA9ICdtb3ZlJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBkcmFnZ2luZyBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWcoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm47XG5cbiAgICBpZiAoIXRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIC8vIG9ubHkgYWxsb3cgZHJhZ2dpbmcgd2hlbiBjb25maWd1cmVkIGFzIG1vdmFibGVcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5tb3ZlYWJsZSkgcmV0dXJuO1xuXG4gICAgLy8gVE9ETzogdGhpcyBtYXkgYmUgcmVkdW5kYW50IGluIGhhbW1lcmpzMlxuICAgIC8vIHJlZnVzZSB0byBkcmFnIHdoZW4gd2Ugd2hlcmUgcGluY2hpbmcgdG8gcHJldmVudCB0aGUgdGltZWxpbmUgbWFrZSBhIGp1bXBcbiAgICAvLyB3aGVuIHJlbGVhc2luZyB0aGUgZmluZ2VycyBpbiBvcHBvc2l0ZSBvcmRlciBmcm9tIHRoZSB0b3VjaCBzY3JlZW5cbiAgICBpZiAoIXRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcbiAgICB2YWxpZGF0ZURpcmVjdGlvbihkaXJlY3Rpb24pO1xuICAgIGxldCBkZWx0YSA9IChkaXJlY3Rpb24gPT0gJ2hvcml6b250YWwnKSA/IGV2ZW50LmRlbHRhWCA6IGV2ZW50LmRlbHRhWTtcbiAgICBkZWx0YSAtPSB0aGlzLmRlbHRhRGlmZmVyZW5jZTtcbiAgICBsZXQgaW50ZXJ2YWwgPSAodGhpcy5wcm9wcy50b3VjaC5lbmQgLSB0aGlzLnByb3BzLnRvdWNoLnN0YXJ0KTtcblxuICAgIC8vIG5vcm1hbGl6ZSBkcmFnZ2luZyBzcGVlZCBpZiBjdXRvdXQgaXMgaW4gYmV0d2Vlbi5cbiAgICBjb25zdCBkdXJhdGlvbiA9IGdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgICBpbnRlcnZhbCAtPSBkdXJhdGlvbjtcblxuICAgIGNvbnN0IHdpZHRoID0gKGRpcmVjdGlvbiA9PSAnaG9yaXpvbnRhbCcpID8gdGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlci53aWR0aCA6IHRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0O1xuICAgIGxldCBkaWZmUmFuZ2U7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgIGRpZmZSYW5nZSA9IGRlbHRhIC8gd2lkdGggKiBpbnRlcnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlmZlJhbmdlID0gLWRlbHRhIC8gd2lkdGggKiBpbnRlcnZhbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGFydCA9IHRoaXMucHJvcHMudG91Y2guc3RhcnQgKyBkaWZmUmFuZ2U7XG4gICAgY29uc3QgbmV3RW5kID0gdGhpcy5wcm9wcy50b3VjaC5lbmQgKyBkaWZmUmFuZ2U7XG5cbiAgICAvLyBzbmFwcGluZyB0aW1lcyBhd2F5IGZyb20gaGlkZGVuIHpvbmVzXG4gICAgY29uc3Qgc2FmZVN0YXJ0ID0gc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcywgbmV3U3RhcnQsIHRoaXMucHJldmlvdXNEZWx0YS1kZWx0YSwgdHJ1ZSk7XG4gICAgY29uc3Qgc2FmZUVuZCA9IHNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsIG5ld0VuZCwgdGhpcy5wcmV2aW91c0RlbHRhLWRlbHRhLCB0cnVlKTtcbiAgICBpZiAoc2FmZVN0YXJ0ICE9IG5ld1N0YXJ0IHx8IHNhZmVFbmQgIT0gbmV3RW5kKSB7XG4gICAgICB0aGlzLmRlbHRhRGlmZmVyZW5jZSArPSBkZWx0YTtcbiAgICAgIHRoaXMucHJvcHMudG91Y2guc3RhcnQgPSBzYWZlU3RhcnQ7XG4gICAgICB0aGlzLnByb3BzLnRvdWNoLmVuZCA9IHNhZmVFbmQ7XG4gICAgICB0aGlzLl9vbkRyYWcoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJldmlvdXNEZWx0YSA9IGRlbHRhO1xuICAgIHRoaXMuX2FwcGx5UmFuZ2UobmV3U3RhcnQsIG5ld0VuZCk7XG5cblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKHRoaXMuc3RhcnQpO1xuICAgIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZSh0aGlzLmVuZCk7XG5cbiAgICAvLyBmaXJlIGEgcmFuZ2VjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdyYW5nZWNoYW5nZScsIHtcbiAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICBlbmQ6ICAgZW5kRGF0ZSxcbiAgICAgIGJ5VXNlcjogdHJ1ZSxcbiAgICAgIGV2ZW50XG4gICAgfSk7XG5cbiAgICAvLyBmaXJlIGEgcGFubW92ZSBldmVudFxuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoJ3Bhbm1vdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGRyYWdnaW5nIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge2V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRHJhZ0VuZChldmVudCkge1xuICAgIGlmICghdGhpcy5wcm9wcy50b3VjaC5kcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgLy8gb25seSBhbGxvdyBkcmFnZ2luZyB3aGVuIGNvbmZpZ3VyZWQgYXMgbW92YWJsZVxuICAgIGlmICghdGhpcy5vcHRpb25zLm1vdmVhYmxlKSByZXR1cm47XG5cbiAgICAvLyBUT0RPOiB0aGlzIG1heSBiZSByZWR1bmRhbnQgaW4gaGFtbWVyanMyXG4gICAgLy8gcmVmdXNlIHRvIGRyYWcgd2hlbiB3ZSB3aGVyZSBwaW5jaGluZyB0byBwcmV2ZW50IHRoZSB0aW1lbGluZSBtYWtlIGEganVtcFxuICAgIC8vIHdoZW4gcmVsZWFzaW5nIHRoZSBmaW5nZXJzIGluIG9wcG9zaXRlIG9yZGVyIGZyb20gdGhlIHRvdWNoIHNjcmVlblxuICAgIGlmICghdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuYm9keS5kb20ucm9vdCkge1xuICAgICAgdGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvciA9ICdhdXRvJztcbiAgICB9XG5cbiAgICAvLyBmaXJlIGEgcmFuZ2VjaGFuZ2VkIGV2ZW50XG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgncmFuZ2VjaGFuZ2VkJywge1xuICAgICAgc3RhcnQ6IG5ldyBEYXRlKHRoaXMuc3RhcnQpLFxuICAgICAgZW5kOiAgIG5ldyBEYXRlKHRoaXMuZW5kKSxcbiAgICAgIGJ5VXNlcjogdHJ1ZSxcbiAgICAgIGV2ZW50XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZlbnQgaGFuZGxlciBmb3IgbW91c2Ugd2hlZWwgZXZlbnQsIHVzZWQgdG8gem9vbVxuICAgKiBDb2RlIGZyb20gaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC9cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbk1vdXNlV2hlZWwoZXZlbnQpIHtcbiAgICAvLyByZXRyaWV2ZSBkZWx0YVxuICAgIGxldCBkZWx0YSA9IDA7XG4gICAgaWYgKGV2ZW50LndoZWVsRGVsdGEpIHsgLyogSUUvT3BlcmEuICovXG4gICAgICBkZWx0YSA9IGV2ZW50LndoZWVsRGVsdGEgLyAxMjA7XG4gICAgfSBlbHNlIGlmIChldmVudC5kZXRhaWwpIHsgLyogTW96aWxsYSBjYXNlLiAqL1xuICAgICAgLy8gSW4gTW96aWxsYSwgc2lnbiBvZiBkZWx0YSBpcyBkaWZmZXJlbnQgdGhhbiBpbiBJRS5cbiAgICAgIC8vIEFsc28sIGRlbHRhIGlzIG11bHRpcGxlIG9mIDMuXG4gICAgICBkZWx0YSA9IC1ldmVudC5kZXRhaWwgLyAzO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQuZGVsdGFZKSB7XG4gICAgICBkZWx0YSA9IC1ldmVudC5kZWx0YVkgLyAzO1xuICAgIH0gXG5cbiAgICAvLyBkb24ndCBhbGxvdyB6b29tIHdoZW4gdGhlIGFjY29yZGluZyBrZXkgaXMgcHJlc3NlZCBhbmQgdGhlIHpvb21LZXkgb3B0aW9uIG9yIG5vdCB6b29tYWJsZSBidXQgbW92YWJsZVxuICAgIGlmICgodGhpcy5vcHRpb25zLnpvb21LZXkgJiYgIWV2ZW50W3RoaXMub3B0aW9ucy56b29tS2V5XSAmJiB0aGlzLm9wdGlvbnMuem9vbWFibGUpIFxuICAgICAgfHwgKCF0aGlzLm9wdGlvbnMuem9vbWFibGUgJiYgdGhpcy5vcHRpb25zLm1vdmVhYmxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIG9ubHkgYWxsb3cgem9vbWluZyB3aGVuIGNvbmZpZ3VyZWQgYXMgem9vbWFibGUgYW5kIG1vdmVhYmxlXG4gICAgaWYgKCEodGhpcy5vcHRpb25zLnpvb21hYmxlICYmIHRoaXMub3B0aW9ucy5tb3ZlYWJsZSkpIHJldHVybjtcbiAgICBcbiAgICAvLyBvbmx5IHpvb20gd2hlbiB0aGUgbW91c2UgaXMgaW5zaWRlIHRoZSBjdXJyZW50IHJhbmdlXG4gICAgaWYgKCF0aGlzLl9pc0luc2lkZVJhbmdlKGV2ZW50KSkgcmV0dXJuO1xuXG4gICAgLy8gSWYgZGVsdGEgaXMgbm9uemVybywgaGFuZGxlIGl0LlxuICAgIC8vIEJhc2ljYWxseSwgZGVsdGEgaXMgbm93IHBvc2l0aXZlIGlmIHdoZWVsIHdhcyBzY3JvbGxlZCB1cCxcbiAgICAvLyBhbmQgbmVnYXRpdmUsIGlmIHdoZWVsIHdhcyBzY3JvbGxlZCBkb3duLlxuICAgIGlmIChkZWx0YSkge1xuICAgICAgLy8gcGVyZm9ybSB0aGUgem9vbSBhY3Rpb24uIERlbHRhIGlzIG5vcm1hbGx5IDEgb3IgLTFcblxuICAgICAgLy8gYWRqdXN0IGEgbmVnYXRpdmUgZGVsdGEgc3VjaCB0aGF0IHpvb21pbmcgaW4gd2l0aCBkZWx0YSAwLjFcbiAgICAgIC8vIGVxdWFscyB6b29taW5nIG91dCB3aXRoIGEgZGVsdGEgLTAuMVxuXG4gICAgICBjb25zdCB6b29tRnJpY3Rpb24gPSB0aGlzLm9wdGlvbnMuem9vbUZyaWN0aW9uIHx8IDU7XG4gICAgICBsZXQgc2NhbGU7XG4gICAgICBpZiAoZGVsdGEgPCAwKSB7XG4gICAgICAgIHNjYWxlID0gMSAtIChkZWx0YSAvIHpvb21GcmljdGlvbik7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc2NhbGUgPSAxIC8gKDEgKyAoZGVsdGEgLyB6b29tRnJpY3Rpb24pKSA7XG4gICAgICB9XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSBjZW50ZXIsIHRoZSBkYXRlIHRvIHpvb20gYXJvdW5kXG4gICAgICBsZXQgcG9pbnRlckRhdGU7XG4gICAgICBpZiAodGhpcy5yb2xsaW5nKSB7XG4gICAgICAgIGNvbnN0IHJvbGxpbmdNb2RlT2Zmc2V0ID0gdGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlICYmIHRoaXMub3B0aW9ucy5yb2xsaW5nTW9kZS5vZmZzZXQgfHwgMC41O1xuICAgICAgICBwb2ludGVyRGF0ZSA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiByb2xsaW5nTW9kZU9mZnNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwb2ludGVyID0gdGhpcy5nZXRQb2ludGVyKHt4OiBldmVudC5jbGllbnRYLCB5OiBldmVudC5jbGllbnRZfSwgdGhpcy5ib2R5LmRvbS5jZW50ZXIpO1xuICAgICAgICBwb2ludGVyRGF0ZSA9IHRoaXMuX3BvaW50ZXJUb0RhdGUocG9pbnRlcik7XG4gICAgICB9XG4gICAgICB0aGlzLnpvb20oc2NhbGUsIHBvaW50ZXJEYXRlLCBkZWx0YSwgZXZlbnQpO1xuXG4gICAgICAvLyBQcmV2ZW50IGRlZmF1bHQgYWN0aW9ucyBjYXVzZWQgYnkgbW91c2Ugd2hlZWxcbiAgICAgIC8vIChlbHNlIHRoZSBwYWdlIGFuZCB0aW1lbGluZSBib3RoIHNjcm9sbClcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG9mIGEgdG91Y2ggZ2VzdHVyZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uVG91Y2goZXZlbnQpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB0aGlzLnByb3BzLnRvdWNoLnN0YXJ0ID0gdGhpcy5zdGFydDtcbiAgICB0aGlzLnByb3BzLnRvdWNoLmVuZCA9IHRoaXMuZW5kO1xuICAgIHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy5wcm9wcy50b3VjaC5jZW50ZXIgPSBudWxsO1xuICAgIHRoaXMucHJvcHMudG91Y2guY2VudGVyRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5zY2FsZU9mZnNldCA9IDA7XG4gICAgdGhpcy5kZWx0YURpZmZlcmVuY2UgPSAwO1xuICAgIC8vIERpc2FibGUgdGhlIGJyb3dzZXIgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGlzIGV2ZW50LlxuICAgIHV0aWwucHJldmVudERlZmF1bHQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBwaW5jaCBldmVudFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uUGluY2goZXZlbnQpIHtcbiAgICAvLyBvbmx5IGFsbG93IHpvb21pbmcgd2hlbiBjb25maWd1cmVkIGFzIHpvb21hYmxlIGFuZCBtb3ZlYWJsZVxuICAgIGlmICghKHRoaXMub3B0aW9ucy56b29tYWJsZSAmJiB0aGlzLm9wdGlvbnMubW92ZWFibGUpKSByZXR1cm47XG5cbiAgICAvLyBEaXNhYmxlIHRoZSBicm93c2VyIGRlZmF1bHQgaGFuZGxpbmcgb2YgdGhpcyBldmVudC5cbiAgICB1dGlsLnByZXZlbnREZWZhdWx0KGV2ZW50KTtcblxuICAgIHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgaWYgKCF0aGlzLnByb3BzLnRvdWNoLmNlbnRlcikge1xuICAgICAgdGhpcy5wcm9wcy50b3VjaC5jZW50ZXIgPSB0aGlzLmdldFBvaW50ZXIoZXZlbnQuY2VudGVyLCB0aGlzLmJvZHkuZG9tLmNlbnRlcik7XG4gICAgICB0aGlzLnByb3BzLnRvdWNoLmNlbnRlckRhdGUgPSB0aGlzLl9wb2ludGVyVG9EYXRlKHRoaXMucHJvcHMudG91Y2guY2VudGVyKTtcbiAgICB9XG5cbiAgICB0aGlzLnN0b3BSb2xsaW5nKCk7XG4gICAgY29uc3Qgc2NhbGUgPSAxIC8gKGV2ZW50LnNjYWxlICsgdGhpcy5zY2FsZU9mZnNldCk7XG4gICAgY29uc3QgY2VudGVyRGF0ZSA9IHRoaXMucHJvcHMudG91Y2guY2VudGVyRGF0ZTtcblxuICAgIGNvbnN0IGhpZGRlbkR1cmF0aW9uID0gZ2V0SGlkZGVuRHVyYXRpb25CZXR3ZWVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcywgdGhpcy5zdGFydCwgdGhpcy5lbmQpO1xuICAgIGNvbnN0IGhpZGRlbkR1cmF0aW9uQmVmb3JlID0gZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCwgdGhpcy5ib2R5LmhpZGRlbkRhdGVzLCB0aGlzLCBjZW50ZXJEYXRlKTtcbiAgICBjb25zdCBoaWRkZW5EdXJhdGlvbkFmdGVyID0gaGlkZGVuRHVyYXRpb24gLSBoaWRkZW5EdXJhdGlvbkJlZm9yZTtcblxuICAgIC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgYW5kIGVuZFxuICAgIGxldCBuZXdTdGFydCA9IChjZW50ZXJEYXRlIC0gaGlkZGVuRHVyYXRpb25CZWZvcmUpICsgKHRoaXMucHJvcHMudG91Y2guc3RhcnQgLSAoY2VudGVyRGF0ZSAtIGhpZGRlbkR1cmF0aW9uQmVmb3JlKSkgKiBzY2FsZTtcbiAgICBsZXQgbmV3RW5kID0gKGNlbnRlckRhdGUgKyBoaWRkZW5EdXJhdGlvbkFmdGVyKSArICh0aGlzLnByb3BzLnRvdWNoLmVuZCAtIChjZW50ZXJEYXRlICsgaGlkZGVuRHVyYXRpb25BZnRlcikpICogc2NhbGU7XG5cbiAgICAvLyBzbmFwcGluZyB0aW1lcyBhd2F5IGZyb20gaGlkZGVuIHpvbmVzXG4gICAgdGhpcy5zdGFydFRvRnJvbnQgPSAxIC0gc2NhbGUgPD0gMDsgLy8gdXNlZCB0byBkbyB0aGUgcmlnaHQgYXV0byBjb3JyZWN0aW9uIHdpdGggcGVyaW9kaWMgaGlkZGVuIHRpbWVzXG4gICAgdGhpcy5lbmRUb0Zyb250ID0gc2NhbGUgLSAxIDw9IDA7ICAgLy8gdXNlZCB0byBkbyB0aGUgcmlnaHQgYXV0byBjb3JyZWN0aW9uIHdpdGggcGVyaW9kaWMgaGlkZGVuIHRpbWVzXG4gICAgXG4gICAgY29uc3Qgc2FmZVN0YXJ0ID0gc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcywgbmV3U3RhcnQsIDEgLSBzY2FsZSwgdHJ1ZSk7XG4gICAgY29uc3Qgc2FmZUVuZCA9IHNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsIG5ld0VuZCwgc2NhbGUgLSAxLCB0cnVlKTtcbiAgICBpZiAoc2FmZVN0YXJ0ICE9IG5ld1N0YXJ0IHx8IHNhZmVFbmQgIT0gbmV3RW5kKSB7XG4gICAgICB0aGlzLnByb3BzLnRvdWNoLnN0YXJ0ID0gc2FmZVN0YXJ0O1xuICAgICAgdGhpcy5wcm9wcy50b3VjaC5lbmQgPSBzYWZlRW5kO1xuICAgICAgdGhpcy5zY2FsZU9mZnNldCA9IDEgLSBldmVudC5zY2FsZTtcbiAgICAgIG5ld1N0YXJ0ID0gc2FmZVN0YXJ0O1xuICAgICAgbmV3RW5kID0gc2FmZUVuZDtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGFuaW1hdGlvbjogZmFsc2UsXG4gICAgICBieVVzZXI6IHRydWUsXG4gICAgICBldmVudFxuICAgIH07XG4gICAgdGhpcy5zZXRSYW5nZShuZXdTdGFydCwgbmV3RW5kLCBvcHRpb25zKTtcblxuICAgIHRoaXMuc3RhcnRUb0Zyb250ID0gZmFsc2U7IC8vIHJldmVydCB0byBkZWZhdWx0XG4gICAgdGhpcy5lbmRUb0Zyb250ID0gdHJ1ZTsgLy8gcmV2ZXJ0IHRvIGRlZmF1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBUZXN0IHdoZXRoZXIgdGhlIG1vdXNlIGZyb20gYSBtb3VzZSBldmVudCBpcyBpbnNpZGUgdGhlIHZpc2libGUgd2luZG93LFxuICAgKiBiZXR3ZWVuIHRoZSBjdXJyZW50IHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIHdoZW4gaW5zaWRlIHRoZSB2aXNpYmxlIHdpbmRvd1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzSW5zaWRlUmFuZ2UoZXZlbnQpIHtcbiAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWUgd2hlcmUgdGhlIG1vdXNlIGlzLCBjaGVjayB3aGV0aGVyIGluc2lkZVxuICAgIC8vIGFuZCBubyBzY3JvbGwgYWN0aW9uIHNob3VsZCBoYXBwZW4uXG4gICAgY29uc3QgY2xpZW50WCA9IGV2ZW50LmNlbnRlciA/IGV2ZW50LmNlbnRlci54IDogZXZlbnQuY2xpZW50WDtcbiAgICBjb25zdCBjZW50ZXJDb250YWluZXJSZWN0ID0gdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHRoaXMub3B0aW9ucy5ydGwgPyBjbGllbnRYIC0gY2VudGVyQ29udGFpbmVyUmVjdC5sZWZ0IDogY2VudGVyQ29udGFpbmVyUmVjdC5yaWdodCAtIGNsaWVudFg7XG4gICAgY29uc3QgdGltZSA9IHRoaXMuYm9keS51dGlsLnRvVGltZSh4KTtcblxuICAgIHJldHVybiB0aW1lID49IHRoaXMuc3RhcnQgJiYgdGltZSA8PSB0aGlzLmVuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBjZW50ZXIgZGF0ZSBmb3Igem9vbWluZ1xuICAgKiBAcGFyYW0ge3t4OiBudW1iZXIsIHk6IG51bWJlcn19IHBvaW50ZXJcbiAgICogQHJldHVybiB7bnVtYmVyfSBkYXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcG9pbnRlclRvRGF0ZShwb2ludGVyKSB7XG4gICAgbGV0IGNvbnZlcnNpb247XG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLmRpcmVjdGlvbjtcblxuICAgIHZhbGlkYXRlRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09ICdob3Jpem9udGFsJykge1xuICAgICAgcmV0dXJuIHRoaXMuYm9keS51dGlsLnRvVGltZShwb2ludGVyLngpLnZhbHVlT2YoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodDtcbiAgICAgIGNvbnZlcnNpb24gPSB0aGlzLmNvbnZlcnNpb24oaGVpZ2h0KTtcbiAgICAgIHJldHVybiBwb2ludGVyLnkgLyBjb252ZXJzaW9uLnNjYWxlICsgY29udmVyc2lvbi5vZmZzZXQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcG9pbnRlciBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIGRvbSBlbGVtZW50XG4gICAqIEBwYXJhbSB7e3g6IG51bWJlciwgeTogbnVtYmVyfX0gdG91Y2hcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50ICAgSFRNTCBET00gZWxlbWVudFxuICAgKiBAcmV0dXJuIHt7eDogbnVtYmVyLCB5OiBudW1iZXJ9fSBwb2ludGVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRQb2ludGVyKHRvdWNoLCBlbGVtZW50KSB7XG4gICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB4OiBlbGVtZW50UmVjdC5yaWdodCAtIHRvdWNoLngsXG4gICAgICAgIHk6IHRvdWNoLnkgLSBlbGVtZW50UmVjdC50b3BcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHg6IHRvdWNoLnggLSBlbGVtZW50UmVjdC5sZWZ0LFxuICAgICAgICB5OiB0b3VjaC55IC0gZWxlbWVudFJlY3QudG9wXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBab29tIHRoZSByYW5nZSB0aGUgZ2l2ZW4gc2NhbGUgaW4gb3Igb3V0LiBTdGFydCBhbmQgZW5kIGRhdGUgd2lsbFxuICAgKiBiZSBhZGp1c3RlZCwgYW5kIHRoZSB0aW1lbGluZSB3aWxsIGJlIHJlZHJhd24uIFlvdSBjYW4gb3B0aW9uYWxseSBnaXZlIGFcbiAgICogZGF0ZSBhcm91bmQgd2hpY2ggdG8gem9vbS5cbiAgICogRm9yIGV4YW1wbGUsIHRyeSBzY2FsZSA9IDAuOSBvciAxLjFcbiAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlICAgICAgU2NhbGluZyBmYWN0b3IuIFZhbHVlcyBhYm92ZSAxIHdpbGwgem9vbSBvdXQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBiZWxvdyAxIHdpbGwgem9vbSBpbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFtjZW50ZXJdICAgVmFsdWUgcmVwcmVzZW50aW5nIGEgZGF0ZSBhcm91bmQgd2hpY2ggd2lsbFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB6b29tZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWx0YVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKi9cbiAgem9vbShzY2FsZSwgY2VudGVyLCBkZWx0YSwgZXZlbnQpIHtcbiAgICAvLyBpZiBjZW50ZXJEYXRlIGlzIG5vdCBwcm92aWRlZCwgdGFrZSBpdCBoYWxmIGJldHdlZW4gc3RhcnQgRGF0ZSBhbmQgZW5kIERhdGVcbiAgICBpZiAoY2VudGVyID09IG51bGwpIHtcbiAgICAgIGNlbnRlciA9ICh0aGlzLnN0YXJ0ICsgdGhpcy5lbmQpIC8gMjtcbiAgICB9XG5cbiAgICBjb25zdCBoaWRkZW5EdXJhdGlvbiA9IGdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsIHRoaXMuc3RhcnQsIHRoaXMuZW5kKTtcbiAgICBjb25zdCBoaWRkZW5EdXJhdGlvbkJlZm9yZSA9IGdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHRoaXMub3B0aW9ucy5tb21lbnQsIHRoaXMuYm9keS5oaWRkZW5EYXRlcywgdGhpcywgY2VudGVyKTtcbiAgICBjb25zdCBoaWRkZW5EdXJhdGlvbkFmdGVyID0gaGlkZGVuRHVyYXRpb24gLSBoaWRkZW5EdXJhdGlvbkJlZm9yZTtcblxuICAgIC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgYW5kIGVuZFxuICAgIGxldCBuZXdTdGFydCA9IChjZW50ZXItaGlkZGVuRHVyYXRpb25CZWZvcmUpICsgKHRoaXMuc3RhcnQgLSAoY2VudGVyLWhpZGRlbkR1cmF0aW9uQmVmb3JlKSkgKiBzY2FsZTtcbiAgICBsZXQgbmV3RW5kICAgPSAoY2VudGVyK2hpZGRlbkR1cmF0aW9uQWZ0ZXIpICsgKHRoaXMuZW5kIC0gKGNlbnRlcitoaWRkZW5EdXJhdGlvbkFmdGVyKSkgKiBzY2FsZTtcblxuICAgIC8vIHNuYXBwaW5nIHRpbWVzIGF3YXkgZnJvbSBoaWRkZW4gem9uZXNcbiAgICB0aGlzLnN0YXJ0VG9Gcm9udCA9IGRlbHRhID4gMCA/IGZhbHNlIDogdHJ1ZTsgLy8gdXNlZCB0byBkbyB0aGUgcmlnaHQgYXV0b2NvcnJlY3Rpb24gd2l0aCBwZXJpb2RpYyBoaWRkZW4gdGltZXNcbiAgICB0aGlzLmVuZFRvRnJvbnQgPSAtZGVsdGEgID4gMCA/IGZhbHNlIDogdHJ1ZTsgLy8gdXNlZCB0byBkbyB0aGUgcmlnaHQgYXV0b2NvcnJlY3Rpb24gd2l0aCBwZXJpb2RpYyBoaWRkZW4gdGltZXNcbiAgICBjb25zdCBzYWZlU3RhcnQgPSBzbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLCBuZXdTdGFydCwgZGVsdGEsIHRydWUpO1xuICAgIGNvbnN0IHNhZmVFbmQgPSBzbmFwQXdheUZyb21IaWRkZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLCBuZXdFbmQsIC1kZWx0YSwgdHJ1ZSk7XG4gICAgaWYgKHNhZmVTdGFydCAhPSBuZXdTdGFydCB8fCBzYWZlRW5kICE9IG5ld0VuZCkge1xuICAgICAgbmV3U3RhcnQgPSBzYWZlU3RhcnQ7XG4gICAgICBuZXdFbmQgPSBzYWZlRW5kO1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBhbmltYXRpb246IGZhbHNlLFxuICAgICAgYnlVc2VyOiB0cnVlLFxuICAgICAgZXZlbnRcbiAgICB9O1xuICAgIHRoaXMuc2V0UmFuZ2UobmV3U3RhcnQsIG5ld0VuZCwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnN0YXJ0VG9Gcm9udCA9IGZhbHNlOyAvLyByZXZlcnQgdG8gZGVmYXVsdFxuICAgIHRoaXMuZW5kVG9Gcm9udCA9IHRydWU7IC8vIHJldmVydCB0byBkZWZhdWx0XG4gIH1cblxuICAvKipcbiAgICogTW92ZSB0aGUgcmFuZ2Ugd2l0aCBhIGdpdmVuIGRlbHRhIHRvIHRoZSBsZWZ0IG9yIHJpZ2h0LiBTdGFydCBhbmQgZW5kXG4gICAqIHZhbHVlIHdpbGwgYmUgYWRqdXN0ZWQuIEZvciBleGFtcGxlLCB0cnkgZGVsdGEgPSAwLjEgb3IgLTAuMVxuICAgKiBAcGFyYW0ge251bWJlcn0gIGRlbHRhICAgICBNb3ZpbmcgYW1vdW50LiBQb3NpdGl2ZSB2YWx1ZSB3aWxsIG1vdmUgcmlnaHQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlIHZhbHVlIHdpbGwgbW92ZSBsZWZ0XG4gICAqL1xuICBtb3ZlKGRlbHRhKSB7XG4gICAgLy8gem9vbSBzdGFydCBEYXRlIGFuZCBlbmQgRGF0ZSByZWxhdGl2ZSB0byB0aGUgY2VudGVyRGF0ZVxuICAgIGNvbnN0IGRpZmYgPSAodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KTtcblxuICAgIC8vIGFwcGx5IG5ldyB2YWx1ZXNcbiAgICBjb25zdCBuZXdTdGFydCA9IHRoaXMuc3RhcnQgKyBkaWZmICogZGVsdGE7XG4gICAgY29uc3QgbmV3RW5kID0gdGhpcy5lbmQgKyBkaWZmICogZGVsdGE7XG5cbiAgICAvLyBUT0RPOiByZWNrb24gd2l0aCBtaW4gYW5kIG1heCByYW5nZVxuXG4gICAgdGhpcy5zdGFydCA9IG5ld1N0YXJ0O1xuICAgIHRoaXMuZW5kID0gbmV3RW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIHJhbmdlIHRvIGEgbmV3IGNlbnRlciBwb2ludFxuICAgKiBAcGFyYW0ge251bWJlcn0gbW92ZVRvICAgICAgTmV3IGNlbnRlciBwb2ludCBvZiB0aGUgcmFuZ2VcbiAgICovXG4gIG1vdmVUbyhtb3ZlVG8pIHtcbiAgICBjb25zdCBjZW50ZXIgPSAodGhpcy5zdGFydCArIHRoaXMuZW5kKSAvIDI7XG5cbiAgICBjb25zdCBkaWZmID0gY2VudGVyIC0gbW92ZVRvO1xuXG4gICAgLy8gY2FsY3VsYXRlIG5ldyBzdGFydCBhbmQgZW5kXG4gICAgY29uc3QgbmV3U3RhcnQgPSB0aGlzLnN0YXJ0IC0gZGlmZjtcbiAgICBjb25zdCBuZXdFbmQgPSB0aGlzLmVuZCAtIGRpZmY7XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgYW5pbWF0aW9uOiBmYWxzZSxcbiAgICAgIGJ5VXNlcjogdHJ1ZSxcbiAgICAgIGV2ZW50OiBudWxsXG4gICAgfTtcbiAgICB0aGlzLnNldFJhbmdlKG5ld1N0YXJ0LCBuZXdFbmQsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIGRpcmVjdGlvbiBoYXMgYSB2YWxpZCB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdGlvbiAgICAnaG9yaXpvbnRhbCcgb3IgJ3ZlcnRpY2FsJ1xuICovXG5mdW5jdGlvbiB2YWxpZGF0ZURpcmVjdGlvbiAoZGlyZWN0aW9uKSB7XG4gIGlmIChkaXJlY3Rpb24gIT0gJ2hvcml6b250YWwnICYmIGRpcmVjdGlvbiAhPSAndmVydGljYWwnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBkaXJlY3Rpb24gXCIke2RpcmVjdGlvbn1cIi4gQ2hvb3NlIFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIi5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFNldHVwIGEgbW9jayBoYW1tZXIuanMgb2JqZWN0LCBmb3IgdW5pdCB0ZXN0aW5nLlxuICpcbiAqIEluc3BpcmF0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vdWJlci9kZWNrLmdsL3B1bGwvNjU4XG4gKlxuICogQHJldHVybnMge3tvbjogbm9vcCwgb2ZmOiBub29wLCBkZXN0cm95OiBub29wLCBlbWl0OiBub29wLCBnZXQ6IGdldH19XG4gKi9cbmZ1bmN0aW9uIGhhbW1lck1vY2soKSB7XG4gIGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuICByZXR1cm4ge1xuICAgIG9uOiBub29wLFxuICAgIG9mZjogbm9vcCxcbiAgICBkZXN0cm95OiBub29wLFxuICAgIGVtaXQ6IG5vb3AsXG5cbiAgICBnZXQobSkge1x0Ly9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXQ6IG5vb3BcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG5sZXQgbW9kaWZpZWRIYW1tZXI7XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICBjb25zdCBPdXJIYW1tZXIgPSB3aW5kb3dbJ0hhbW1lciddIHx8IEhhbW1lciQxO1xuICBtb2RpZmllZEhhbW1lciA9IFByb3BhZ2F0aW5nSGFtbWVyKE91ckhhbW1lciwge1xuICAgIHByZXZlbnREZWZhdWx0OiAnbW91c2UnXG4gIH0pO1xufSBlbHNlIHtcbiAgbW9kaWZpZWRIYW1tZXIgPSAoKSA9PiAvLyBoYW1tZXIuanMgaXMgb25seSBhdmFpbGFibGUgaW4gYSBicm93c2VyLCBub3QgaW4gbm9kZS5qcy4gUmVwbGFjaW5nIGl0IHdpdGggYSBtb2NrIG9iamVjdC5cbiAgaGFtbWVyTW9jaygpO1xufVxuXG52YXIgSGFtbWVyID0gbW9kaWZpZWRIYW1tZXI7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSB0b3VjaCBldmVudCwgdGFraW5nIHBsYWNlIGJlZm9yZSBhIGdlc3R1cmVcbiAqIEBwYXJhbSB7SGFtbWVyfSBoYW1tZXIgICAgICAgQSBoYW1tZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrICAgQ2FsbGJhY2ssIGNhbGxlZCBhcyBjYWxsYmFjayhldmVudClcbiAqL1xuZnVuY3Rpb24gb25Ub3VjaCAoaGFtbWVyLCBjYWxsYmFjaykge1xuICBjYWxsYmFjay5pbnB1dEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuaXNGaXJzdCkge1xuICAgICAgY2FsbGJhY2soZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICBoYW1tZXIub24oJ2hhbW1lci5pbnB1dCcsIGNhbGxiYWNrLmlucHV0SGFuZGxlcik7XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSByZWxlYXNlIGV2ZW50LCB0YWtpbmcgcGxhY2UgYWZ0ZXIgYSBnZXN0dXJlXG4gKiBAcGFyYW0ge0hhbW1lcn0gaGFtbWVyICAgICAgIEEgaGFtbWVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayAgIENhbGxiYWNrLCBjYWxsZWQgYXMgY2FsbGJhY2soZXZlbnQpXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gb25SZWxlYXNlIChoYW1tZXIsIGNhbGxiYWNrKSB7XG4gIGNhbGxiYWNrLmlucHV0SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5pc0ZpbmFsKSB7XG4gICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBoYW1tZXIub24oJ2hhbW1lci5pbnB1dCcsIGNhbGxiYWNrLmlucHV0SGFuZGxlcik7XG59XG5cbi8qKlxuICogSGFjayB0aGUgUGluY2hSZWNvZ25pemVyIHN1Y2ggdGhhdCBpdCBkb2Vzbid0IHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvclxuICogZm9yIHZlcnRpY2FsIHBhbm5pbmcuXG4gKlxuICogWWVhaCAuLi4gdGhpcyBpcyBxdWl0ZSBhIGhhY2sgLi4uIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaGFtbWVyanMvaGFtbWVyLmpzL2lzc3Vlcy85MzJcbiAqXG4gKiBAcGFyYW0ge0hhbW1lci5QaW5jaH0gcGluY2hSZWNvZ25pemVyXG4gKiBAcmV0dXJuIHtIYW1tZXIuUGluY2h9IHJldHVybnMgdGhlIHBpbmNoUmVjb2duaXplclxuICovXG5mdW5jdGlvbiBkaXNhYmxlUHJldmVudERlZmF1bHRWZXJ0aWNhbGx5IChwaW5jaFJlY29nbml6ZXIpIHtcbiAgY29uc3QgVE9VQ0hfQUNUSU9OX1BBTl9ZID0gJ3Bhbi15JztcblxuICBwaW5jaFJlY29nbml6ZXIuZ2V0VG91Y2hBY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgICAvLyBkZWZhdWx0IG1ldGhvZCByZXR1cm5zIFtUT1VDSF9BQ1RJT05fTk9ORV1cbiAgICByZXR1cm4gW1RPVUNIX0FDVElPTl9QQU5fWV07XG4gIH07XG5cbiAgcmV0dXJuIHBpbmNoUmVjb2duaXplcjtcbn1cblxuLyoqXG4gKiBUaGUgY2xhc3MgVGltZVN0ZXAgaXMgYW4gaXRlcmF0b3IgZm9yIGRhdGVzLiBZb3UgcHJvdmlkZSBhIHN0YXJ0IGRhdGUgYW5kIGFuXG4gKiBlbmQgZGF0ZS4gVGhlIGNsYXNzIGl0c2VsZiBkZXRlcm1pbmVzIHRoZSBiZXN0IHNjYWxlIChzdGVwIHNpemUpIGJhc2VkIG9uIHRoZVxuICogcHJvdmlkZWQgc3RhcnQgRGF0ZSwgZW5kIERhdGUsIGFuZCBtaW5pbXVtU3RlcC5cbiAqXG4gKiBJZiBtaW5pbXVtU3RlcCBpcyBwcm92aWRlZCwgdGhlIHN0ZXAgc2l6ZSBpcyBjaG9zZW4gYXMgY2xvc2UgYXMgcG9zc2libGVcbiAqIHRvIHRoZSBtaW5pbXVtU3RlcCBidXQgbGFyZ2VyIHRoYW4gbWluaW11bVN0ZXAuIElmIG1pbmltdW1TdGVwIGlzIG5vdFxuICogcHJvdmlkZWQsIHRoZSBzY2FsZSBpcyBzZXQgdG8gMSBEQVkuXG4gKiBUaGUgbWluaW11bVN0ZXAgc2hvdWxkIGNvcnJlc3BvbmQgd2l0aCB0aGUgb25zY3JlZW4gc2l6ZSBvZiBhYm91dCA2IGNoYXJhY3RlcnNcbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldCBhIHNjYWxlIGJ5IGhhbmQuXG4gKiBBZnRlciBjcmVhdGlvbiwgeW91IGNhbiBpbml0aWFsaXplIHRoZSBjbGFzcyBieSBleGVjdXRpbmcgZmlyc3QoKS4gVGhlbiB5b3VcbiAqIGNhbiBpdGVyYXRlIGZyb20gdGhlIHN0YXJ0IGRhdGUgdG8gdGhlIGVuZCBkYXRlIHZpYSBuZXh0KCkuIFlvdSBjYW4gY2hlY2sgaWZcbiAqIHRoZSBlbmQgZGF0ZSBpcyByZWFjaGVkIHdpdGggdGhlIGZ1bmN0aW9uIGhhc05leHQoKS4gQWZ0ZXIgZWFjaCBzdGVwLCB5b3UgY2FuXG4gKiByZXRyaWV2ZSB0aGUgY3VycmVudCBkYXRlIHZpYSBnZXRDdXJyZW50KCkuXG4gKiBUaGUgVGltZVN0ZXAgaGFzIHNjYWxlcyByYW5naW5nIGZyb20gbWlsbGlzZWNvbmRzLCBzZWNvbmRzLCBtaW51dGVzLCBob3VycyxcbiAqIGRheXMsIHRvIHllYXJzLlxuICpcbiAqIFZlcnNpb246IDEuMlxuICpcbiAqL1xuY2xhc3MgVGltZVN0ZXAge1xuICAvKipcbiAgICAqIEBwYXJhbSB7RGF0ZX0gW3N0YXJ0XSAgICAgICAgIFRoZSBzdGFydCBkYXRlLCBmb3IgZXhhbXBsZSBuZXcgRGF0ZSgyMDEwLCA5LCAyMSlcbiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5ldyBEYXRlKDIwMTAsIDksIDIxLCAyMywgNDUsIDAwKVxuICAgICogQHBhcmFtIHtEYXRlfSBbZW5kXSAgICAgICAgICAgVGhlIGVuZCBkYXRlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gW21pbmltdW1TdGVwXSBPcHRpb25hbC4gTWluaW11bSBzdGVwIHNpemUgaW4gbWlsbGlzZWNvbmRzXG4gICAgKiBAcGFyYW0ge0RhdGV8QXJyYXkuPERhdGU+fSBbaGlkZGVuRGF0ZXNdIE9wdGlvbmFsLlxuICAgICogQHBhcmFtIHt7c2hvd01ham9yTGFiZWxzOiBib29sZWFuLCBzaG93V2Vla1NjYWxlOiBib29sZWFufX0gW29wdGlvbnNdIE9wdGlvbmFsLlxuICAgICogQGNvbnN0cnVjdG9yICBUaW1lU3RlcFxuICAgICovXG4gIGNvbnN0cnVjdG9yKHN0YXJ0LCBlbmQsIG1pbmltdW1TdGVwLCBoaWRkZW5EYXRlcywgb3B0aW9ucykge1xuICAgIHRoaXMubW9tZW50ID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5tb21lbnQpIHx8IG1vbWVudDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID8gb3B0aW9ucyA6IHt9O1xuXG4gICAgLy8gdmFyaWFibGVzXG4gICAgdGhpcy5jdXJyZW50ID0gdGhpcy5tb21lbnQoKTtcbiAgICB0aGlzLl9zdGFydCA9IHRoaXMubW9tZW50KCk7XG4gICAgdGhpcy5fZW5kID0gdGhpcy5tb21lbnQoKTtcblxuICAgIHRoaXMuYXV0b1NjYWxlICA9IHRydWU7XG4gICAgdGhpcy5zY2FsZSA9ICdkYXknO1xuICAgIHRoaXMuc3RlcCA9IDE7XG5cbiAgICAvLyBpbml0aWFsaXplIHRoZSByYW5nZVxuICAgIHRoaXMuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgbWluaW11bVN0ZXApO1xuXG4gICAgLy8gaGlkZGVuIERhdGVzIG9wdGlvbnNcbiAgICB0aGlzLnN3aXRjaGVkRGF5ID0gZmFsc2U7XG4gICAgdGhpcy5zd2l0Y2hlZE1vbnRoID0gZmFsc2U7XG4gICAgdGhpcy5zd2l0Y2hlZFllYXIgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShoaWRkZW5EYXRlcykpIHtcbiAgICAgIHRoaXMuaGlkZGVuRGF0ZXMgPSBoaWRkZW5EYXRlcztcbiAgICB9XG4gICAgZWxzZSBpZiAoaGlkZGVuRGF0ZXMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhpZGRlbkRhdGVzID0gW2hpZGRlbkRhdGVzXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmhpZGRlbkRhdGVzID0gW107XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXQgPSBUaW1lU3RlcC5GT1JNQVQ7IC8vIGRlZmF1bHQgZm9ybWF0dGluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXN0b20gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIG1vbWVudC4gQ2FuIGJlIHVzZWQgdG8gc2V0IGRhdGVzXG4gICAqIHRvIFVUQyBvciB0byBzZXQgYSB1dGNPZmZzZXQuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1vbWVudFxuICAgKi9cbiAgc2V0TW9tZW50KG1vbWVudCkge1xuICAgIHRoaXMubW9tZW50ID0gbW9tZW50O1xuXG4gICAgLy8gdXBkYXRlIHRoZSBkYXRlIHByb3BlcnRpZXMsIGNhbiBoYXZlIGEgbmV3IHV0Y09mZnNldFxuICAgIHRoaXMuY3VycmVudCA9IHRoaXMubW9tZW50KHRoaXMuY3VycmVudC52YWx1ZU9mKCkpO1xuICAgIHRoaXMuX3N0YXJ0ID0gdGhpcy5tb21lbnQodGhpcy5fc3RhcnQudmFsdWVPZigpKTtcbiAgICB0aGlzLl9lbmQgPSB0aGlzLm1vbWVudCh0aGlzLl9lbmQudmFsdWVPZigpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VzdG9tIGZvcm1hdHRpbmcgZm9yIHRoZSBtaW5vciBhbiBtYWpvciBsYWJlbHMgb2YgdGhlIFRpbWVTdGVwLlxuICAgKiBCb3RoIGBtaW5vckxhYmVsc2AgYW5kIGBtYWpvckxhYmVsc2AgYXJlIGFuIE9iamVjdCB3aXRoIHByb3BlcnRpZXM6XG4gICAqICdtaWxsaXNlY29uZCcsICdzZWNvbmQnLCAnbWludXRlJywgJ2hvdXInLCAnd2Vla2RheScsICdkYXknLCAnd2VlaycsICdtb250aCcsICd5ZWFyJy5cbiAgICogQHBhcmFtIHt7bWlub3JMYWJlbHM6IE9iamVjdCwgbWFqb3JMYWJlbHM6IE9iamVjdH19IGZvcm1hdFxuICAgKi9cbiAgc2V0Rm9ybWF0KGZvcm1hdCkge1xuICAgIGNvbnN0IGRlZmF1bHRGb3JtYXQgPSB1dGlsLmRlZXBFeHRlbmQoe30sIFRpbWVTdGVwLkZPUk1BVCk7XG4gICAgdGhpcy5mb3JtYXQgPSB1dGlsLmRlZXBFeHRlbmQoZGVmYXVsdEZvcm1hdCwgZm9ybWF0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBuZXcgcmFuZ2VcbiAgICogSWYgbWluaW11bVN0ZXAgaXMgcHJvdmlkZWQsIHRoZSBzdGVwIHNpemUgaXMgY2hvc2VuIGFzIGNsb3NlIGFzIHBvc3NpYmxlXG4gICAqIHRvIHRoZSBtaW5pbXVtU3RlcCBidXQgbGFyZ2VyIHRoYW4gbWluaW11bVN0ZXAuIElmIG1pbmltdW1TdGVwIGlzIG5vdFxuICAgKiBwcm92aWRlZCwgdGhlIHNjYWxlIGlzIHNldCB0byAxIERBWS5cbiAgICogVGhlIG1pbmltdW1TdGVwIHNob3VsZCBjb3JyZXNwb25kIHdpdGggdGhlIG9uc2NyZWVuIHNpemUgb2YgYWJvdXQgNiBjaGFyYWN0ZXJzXG4gICAqIEBwYXJhbSB7RGF0ZX0gW3N0YXJ0XSAgICAgIFRoZSBzdGFydCBkYXRlIGFuZCB0aW1lLlxuICAgKiBAcGFyYW0ge0RhdGV9IFtlbmRdICAgICAgICBUaGUgZW5kIGRhdGUgYW5kIHRpbWUuXG4gICAqIEBwYXJhbSB7aW50fSBbbWluaW11bVN0ZXBdIE9wdGlvbmFsLiBNaW5pbXVtIHN0ZXAgc2l6ZSBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHNldFJhbmdlKHN0YXJ0LCBlbmQsIG1pbmltdW1TdGVwKSB7XG4gICAgaWYgKCEoc3RhcnQgaW5zdGFuY2VvZiBEYXRlKSB8fCAhKGVuZCBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICB0aHJvdyAgXCJObyBsZWdhbCBzdGFydCBvciBlbmQgZGF0ZSBpbiBtZXRob2Qgc2V0UmFuZ2VcIjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdGFydCA9IChzdGFydCAhPSB1bmRlZmluZWQpID8gdGhpcy5tb21lbnQoc3RhcnQudmFsdWVPZigpKSA6IERhdGUubm93KCk7XG4gICAgdGhpcy5fZW5kID0gKGVuZCAhPSB1bmRlZmluZWQpID8gdGhpcy5tb21lbnQoZW5kLnZhbHVlT2YoKSkgOiBEYXRlLm5vdygpO1xuXG4gICAgaWYgKHRoaXMuYXV0b1NjYWxlKSB7XG4gICAgICB0aGlzLnNldE1pbmltdW1TdGVwKG1pbmltdW1TdGVwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByYW5nZSBpdGVyYXRvciB0byB0aGUgc3RhcnQgZGF0ZS5cbiAgICovXG4gIHN0YXJ0KCkge1xuICAgIHRoaXMuY3VycmVudCA9IHRoaXMuX3N0YXJ0LmNsb25lKCk7XG4gICAgdGhpcy5yb3VuZFRvTWlub3IoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3VuZCB0aGUgY3VycmVudCBkYXRlIHRvIHRoZSBmaXJzdCBtaW5vciBkYXRlIHZhbHVlXG4gICAqIFRoaXMgbXVzdCBiZSBleGVjdXRlZCBvbmNlIHdoZW4gdGhlIGN1cnJlbnQgZGF0ZSBpcyBzZXQgdG8gc3RhcnQgRGF0ZVxuICAgKi9cbiAgcm91bmRUb01pbm9yKCkge1xuICAgIC8vIHJvdW5kIHRvIGZsb29yXG4gICAgLy8gdG8gcHJldmVudCB5ZWFyICYgbW9udGggc2NhbGVzIHJvdW5kaW5nIGRvd24gdG8gdGhlIGZpcnN0IGRheSBvZiB3ZWVrIHdlIHBlcmZvcm0gdGhpcyBzZXBhcmF0ZWx5XG4gICAgaWYgKHRoaXMuc2NhbGUgPT0gJ3dlZWsnKSB7XG4gICAgICB0aGlzLmN1cnJlbnQud2Vla2RheSgwKTtcbiAgICB9XG4gICAgLy8gSU1QT1JUQU5UOiB3ZSBoYXZlIG5vIGJyZWFrcyBpbiB0aGlzIHN3aXRjaCEgKHRoaXMgaXMgbm8gYnVnKVxuICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICBzd2l0Y2ggKHRoaXMuc2NhbGUpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICB0aGlzLmN1cnJlbnQueWVhcih0aGlzLnN0ZXAgKiBNYXRoLmZsb29yKHRoaXMuY3VycmVudC55ZWFyKCkgLyB0aGlzLnN0ZXApKTtcbiAgICAgICAgdGhpcy5jdXJyZW50Lm1vbnRoKDApO1xuICAgICAgY2FzZSAnbW9udGgnOiAgICAgICAgdGhpcy5jdXJyZW50LmRhdGUoMSk7ICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgJ3dlZWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICBjYXNlICdkYXknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgY2FzZSAnd2Vla2RheSc6ICAgICAgdGhpcy5jdXJyZW50LmhvdXJzKDApOyAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgJ2hvdXInOiAgICAgICAgIHRoaXMuY3VycmVudC5taW51dGVzKDApOyAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICBjYXNlICdtaW51dGUnOiAgICAgICB0aGlzLmN1cnJlbnQuc2Vjb25kcygwKTsgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgY2FzZSAnc2Vjb25kJzogICAgICAgdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIC8vY2FzZSAnbWlsbGlzZWNvbmQnOiAvLyBub3RoaW5nIHRvIGRvIGZvciBtaWxsaXNlY29uZHNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGVwICE9IDEpIHtcbiAgICAgIC8vIHJvdW5kIGRvd24gdG8gdGhlIGZpcnN0IG1pbm9yIHZhbHVlIHRoYXQgaXMgYSBtdWx0aXBsZSBvZiB0aGUgY3VycmVudCBzdGVwIHNpemVcbiAgICAgIGxldCAgcHJpb3JDdXJyZW50ID0gdGhpcy5jdXJyZW50LmNsb25lKCk7XG4gICAgICBzd2l0Y2ggKHRoaXMuc2NhbGUpIHsgICAgICAgIFxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6ICB0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpICUgdGhpcy5zdGVwLCAnbWlsbGlzZWNvbmRzJyk7ICBicmVhaztcbiAgICAgICAgY2FzZSAnc2Vjb25kJzogICAgICAgdGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5zZWNvbmRzKCkgJSB0aGlzLnN0ZXAsICdzZWNvbmRzJyk7IGJyZWFrO1xuICAgICAgICBjYXNlICdtaW51dGUnOiAgICAgICB0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50Lm1pbnV0ZXMoKSAlIHRoaXMuc3RlcCwgJ21pbnV0ZXMnKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hvdXInOiAgICAgICAgIHRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQuaG91cnMoKSAlIHRoaXMuc3RlcCwgJ2hvdXJzJyk7IGJyZWFrO1xuICAgICAgICBjYXNlICd3ZWVrZGF5JzogICAgICAvLyBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2hcbiAgICAgICAgY2FzZSAnZGF5JzogICAgICAgICAgdGhpcy5jdXJyZW50LnN1YnRyYWN0KCh0aGlzLmN1cnJlbnQuZGF0ZSgpIC0gMSkgJSB0aGlzLnN0ZXAsICdkYXknKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOiAgICAgICAgIHRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQud2VlaygpICUgdGhpcy5zdGVwLCAnd2VlaycpOyBicmVhaztcbiAgICAgICAgY2FzZSAnbW9udGgnOiAgICAgICAgdGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5tb250aCgpICUgdGhpcy5zdGVwLCAnbW9udGgnKTsgIGJyZWFrO1xuICAgICAgICBjYXNlICd5ZWFyJzogICAgICAgICB0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LnllYXIoKSAlIHRoaXMuc3RlcCwgJ3llYXInKTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoIXByaW9yQ3VycmVudC5pc1NhbWUodGhpcy5jdXJyZW50KSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudCA9IHRoaXMubW9tZW50KHNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmhpZGRlbkRhdGVzLCB0aGlzLmN1cnJlbnQudmFsdWVPZigpLCAtMSwgdHJ1ZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgdGhlcmUgaXMgYSBuZXh0IHN0ZXBcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gIHRydWUgaWYgdGhlIGN1cnJlbnQgZGF0ZSBoYXMgbm90IHBhc3NlZCB0aGUgZW5kIGRhdGVcbiAgICovXG4gIGhhc05leHQoKSB7XG4gICAgcmV0dXJuICh0aGlzLmN1cnJlbnQudmFsdWVPZigpIDw9IHRoaXMuX2VuZC52YWx1ZU9mKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERvIHRoZSBuZXh0IHN0ZXBcbiAgICovXG4gIG5leHQoKSB7XG4gICAgY29uc3QgcHJldiA9IHRoaXMuY3VycmVudC52YWx1ZU9mKCk7XG5cbiAgICAvLyBUd28gY2FzZXMsIG5lZWRlZCB0byBwcmV2ZW50IGlzc3VlcyB3aXRoIHN3aXRjaGluZyBkYXlsaWdodCBzYXZpbmdzXG4gICAgLy8gKGVuZCBvZiBNYXJjaCBhbmQgZW5kIG9mIE9jdG9iZXIpXG4gICAgc3dpdGNoICh0aGlzLnNjYWxlKSB7XG4gICAgICBjYXNlICdtaWxsaXNlY29uZCc6ICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ21pbGxpc2Vjb25kJyk7IGJyZWFrO1xuICAgICAgY2FzZSAnc2Vjb25kJzogICAgICAgdGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsICdzZWNvbmQnKTsgYnJlYWs7XG4gICAgICBjYXNlICdtaW51dGUnOiAgICAgICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ21pbnV0ZScpOyBicmVhaztcbiAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ2hvdXInKTtcblxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Lm1vbnRoKCkgPCA2KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpICUgdGhpcy5zdGVwLCAnaG91cicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnQuaG91cnMoKSAlIHRoaXMuc3RlcCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAgLSB0aGlzLmN1cnJlbnQuaG91cnMoKSAlIHRoaXMuc3RlcCwgJ2hvdXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ZWVrZGF5JzogICAgICAvLyBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2hcbiAgICAgIGNhc2UgJ2RheSc6ICAgICAgICAgIHRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCAnZGF5Jyk7IGJyZWFrO1xuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnQud2Vla2RheSgpICE9PSAwKXsgLy8gd2UgaGFkIGEgbW9udGggYnJlYWsgbm90IGNvcnJlbGF0aW5nIHdpdGggYSB3ZWVrJ3Mgc3RhcnQgYmVmb3JlXG4gICAgICAgICAgdGhpcy5jdXJyZW50LndlZWtkYXkoMCk7IC8vIHN3aXRjaCBiYWNrIHRvIHdlZWsgY3ljbGVzXG4gICAgICAgICAgdGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsICd3ZWVrJyk7XG4gICAgICAgIH0gZWxzZSBpZih0aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCAnd2VlaycpOyAvLyB0aGUgZGVmYXVsdCBjYXNlXG4gICAgICAgIH0gZWxzZSB7IC8vIGZpcnN0IGRheSBvZiB0aGUgd2Vla1xuICAgICAgICAgIGNvbnN0IG5leHRXZWVrID0gdGhpcy5jdXJyZW50LmNsb25lKCk7XG4gICAgICAgICAgbmV4dFdlZWsuYWRkKDEsICd3ZWVrJyk7XG4gICAgICAgICAgaWYobmV4dFdlZWsuaXNTYW1lKHRoaXMuY3VycmVudCwgJ21vbnRoJykpeyAvLyBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSBuZXh0IHdlZWsgaW4gdGhlIHNhbWUgbW9udGg/XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ3dlZWsnKTsgLy8gdGhlIGRlZmF1bHQgY2FzZVxuICAgICAgICAgIH0gZWxzZSB7IC8vIGluamVjdCBhIHN0ZXAgYXQgZWFjaCBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ3dlZWsnKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudC5kYXRlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21vbnRoJzogICAgICAgIHRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLCAnbW9udGgnKTsgYnJlYWs7XG4gICAgICBjYXNlICd5ZWFyJzogICAgICAgICB0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCwgJ3llYXInKTsgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RlcCAhPSAxKSB7XG4gICAgICAvLyByb3VuZCBkb3duIHRvIHRoZSBjb3JyZWN0IG1ham9yIHZhbHVlXG4gICAgICBzd2l0Y2ggKHRoaXMuc2NhbGUpIHtcbiAgICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOiAgaWYodGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpID4gMCAmJiB0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCkgPCB0aGlzLnN0ZXApIHRoaXMuY3VycmVudC5taWxsaXNlY29uZHMoMCk7ICBicmVhaztcbiAgICAgICAgY2FzZSAnc2Vjb25kJzogICAgICAgaWYodGhpcy5jdXJyZW50LnNlY29uZHMoKSA+IDAgJiYgdGhpcy5jdXJyZW50LnNlY29uZHMoKSA8IHRoaXMuc3RlcCkgdGhpcy5jdXJyZW50LnNlY29uZHMoMCk7ICBicmVhaztcbiAgICAgICAgY2FzZSAnbWludXRlJzogICAgICAgaWYodGhpcy5jdXJyZW50Lm1pbnV0ZXMoKSA+IDAgJiYgdGhpcy5jdXJyZW50Lm1pbnV0ZXMoKSA8IHRoaXMuc3RlcCkgdGhpcy5jdXJyZW50Lm1pbnV0ZXMoMCk7IGJyZWFrO1xuICAgICAgICBjYXNlICdob3VyJzogICAgICAgICBpZih0aGlzLmN1cnJlbnQuaG91cnMoKSA+IDAgJiYgdGhpcy5jdXJyZW50LmhvdXJzKCkgPCB0aGlzLnN0ZXApIHRoaXMuY3VycmVudC5ob3VycygwKTsgIGJyZWFrO1xuICAgICAgICBjYXNlICd3ZWVrZGF5JzogICAgICAvLyBpbnRlbnRpb25hbCBmYWxsIHRocm91Z2hcbiAgICAgICAgY2FzZSAnZGF5JzogICAgICAgICAgaWYodGhpcy5jdXJyZW50LmRhdGUoKSA8IHRoaXMuc3RlcCsxKSB0aGlzLmN1cnJlbnQuZGF0ZSgxKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3dlZWsnOiAgICAgICAgIGlmKHRoaXMuY3VycmVudC53ZWVrKCkgPCB0aGlzLnN0ZXApIHRoaXMuY3VycmVudC53ZWVrKDEpOyBicmVhazsgLy8gd2VlayBudW1iZXJpbmcgc3RhcnRzIGF0IDEsIG5vdCAwXG4gICAgICAgIGNhc2UgJ21vbnRoJzogICAgICAgIGlmKHRoaXMuY3VycmVudC5tb250aCgpIDwgdGhpcy5zdGVwKSB0aGlzLmN1cnJlbnQubW9udGgoMCk7ICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzYWZldHkgbWVjaGFuaXNtOiBpZiBjdXJyZW50IHRpbWUgaXMgc3RpbGwgdW5jaGFuZ2VkLCBtb3ZlIHRvIHRoZSBlbmRcbiAgICBpZiAodGhpcy5jdXJyZW50LnZhbHVlT2YoKSA9PSBwcmV2KSB7XG4gICAgICB0aGlzLmN1cnJlbnQgPSB0aGlzLl9lbmQuY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBzd2l0Y2hlcyBmb3IgeWVhciwgbW9udGggYW5kIGRheS4gV2lsbCBnZXQgc2V0IHRvIHRydWUgd2hlcmUgYXBwcm9wcmlhdGUgaW4gRGF0ZVV0aWwuc3RlcE92ZXJIaWRkZW5EYXRlc1xuICAgIHRoaXMuc3dpdGNoZWREYXkgPSBmYWxzZTtcbiAgICB0aGlzLnN3aXRjaGVkTW9udGggPSBmYWxzZTtcbiAgICB0aGlzLnN3aXRjaGVkWWVhciA9IGZhbHNlO1xuXG4gICAgc3RlcE92ZXJIaWRkZW5EYXRlcyh0aGlzLm1vbWVudCwgdGhpcywgcHJldik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGRhdGV0aW1lXG4gICAqIEByZXR1cm4ge01vbWVudH0gIGN1cnJlbnQgVGhlIGN1cnJlbnQgZGF0ZVxuICAgKi9cbiAgZ2V0Q3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50LmNsb25lKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY3VzdG9tIHNjYWxlLiBBdXRvc2NhbGluZyB3aWxsIGJlIGRpc2FibGVkLlxuICAgKiBGb3IgZXhhbXBsZSBzZXRTY2FsZSgnbWludXRlJywgNSkgd2lsbCByZXN1bHRcbiAgICogaW4gbWlub3Igc3RlcHMgb2YgNSBtaW51dGVzLCBhbmQgbWFqb3Igc3RlcHMgb2YgYW4gaG91ci5cbiAgICpcbiAgICogQHBhcmFtIHt7c2NhbGU6IHN0cmluZywgc3RlcDogbnVtYmVyfX0gcGFyYW1zXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIHR3byBwcm9wZXJ0aWVzOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgc3RyaW5nICdzY2FsZScuIENob29zZSBmcm9tICdtaWxsaXNlY29uZCcsICdzZWNvbmQnLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW51dGUnLCAnaG91cicsICd3ZWVrZGF5JywgJ2RheScsICd3ZWVrJywgJ21vbnRoJywgJ3llYXInLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEEgbnVtYmVyICdzdGVwJy4gQSBzdGVwIHNpemUsIGJ5IGRlZmF1bHQgMS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaG9vc2UgZm9yIGV4YW1wbGUgMSwgMiwgNSwgb3IgMTAuXG4gICAqL1xuICBzZXRTY2FsZShwYXJhbXMpIHtcbiAgICBpZiAocGFyYW1zICYmIHR5cGVvZiBwYXJhbXMuc2NhbGUgPT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuc2NhbGUgPSBwYXJhbXMuc2NhbGU7XG4gICAgICB0aGlzLnN0ZXAgPSBwYXJhbXMuc3RlcCA+IDAgPyBwYXJhbXMuc3RlcCA6IDE7XG4gICAgICB0aGlzLmF1dG9TY2FsZSA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgb3IgZGlzYWJsZSBhdXRvc2NhbGluZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZSAgSWYgdHJ1ZSwgYXV0b2FzY2FsaW5nIGlzIHNldCB0cnVlXG4gICAqL1xuICBzZXRBdXRvU2NhbGUoZW5hYmxlKSB7XG4gICAgdGhpcy5hdXRvU2NhbGUgPSBlbmFibGU7XG4gIH1cblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHNjYWxlIHRoYXQgYmVzdHMgZml0cyB0aGUgcHJvdmlkZWQgbWluaW11bSBzdGVwXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluaW11bVN0ZXBdICBUaGUgbWluaW11bSBzdGVwIHNpemUgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBzZXRNaW5pbXVtU3RlcChtaW5pbXVtU3RlcCkge1xuICAgIGlmIChtaW5pbXVtU3RlcCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvL3ZhciBiID0gYXNjICsgZHM7XG5cbiAgICBjb25zdCBzdGVwWWVhciAgICAgICA9ICgxMDAwICogNjAgKiA2MCAqIDI0ICogMzAgKiAxMik7XG4gICAgY29uc3Qgc3RlcE1vbnRoICAgICAgPSAoMTAwMCAqIDYwICogNjAgKiAyNCAqIDMwKTtcbiAgICBjb25zdCBzdGVwRGF5ICAgICAgICA9ICgxMDAwICogNjAgKiA2MCAqIDI0KTtcbiAgICBjb25zdCBzdGVwSG91ciAgICAgICA9ICgxMDAwICogNjAgKiA2MCk7XG4gICAgY29uc3Qgc3RlcE1pbnV0ZSAgICAgPSAoMTAwMCAqIDYwKTtcbiAgICBjb25zdCBzdGVwU2Vjb25kICAgICA9ICgxMDAwKTtcbiAgICBjb25zdCBzdGVwTWlsbGlzZWNvbmQ9ICgxKTtcblxuICAgIC8vIGZpbmQgdGhlIHNtYWxsZXN0IHN0ZXAgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgcHJvdmlkZWQgbWluaW11bVN0ZXBcbiAgICBpZiAoc3RlcFllYXIqMTAwMCA+IG1pbmltdW1TdGVwKSAgICAgICAge3RoaXMuc2NhbGUgPSAneWVhcic7ICAgICAgICB0aGlzLnN0ZXAgPSAxMDAwO31cbiAgICBpZiAoc3RlcFllYXIqNTAwID4gbWluaW11bVN0ZXApICAgICAgICAge3RoaXMuc2NhbGUgPSAneWVhcic7ICAgICAgICB0aGlzLnN0ZXAgPSA1MDA7fVxuICAgIGlmIChzdGVwWWVhcioxMDAgPiBtaW5pbXVtU3RlcCkgICAgICAgICB7dGhpcy5zY2FsZSA9ICd5ZWFyJzsgICAgICAgIHRoaXMuc3RlcCA9IDEwMDt9XG4gICAgaWYgKHN0ZXBZZWFyKjUwID4gbWluaW11bVN0ZXApICAgICAgICAgIHt0aGlzLnNjYWxlID0gJ3llYXInOyAgICAgICAgdGhpcy5zdGVwID0gNTA7fVxuICAgIGlmIChzdGVwWWVhcioxMCA+IG1pbmltdW1TdGVwKSAgICAgICAgICB7dGhpcy5zY2FsZSA9ICd5ZWFyJzsgICAgICAgIHRoaXMuc3RlcCA9IDEwO31cbiAgICBpZiAoc3RlcFllYXIqNSA+IG1pbmltdW1TdGVwKSAgICAgICAgICAge3RoaXMuc2NhbGUgPSAneWVhcic7ICAgICAgICB0aGlzLnN0ZXAgPSA1O31cbiAgICBpZiAoc3RlcFllYXIgPiBtaW5pbXVtU3RlcCkgICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAneWVhcic7ICAgICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcE1vbnRoKjMgPiBtaW5pbXVtU3RlcCkgICAgICAgICAge3RoaXMuc2NhbGUgPSAnbW9udGgnOyAgICAgICB0aGlzLnN0ZXAgPSAzO31cbiAgICBpZiAoc3RlcE1vbnRoID4gbWluaW11bVN0ZXApICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnbW9udGgnOyAgICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcERheSo3ID4gbWluaW11bVN0ZXAgJiYgdGhpcy5vcHRpb25zLnNob3dXZWVrU2NhbGUpICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnd2Vlayc7ICAgICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcERheSoyID4gbWluaW11bVN0ZXApICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnZGF5JzsgICAgICAgICB0aGlzLnN0ZXAgPSAyO31cbiAgICBpZiAoc3RlcERheSA+IG1pbmltdW1TdGVwKSAgICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnZGF5JzsgICAgICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcERheS8yID4gbWluaW11bVN0ZXApICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnd2Vla2RheSc7ICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcEhvdXIqNCA+IG1pbmltdW1TdGVwKSAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnaG91cic7ICAgICAgICB0aGlzLnN0ZXAgPSA0O31cbiAgICBpZiAoc3RlcEhvdXIgPiBtaW5pbXVtU3RlcCkgICAgICAgICAgICAge3RoaXMuc2NhbGUgPSAnaG91cic7ICAgICAgICB0aGlzLnN0ZXAgPSAxO31cbiAgICBpZiAoc3RlcE1pbnV0ZSoxNSA+IG1pbmltdW1TdGVwKSAgICAgICAge3RoaXMuc2NhbGUgPSAnbWludXRlJzsgICAgICB0aGlzLnN0ZXAgPSAxNTt9XG4gICAgaWYgKHN0ZXBNaW51dGUqMTAgPiBtaW5pbXVtU3RlcCkgICAgICAgIHt0aGlzLnNjYWxlID0gJ21pbnV0ZSc7ICAgICAgdGhpcy5zdGVwID0gMTA7fVxuICAgIGlmIChzdGVwTWludXRlKjUgPiBtaW5pbXVtU3RlcCkgICAgICAgICB7dGhpcy5zY2FsZSA9ICdtaW51dGUnOyAgICAgIHRoaXMuc3RlcCA9IDU7fVxuICAgIGlmIChzdGVwTWludXRlID4gbWluaW11bVN0ZXApICAgICAgICAgICB7dGhpcy5zY2FsZSA9ICdtaW51dGUnOyAgICAgIHRoaXMuc3RlcCA9IDE7fVxuICAgIGlmIChzdGVwU2Vjb25kKjE1ID4gbWluaW11bVN0ZXApICAgICAgICB7dGhpcy5zY2FsZSA9ICdzZWNvbmQnOyAgICAgIHRoaXMuc3RlcCA9IDE1O31cbiAgICBpZiAoc3RlcFNlY29uZCoxMCA+IG1pbmltdW1TdGVwKSAgICAgICAge3RoaXMuc2NhbGUgPSAnc2Vjb25kJzsgICAgICB0aGlzLnN0ZXAgPSAxMDt9XG4gICAgaWYgKHN0ZXBTZWNvbmQqNSA+IG1pbmltdW1TdGVwKSAgICAgICAgIHt0aGlzLnNjYWxlID0gJ3NlY29uZCc7ICAgICAgdGhpcy5zdGVwID0gNTt9XG4gICAgaWYgKHN0ZXBTZWNvbmQgPiBtaW5pbXVtU3RlcCkgICAgICAgICAgIHt0aGlzLnNjYWxlID0gJ3NlY29uZCc7ICAgICAgdGhpcy5zdGVwID0gMTt9XG4gICAgaWYgKHN0ZXBNaWxsaXNlY29uZCoyMDAgPiBtaW5pbXVtU3RlcCkgIHt0aGlzLnNjYWxlID0gJ21pbGxpc2Vjb25kJzsgdGhpcy5zdGVwID0gMjAwO31cbiAgICBpZiAoc3RlcE1pbGxpc2Vjb25kKjEwMCA+IG1pbmltdW1TdGVwKSAge3RoaXMuc2NhbGUgPSAnbWlsbGlzZWNvbmQnOyB0aGlzLnN0ZXAgPSAxMDA7fVxuICAgIGlmIChzdGVwTWlsbGlzZWNvbmQqNTAgPiBtaW5pbXVtU3RlcCkgICB7dGhpcy5zY2FsZSA9ICdtaWxsaXNlY29uZCc7IHRoaXMuc3RlcCA9IDUwO31cbiAgICBpZiAoc3RlcE1pbGxpc2Vjb25kKjEwID4gbWluaW11bVN0ZXApICAge3RoaXMuc2NhbGUgPSAnbWlsbGlzZWNvbmQnOyB0aGlzLnN0ZXAgPSAxMDt9XG4gICAgaWYgKHN0ZXBNaWxsaXNlY29uZCo1ID4gbWluaW11bVN0ZXApICAgIHt0aGlzLnNjYWxlID0gJ21pbGxpc2Vjb25kJzsgdGhpcy5zdGVwID0gNTt9XG4gICAgaWYgKHN0ZXBNaWxsaXNlY29uZCA+IG1pbmltdW1TdGVwKSAgICAgIHt0aGlzLnNjYWxlID0gJ21pbGxpc2Vjb25kJzsgdGhpcy5zdGVwID0gMTt9XG4gIH1cblxuICAvKipcbiAgICogU25hcCBhIGRhdGUgdG8gYSByb3VuZGVkIHZhbHVlLlxuICAgKiBUaGUgc25hcCBpbnRlcnZhbHMgYXJlIGRlcGVuZGVudCBvbiB0aGUgY3VycmVudCBzY2FsZSBhbmQgc3RlcC5cbiAgICogU3RhdGljIGZ1bmN0aW9uXG4gICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSAgICB0aGUgZGF0ZSB0byBiZSBzbmFwcGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2NhbGUgQ3VycmVudCBzY2FsZSwgY2FuIGJlICdtaWxsaXNlY29uZCcsICdzZWNvbmQnLFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgJ21pbnV0ZScsICdob3VyJywgJ3dlZWtkYXksICdkYXknLCAnd2VlaycsICdtb250aCcsICd5ZWFyJy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgIEN1cnJlbnQgc3RlcCAoMSwgMiwgNCwgNSwgLi4uXG4gICAqIEByZXR1cm4ge0RhdGV9IHNuYXBwZWREYXRlXG4gICAqL1xuICBzdGF0aWMgc25hcChkYXRlLCBzY2FsZSwgc3RlcCkge1xuICAgIGNvbnN0IGNsb25lID0gbW9tZW50KGRhdGUpO1xuXG4gICAgaWYgKHNjYWxlID09ICd5ZWFyJykge1xuICAgICAgY29uc3QgeWVhciA9IGNsb25lLnllYXIoKSArIE1hdGgucm91bmQoY2xvbmUubW9udGgoKSAvIDEyKTtcbiAgICAgIGNsb25lLnllYXIoTWF0aC5yb3VuZCh5ZWFyIC8gc3RlcCkgKiBzdGVwKTtcbiAgICAgIGNsb25lLm1vbnRoKDApO1xuICAgICAgY2xvbmUuZGF0ZSgwKTtcbiAgICAgIGNsb25lLmhvdXJzKDApO1xuICAgICAgY2xvbmUubWludXRlcygwKTtcbiAgICAgIGNsb25lLnNlY29uZHMoMCk7XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICdtb250aCcpIHtcbiAgICAgIGlmIChjbG9uZS5kYXRlKCkgPiAxNSkge1xuICAgICAgICBjbG9uZS5kYXRlKDEpO1xuICAgICAgICBjbG9uZS5hZGQoMSwgJ21vbnRoJyk7XG4gICAgICAgIC8vIGltcG9ydGFudDogZmlyc3Qgc2V0IERhdGUgdG8gMSwgYWZ0ZXIgdGhhdCBjaGFuZ2UgdGhlIG1vbnRoLlxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNsb25lLmRhdGUoMSk7XG4gICAgICB9XG5cbiAgICAgIGNsb25lLmhvdXJzKDApO1xuICAgICAgY2xvbmUubWludXRlcygwKTtcbiAgICAgIGNsb25lLnNlY29uZHMoMCk7XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICd3ZWVrJykge1xuICAgICAgICBpZiAoY2xvbmUud2Vla2RheSgpID4gMikgeyAvLyBkb2luZyBpdCB0aGUgbW9tZW50anMgbG9jYWxlIGF3YXJlIHdheVxuICAgICAgICAgICAgY2xvbmUud2Vla2RheSgwKTtcbiAgICAgICAgICAgIGNsb25lLmFkZCgxLCAnd2VlaycpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xvbmUud2Vla2RheSgwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNsb25lLmhvdXJzKDApO1xuICAgICAgICBjbG9uZS5taW51dGVzKDApO1xuICAgICAgICBjbG9uZS5zZWNvbmRzKDApO1xuICAgICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICdkYXknKSB7XG4gICAgICAvL25vaW5zcGVjdGlvbiBGYWxsdGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjbG9uZS5ob3VycyhNYXRoLnJvdW5kKGNsb25lLmhvdXJzKCkgLyAyNCkgKiAyNCk7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNsb25lLmhvdXJzKE1hdGgucm91bmQoY2xvbmUuaG91cnMoKSAvIDEyKSAqIDEyKTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBjbG9uZS5taW51dGVzKDApO1xuICAgICAgY2xvbmUuc2Vjb25kcygwKTtcbiAgICAgIGNsb25lLm1pbGxpc2Vjb25kcygwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NhbGUgPT0gJ3dlZWtkYXknKSB7XG4gICAgICAvL25vaW5zcGVjdGlvbiBGYWxsdGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjbG9uZS5ob3VycyhNYXRoLnJvdW5kKGNsb25lLmhvdXJzKCkgLyAxMikgKiAxMik7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNsb25lLmhvdXJzKE1hdGgucm91bmQoY2xvbmUuaG91cnMoKSAvIDYpICogNik7IGJyZWFrO1xuICAgICAgfVxuICAgICAgY2xvbmUubWludXRlcygwKTtcbiAgICAgIGNsb25lLnNlY29uZHMoMCk7XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICdob3VyJykge1xuICAgICAgc3dpdGNoIChzdGVwKSB7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjbG9uZS5taW51dGVzKE1hdGgucm91bmQoY2xvbmUubWludXRlcygpIC8gNjApICogNjApOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjbG9uZS5taW51dGVzKE1hdGgucm91bmQoY2xvbmUubWludXRlcygpIC8gMzApICogMzApOyBicmVhaztcbiAgICAgIH1cbiAgICAgIGNsb25lLnNlY29uZHMoMCk7XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfSBlbHNlIGlmIChzY2FsZSA9PSAnbWludXRlJykge1xuICAgICAgLy9ub2luc3BlY3Rpb24gRmFsbHRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICBzd2l0Y2ggKHN0ZXApIHtcbiAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICBjbG9uZS5taW51dGVzKE1hdGgucm91bmQoY2xvbmUubWludXRlcygpIC8gNSkgKiA1KTtcbiAgICAgICAgICBjbG9uZS5zZWNvbmRzKDApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgY2xvbmUuc2Vjb25kcyhNYXRoLnJvdW5kKGNsb25lLnNlY29uZHMoKSAvIDYwKSAqIDYwKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2xvbmUuc2Vjb25kcyhNYXRoLnJvdW5kKGNsb25lLnNlY29uZHMoKSAvIDMwKSAqIDMwKTsgYnJlYWs7XG4gICAgICB9XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoMCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICdzZWNvbmQnKSB7XG4gICAgICAvL25vaW5zcGVjdGlvbiBGYWxsdGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgIHN3aXRjaCAoc3RlcCkge1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIGNsb25lLnNlY29uZHMoTWF0aC5yb3VuZChjbG9uZS5zZWNvbmRzKCkgLyA1KSAqIDUpO1xuICAgICAgICAgIGNsb25lLm1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNsb25lLm1pbGxpc2Vjb25kcyhNYXRoLnJvdW5kKGNsb25lLm1pbGxpc2Vjb25kcygpIC8gMTAwMCkgKiAxMDAwKTsgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY2xvbmUubWlsbGlzZWNvbmRzKE1hdGgucm91bmQoY2xvbmUubWlsbGlzZWNvbmRzKCkgLyA1MDApICogNTAwKTsgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHNjYWxlID09ICdtaWxsaXNlY29uZCcpIHtcbiAgICAgIGNvbnN0IF9zdGVwID0gc3RlcCA+IDUgPyBzdGVwIC8gMiA6IDE7XG4gICAgICBjbG9uZS5taWxsaXNlY29uZHMoTWF0aC5yb3VuZChjbG9uZS5taWxsaXNlY29uZHMoKSAvIF9zdGVwKSAqIF9zdGVwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgYSBtYWpvciB2YWx1ZSAoZm9yIGV4YW1wbGUgd2hlbiB0aGUgc3RlcFxuICAgKiBpcyBEQVksIGEgbWFqb3IgdmFsdWUgaXMgZWFjaCBmaXJzdCBkYXkgb2YgdGhlIE1PTlRIKVxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGN1cnJlbnQgZGF0ZSBpcyBtYWpvciwgZWxzZSBmYWxzZS5cbiAgICovXG4gIGlzTWFqb3IoKSB7XG4gICAgaWYgKHRoaXMuc3dpdGNoZWRZZWFyID09IHRydWUpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5zY2FsZSkge1xuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnN3aXRjaGVkTW9udGggPT0gdHJ1ZSkge1xuICAgICAgc3dpdGNoICh0aGlzLnNjYWxlKSB7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3ZWVrZGF5JzpcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc3dpdGNoZWREYXkgPT0gdHJ1ZSkge1xuICAgICAgc3dpdGNoICh0aGlzLnNjYWxlKSB7XG4gICAgICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSB0aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpO1xuICAgIHN3aXRjaCAodGhpcy5zY2FsZSkge1xuICAgICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgICAgICByZXR1cm4gKGRhdGUubWlsbGlzZWNvbmRzKCkgPT0gMCk7XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICByZXR1cm4gKGRhdGUuc2Vjb25kcygpID09IDApO1xuICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgcmV0dXJuIChkYXRlLmhvdXJzKCkgPT0gMCkgJiYgKGRhdGUubWludXRlcygpID09IDApO1xuICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIHJldHVybiAoZGF0ZS5ob3VycygpID09IDApO1xuICAgICAgY2FzZSAnd2Vla2RheSc6IC8vIGludGVudGlvbmFsIGZhbGwgdGhyb3VnaFxuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgcmV0dXJuIChkYXRlLmRhdGUoKSA9PSAxKTtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICByZXR1cm4gKGRhdGUuZGF0ZSgpID09IDEpO1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICByZXR1cm4gKGRhdGUubW9udGgoKSA9PSAwKTtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZm9ybWF0dGVkIHRleHQgZm9yIHRoZSBtaW5vciBheGlzbGFiZWwsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudFxuICAgKiBkYXRlIGFuZCB0aGUgc2NhbGUuIEZvciBleGFtcGxlIHdoZW4gc2NhbGUgaXMgTUlOVVRFLCB0aGUgY3VycmVudCB0aW1lIGlzXG4gICAqIGZvcm1hdHRlZCBhcyBcImhoOm1tXCIuXG4gICAqIEBwYXJhbSB7RGF0ZX0gW2RhdGU9dGhpcy5jdXJyZW50XSBjdXN0b20gZGF0ZS4gaWYgbm90IHByb3ZpZGVkLCBjdXJyZW50IGRhdGUgaXMgdGFrZW5cbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICovXG4gIGdldExhYmVsTWlub3IoZGF0ZSkge1xuICAgIGlmIChkYXRlID09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0ZSA9IHRoaXMuY3VycmVudDtcbiAgICB9XG4gICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICBkYXRlID0gdGhpcy5tb21lbnQoZGF0ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZih0aGlzLmZvcm1hdC5taW5vckxhYmVscykgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0Lm1pbm9yTGFiZWxzKGRhdGUsIHRoaXMuc2NhbGUsIHRoaXMuc3RlcCk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0ID0gdGhpcy5mb3JtYXQubWlub3JMYWJlbHNbdGhpcy5zY2FsZV07XG4gICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgIHN3aXRjaCAodGhpcy5zY2FsZSkge1xuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIC8vIERvbid0IGRyYXcgdGhlIG1pbm9yIGxhYmVsIGlmIHRoaXMgZGF0ZSBpcyB0aGUgZmlyc3QgZGF5IG9mIGEgbW9udGggQU5EIGlmIGl0J3MgTk9UIHRoZSBzdGFydCBvZiB0aGUgd2Vlay5cbiAgICAgICAgLy8gVGhlICdkYXRlJyB2YXJpYWJsZSBtYXkgYWN0dWFsbHkgYmUgdGhlICduZXh0JyBzdGVwIHdoZW4gY2FsbGVkIGZyb20gVGltZUF4aXMnIF9yZXBhaW50TGFiZWxzLlxuICAgICAgICBpZihkYXRlLmRhdGUoKSA9PT0gMSAmJiBkYXRlLndlZWtkYXkoKSAhPT0gMCl7XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgICByZXR1cm4gKGZvcm1hdCAmJiBmb3JtYXQubGVuZ3RoID4gMCkgPyB0aGlzLm1vbWVudChkYXRlKS5mb3JtYXQoZm9ybWF0KSA6ICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZvcm1hdHRlZCB0ZXh0IGZvciB0aGUgbWFqb3IgYXhpcyBsYWJlbCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50XG4gICAqIGRhdGUgYW5kIHRoZSBzY2FsZS4gRm9yIGV4YW1wbGUgd2hlbiBzY2FsZSBpcyBNSU5VVEUsIHRoZSBtYWpvciBzY2FsZSBpc1xuICAgKiBob3VycywgYW5kIHRoZSBob3VyIHdpbGwgYmUgZm9ybWF0dGVkIGFzIFwiaGhcIi5cbiAgICogQHBhcmFtIHtEYXRlfSBbZGF0ZT10aGlzLmN1cnJlbnRdIGN1c3RvbSBkYXRlLiBpZiBub3QgcHJvdmlkZWQsIGN1cnJlbnQgZGF0ZSBpcyB0YWtlblxuICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgKi9cbiAgZ2V0TGFiZWxNYWpvcihkYXRlKSB7XG4gICAgaWYgKGRhdGUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRlID0gdGhpcy5jdXJyZW50O1xuICAgIH1cbiAgICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgIGRhdGUgPSB0aGlzLm1vbWVudChkYXRlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mKHRoaXMuZm9ybWF0Lm1ham9yTGFiZWxzKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb3JtYXQubWFqb3JMYWJlbHMoZGF0ZSwgdGhpcy5zY2FsZSwgdGhpcy5zdGVwKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JtYXQgPSB0aGlzLmZvcm1hdC5tYWpvckxhYmVsc1t0aGlzLnNjYWxlXTtcbiAgICByZXR1cm4gKGZvcm1hdCAmJiBmb3JtYXQubGVuZ3RoID4gMCkgPyB0aGlzLm1vbWVudChkYXRlKS5mb3JtYXQoZm9ybWF0KSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCBjbGFzcyBuYW1lXG4gICAqIEByZXR1cm4ge3N0cmluZ30gY2xhc3MgbmFtZVxuICAgKi9cbiAgZ2V0Q2xhc3NOYW1lKCkge1xuICAgIGNvbnN0IF9tb21lbnQgPSB0aGlzLm1vbWVudDtcbiAgICBjb25zdCBtID0gdGhpcy5tb21lbnQodGhpcy5jdXJyZW50KTtcbiAgICBjb25zdCBjdXJyZW50ID0gbS5sb2NhbGUgPyBtLmxvY2FsZSgnZW4nKSA6IG0ubGFuZygnZW4nKTsgLy8gb2xkIHZlcnNpb25zIG9mIG1vbWVudCBoYXZlIC5sYW5nKCkgZnVuY3Rpb25cbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwO1xuICAgIGNvbnN0IGNsYXNzTmFtZXMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBldmVuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKHZhbHVlIC8gc3RlcCAlIDIgPT0gMCkgPyAnIHZpcy1ldmVuJyA6ICcgdmlzLW9kZCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGVcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHRvZGF5KGRhdGUpIHtcbiAgICAgIGlmIChkYXRlLmlzU2FtZShEYXRlLm5vdygpLCAnZGF5JykpIHtcbiAgICAgICAgcmV0dXJuICcgdmlzLXRvZGF5JztcbiAgICAgIH1cbiAgICAgIGlmIChkYXRlLmlzU2FtZShfbW9tZW50KCkuYWRkKDEsICdkYXknKSwgJ2RheScpKSB7XG4gICAgICAgIHJldHVybiAnIHZpcy10b21vcnJvdyc7XG4gICAgICB9XG4gICAgICBpZiAoZGF0ZS5pc1NhbWUoX21vbWVudCgpLmFkZCgtMSwgJ2RheScpLCAnZGF5JykpIHtcbiAgICAgICAgcmV0dXJuICcgdmlzLXllc3RlcmRheSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGVcbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGN1cnJlbnRXZWVrKGRhdGUpIHtcbiAgICAgIHJldHVybiBkYXRlLmlzU2FtZShEYXRlLm5vdygpLCAnd2VlaycpID8gJyB2aXMtY3VycmVudC13ZWVrJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gICAgICogQHJldHVybnMge1N0cmluZ31cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjdXJyZW50TW9udGgoZGF0ZSkge1xuICAgICAgcmV0dXJuIGRhdGUuaXNTYW1lKERhdGUubm93KCksICdtb250aCcpID8gJyB2aXMtY3VycmVudC1tb250aCcgOiAnJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZVxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3VycmVudFllYXIoZGF0ZSkge1xuICAgICAgcmV0dXJuIGRhdGUuaXNTYW1lKERhdGUubm93KCksICd5ZWFyJykgPyAnIHZpcy1jdXJyZW50LXllYXInIDogJyc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnNjYWxlKSB7XG4gICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCh0b2RheShjdXJyZW50KSk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChldmVuKGN1cnJlbnQubWlsbGlzZWNvbmRzKCkpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICBjbGFzc05hbWVzLnB1c2godG9kYXkoY3VycmVudCkpO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goZXZlbihjdXJyZW50LnNlY29uZHMoKSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCh0b2RheShjdXJyZW50KSk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChldmVuKGN1cnJlbnQubWludXRlcygpKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChgdmlzLWgke2N1cnJlbnQuaG91cnMoKX0ke3RoaXMuc3RlcCA9PSA0ID8gJy1oJyArIChjdXJyZW50LmhvdXJzKCkgKyA0KSA6ICcnfWApO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2godG9kYXkoY3VycmVudCkpO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goZXZlbihjdXJyZW50LmhvdXJzKCkpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ZWVrZGF5JzpcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGB2aXMtJHtjdXJyZW50LmZvcm1hdCgnZGRkZCcpLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCh0b2RheShjdXJyZW50KSk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChjdXJyZW50V2VlayhjdXJyZW50KSk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChldmVuKGN1cnJlbnQuZGF0ZSgpKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGB2aXMtZGF5JHtjdXJyZW50LmRhdGUoKX1gKTtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGB2aXMtJHtjdXJyZW50LmZvcm1hdCgnTU1NTScpLnRvTG93ZXJDYXNlKCl9YCk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaCh0b2RheShjdXJyZW50KSk7XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChjdXJyZW50TW9udGgoY3VycmVudCkpO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2godGhpcy5zdGVwIDw9IDIgPyB0b2RheShjdXJyZW50KSA6ICcnKTtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKHRoaXMuc3RlcCA8PSAyID8gYHZpcy0ke2N1cnJlbnQuZm9ybWF0KCdkZGRkJykudG9Mb3dlckNhc2UoKX1gIDogJycpO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goZXZlbihjdXJyZW50LmRhdGUoKSAtIDEpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGB2aXMtd2VlayR7Y3VycmVudC5mb3JtYXQoJ3cnKX1gKTtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGN1cnJlbnRXZWVrKGN1cnJlbnQpKTtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGV2ZW4oY3VycmVudC53ZWVrKCkpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChgdmlzLSR7Y3VycmVudC5mb3JtYXQoJ01NTU0nKS50b0xvd2VyQ2FzZSgpfWApO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goY3VycmVudE1vbnRoKGN1cnJlbnQpKTtcbiAgICAgICAgY2xhc3NOYW1lcy5wdXNoKGV2ZW4oY3VycmVudC5tb250aCgpKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIGNsYXNzTmFtZXMucHVzaChgdmlzLXllYXIke2N1cnJlbnQueWVhcigpfWApO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goY3VycmVudFllYXIoY3VycmVudCkpO1xuICAgICAgICBjbGFzc05hbWVzLnB1c2goZXZlbihjdXJyZW50LnllYXIoKSkpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIGNsYXNzTmFtZXMuZmlsdGVyKFN0cmluZykuam9pbihcIiBcIik7XG4gIH1cbn1cblxuLy8gVGltZSBmb3JtYXR0aW5nXG5UaW1lU3RlcC5GT1JNQVQgPSB7XG4gIG1pbm9yTGFiZWxzOiB7XG4gICAgbWlsbGlzZWNvbmQ6J1NTUycsXG4gICAgc2Vjb25kOiAgICAgJ3MnLFxuICAgIG1pbnV0ZTogICAgICdISDptbScsXG4gICAgaG91cjogICAgICAgJ0hIOm1tJyxcbiAgICB3ZWVrZGF5OiAgICAnZGRkIEQnLFxuICAgIGRheTogICAgICAgICdEJyxcbiAgICB3ZWVrOiAgICAgICAndycsXG4gICAgbW9udGg6ICAgICAgJ01NTScsXG4gICAgeWVhcjogICAgICAgJ1lZWVknXG4gIH0sXG4gIG1ham9yTGFiZWxzOiB7XG4gICAgbWlsbGlzZWNvbmQ6J0hIOm1tOnNzJyxcbiAgICBzZWNvbmQ6ICAgICAnRCBNTU1NIEhIOm1tJyxcbiAgICBtaW51dGU6ICAgICAnZGRkIEQgTU1NTScsXG4gICAgaG91cjogICAgICAgJ2RkZCBEIE1NTU0nLFxuICAgIHdlZWtkYXk6ICAgICdNTU1NIFlZWVknLFxuICAgIGRheTogICAgICAgICdNTU1NIFlZWVknLFxuICAgIHdlZWs6ICAgICAgICdNTU1NIFlZWVknLFxuICAgIG1vbnRoOiAgICAgICdZWVlZJyxcbiAgICB5ZWFyOiAgICAgICAnJ1xuICB9XG59O1xuXG4vKiogQSBob3Jpem9udGFsIHRpbWUgYXhpcyAqL1xuY2xhc3MgVGltZUF4aXMgZXh0ZW5kcyBDb21wb25lbnQge1xuLyoqXG4gKiBAcGFyYW0ge3tkb206IE9iamVjdCwgZG9tUHJvcHM6IE9iamVjdCwgZW1pdHRlcjogRW1pdHRlciwgcmFuZ2U6IFJhbmdlfX0gYm9keVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgICAgU2VlIFRpbWVBeGlzLnNldE9wdGlvbnMgZm9yIHRoZSBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3IgVGltZUF4aXNcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICovXG4gIGNvbnN0cnVjdG9yKGJvZHksIG9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZG9tID0ge1xuICAgICAgZm9yZWdyb3VuZDogbnVsbCxcbiAgICAgIGxpbmVzOiBbXSxcbiAgICAgIG1ham9yVGV4dHM6IFtdLFxuICAgICAgbWlub3JUZXh0czogW10sXG4gICAgICByZWR1bmRhbnQ6IHtcbiAgICAgICAgbGluZXM6IFtdLFxuICAgICAgICBtYWpvclRleHRzOiBbXSxcbiAgICAgICAgbWlub3JUZXh0czogW11cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiAwLFxuICAgICAgICBtaW5pbXVtU3RlcDogMFxuICAgICAgfSxcbiAgICAgIGxpbmVUb3A6IDBcbiAgICB9O1xuXG4gICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgIG9yaWVudGF0aW9uOiB7XG4gICAgICAgIGF4aXM6ICdib3R0b20nXG4gICAgICB9LCAgLy8gYXhpcyBvcmllbnRhdGlvbjogJ3RvcCcgb3IgJ2JvdHRvbSdcbiAgICAgIHNob3dNaW5vckxhYmVsczogdHJ1ZSxcbiAgICAgIHNob3dNYWpvckxhYmVsczogdHJ1ZSxcbiAgICAgIHNob3dXZWVrU2NhbGU6IGZhbHNlLFxuICAgICAgbWF4TWlub3JDaGFyczogNyxcbiAgICAgIGZvcm1hdDogdXRpbC5leHRlbmQoe30sIFRpbWVTdGVwLkZPUk1BVCksXG4gICAgICBtb21lbnQsXG4gICAgICB0aW1lQXhpczogbnVsbFxuICAgIH07XG4gICAgdGhpcy5vcHRpb25zID0gdXRpbC5leHRlbmQoe30sIHRoaXMuZGVmYXVsdE9wdGlvbnMpO1xuXG4gICAgdGhpcy5ib2R5ID0gYm9keTtcblxuICAgIC8vIGNyZWF0ZSB0aGUgSFRNTCBET01cbiAgICB0aGlzLl9jcmVhdGUoKTtcblxuICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3B0aW9ucyBmb3IgdGhlIFRpbWVBeGlzLlxuICAgKiBQYXJhbWV0ZXJzIHdpbGwgYmUgbWVyZ2VkIGluIGN1cnJlbnQgb3B0aW9ucy5cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ30gW29yaWVudGF0aW9uLmF4aXNdXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gW3Nob3dNaW5vckxhYmVsc11cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHtib29sZWFufSBbc2hvd01ham9yTGFiZWxzXVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IFtzaG93V2Vla1NjYWxlXVxuICAgKi9cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIC8vIGNvcHkgYWxsIG9wdGlvbnMgdGhhdCB3ZSBrbm93XG4gICAgICB1dGlsLnNlbGVjdGl2ZUV4dGVuZChbXG4gICAgICAgICdzaG93TWlub3JMYWJlbHMnLFxuICAgICAgICAnc2hvd01ham9yTGFiZWxzJyxcbiAgICAgICAgJ3Nob3dXZWVrU2NhbGUnLFxuICAgICAgICAnbWF4TWlub3JDaGFycycsXG4gICAgICAgICdoaWRkZW5EYXRlcycsXG4gICAgICAgICd0aW1lQXhpcycsXG4gICAgICAgICdtb21lbnQnLFxuICAgICAgICAncnRsJ1xuICAgICAgXSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcblxuICAgICAgLy8gZGVlcCBjb3B5IHRoZSBmb3JtYXQgb3B0aW9uc1xuICAgICAgdXRpbC5zZWxlY3RpdmVEZWVwRXh0ZW5kKFsnZm9ybWF0J10sIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgIGlmICgnb3JpZW50YXRpb24nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm9yaWVudGF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzID0gb3B0aW9ucy5vcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ29iamVjdCcgJiYgJ2F4aXMnIGluIG9wdGlvbnMub3JpZW50YXRpb24pIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyA9IG9wdGlvbnMub3JpZW50YXRpb24uYXhpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBhcHBseSBsb2NhbGUgdG8gbW9tZW50LmpzXG4gICAgICAvLyBUT0RPOiBub3Qgc28gbmljZSwgdGhpcyBpcyBhcHBsaWVkIGdsb2JhbGx5IHRvIG1vbWVudC5qc1xuICAgICAgaWYgKCdsb2NhbGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBtb21lbnQubG9jYWxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgLy8gbW9tZW50LmpzIDIuOC4xK1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUob3B0aW9ucy5sb2NhbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIG1vbWVudC5sYW5nKG9wdGlvbnMubG9jYWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEhUTUwgRE9NIGZvciB0aGUgVGltZUF4aXNcbiAgICovXG4gIF9jcmVhdGUoKSB7XG4gICAgdGhpcy5kb20uZm9yZWdyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmJhY2tncm91bmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIHRoaXMuZG9tLmZvcmVncm91bmQuY2xhc3NOYW1lID0gJ3Zpcy10aW1lLWF4aXMgdmlzLWZvcmVncm91bmQnO1xuICAgIHRoaXMuZG9tLmJhY2tncm91bmQuY2xhc3NOYW1lID0gJ3Zpcy10aW1lLWF4aXMgdmlzLWJhY2tncm91bmQnO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIFRpbWVBeGlzXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIC8vIHJlbW92ZSBmcm9tIERPTVxuICAgIGlmICh0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuZG9tLmZvcmVncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVwYWludCB0aGUgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHJlc2l6ZWRcbiAgICovXG4gIHJlZHJhdygpIHtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgZm9yZWdyb3VuZCA9IHRoaXMuZG9tLmZvcmVncm91bmQ7XG4gICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZG9tLmJhY2tncm91bmQ7XG5cbiAgICAvLyBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgcGFyZW50IERPTSBlbGVtZW50IChkZXBlbmRpbmcgb24gb3B0aW9uIG9yaWVudGF0aW9uKVxuICAgIGNvbnN0IHBhcmVudCA9ICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyA9PSAndG9wJykgPyB0aGlzLmJvZHkuZG9tLnRvcCA6IHRoaXMuYm9keS5kb20uYm90dG9tO1xuICAgIGNvbnN0IHBhcmVudENoYW5nZWQgPSAoZm9yZWdyb3VuZC5wYXJlbnROb2RlICE9PSBwYXJlbnQpO1xuXG4gICAgLy8gY2FsY3VsYXRlIGNoYXJhY3RlciB3aWR0aCBhbmQgaGVpZ2h0XG4gICAgdGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKTtcblxuICAgIC8vIFRPRE86IHJlY2FsY3VsYXRlIHNpemVzIG9ubHkgbmVlZGVkIHdoZW4gcGFyZW50IGlzIHJlc2l6ZWQgb3Igb3B0aW9ucyBpcyBjaGFuZ2VkXG4gICAgY29uc3Qgc2hvd01pbm9yTGFiZWxzID0gdGhpcy5vcHRpb25zLnNob3dNaW5vckxhYmVscyAmJiB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyAhPT0gJ25vbmUnO1xuICAgIGNvbnN0IHNob3dNYWpvckxhYmVscyA9IHRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHMgJiYgdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMgIT09ICdub25lJztcblxuICAgIC8vIGRldGVybWluZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZWxlbWVucyBmb3IgdGhlIGF4aXNcbiAgICBwcm9wcy5taW5vckxhYmVsSGVpZ2h0ID0gc2hvd01pbm9yTGFiZWxzID8gcHJvcHMubWlub3JDaGFySGVpZ2h0IDogMDtcbiAgICBwcm9wcy5tYWpvckxhYmVsSGVpZ2h0ID0gc2hvd01ham9yTGFiZWxzID8gcHJvcHMubWFqb3JDaGFySGVpZ2h0IDogMDtcbiAgICBwcm9wcy5oZWlnaHQgPSBwcm9wcy5taW5vckxhYmVsSGVpZ2h0ICsgcHJvcHMubWFqb3JMYWJlbEhlaWdodDtcbiAgICBwcm9wcy53aWR0aCA9IGZvcmVncm91bmQub2Zmc2V0V2lkdGg7XG5cbiAgICBwcm9wcy5taW5vckxpbmVIZWlnaHQgPSB0aGlzLmJvZHkuZG9tUHJvcHMucm9vdC5oZWlnaHQgLSBwcm9wcy5tYWpvckxhYmVsSGVpZ2h0IC1cbiAgICAgICAgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzID09ICd0b3AnID8gdGhpcy5ib2R5LmRvbVByb3BzLmJvdHRvbS5oZWlnaHQgOiB0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCk7XG4gICAgcHJvcHMubWlub3JMaW5lV2lkdGggPSAxOyAvLyBUT0RPOiByZWFsbHkgY2FsY3VsYXRlIHdpZHRoXG4gICAgcHJvcHMubWFqb3JMaW5lSGVpZ2h0ID0gcHJvcHMubWlub3JMaW5lSGVpZ2h0ICsgcHJvcHMubWFqb3JMYWJlbEhlaWdodDtcbiAgICBwcm9wcy5tYWpvckxpbmVXaWR0aCA9IDE7IC8vIFRPRE86IHJlYWxseSBjYWxjdWxhdGUgd2lkdGhcblxuICAgIC8vICB0YWtlIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgb2ZmbGluZSB3aGlsZSB1cGRhdGluZyAoaXMgYWxtb3N0IHR3aWNlIGFzIGZhc3QpXG4gICAgY29uc3QgZm9yZWdyb3VuZE5leHRTaWJsaW5nID0gZm9yZWdyb3VuZC5uZXh0U2libGluZztcbiAgICBjb25zdCBiYWNrZ3JvdW5kTmV4dFNpYmxpbmcgPSBiYWNrZ3JvdW5kLm5leHRTaWJsaW5nO1xuICAgIGZvcmVncm91bmQucGFyZW50Tm9kZSAmJiBmb3JlZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZm9yZWdyb3VuZCk7XG4gICAgYmFja2dyb3VuZC5wYXJlbnROb2RlICYmIGJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZ3JvdW5kKTtcblxuICAgIGZvcmVncm91bmQuc3R5bGUuaGVpZ2h0ID0gYCR7dGhpcy5wcm9wcy5oZWlnaHR9cHhgO1xuXG4gICAgdGhpcy5fcmVwYWludExhYmVscygpO1xuXG4gICAgLy8gcHV0IERPTSBvbmxpbmUgYWdhaW4gKGF0IHRoZSBzYW1lIHBsYWNlKVxuICAgIGlmIChmb3JlZ3JvdW5kTmV4dFNpYmxpbmcpIHtcbiAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoZm9yZWdyb3VuZCwgZm9yZWdyb3VuZE5leHRTaWJsaW5nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoZm9yZWdyb3VuZCk7XG4gICAgfVxuICAgIGlmIChiYWNrZ3JvdW5kTmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsLmluc2VydEJlZm9yZShiYWNrZ3JvdW5kLCBiYWNrZ3JvdW5kTmV4dFNpYmxpbmcpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsLmFwcGVuZENoaWxkKGJhY2tncm91bmQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faXNSZXNpemVkKCkgfHwgcGFyZW50Q2hhbmdlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaW50IG1ham9yIGFuZCBtaW5vciB0ZXh0IGxhYmVscyBhbmQgdmVydGljYWwgZ3JpZCBsaW5lc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlcGFpbnRMYWJlbHMoKSB7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcztcblxuICAgIC8vIGNhbGN1bGF0ZSByYW5nZSBhbmQgc3RlcCAoc3RlcCBzdWNoIHRoYXQgd2UgaGF2ZSBzcGFjZSBmb3IgNyBjaGFyYWN0ZXJzIHBlciBsYWJlbClcbiAgICBjb25zdCBzdGFydCA9IHV0aWwuY29udmVydCh0aGlzLmJvZHkucmFuZ2Uuc3RhcnQsICdOdW1iZXInKTtcbiAgICBjb25zdCBlbmQgPSB1dGlsLmNvbnZlcnQodGhpcy5ib2R5LnJhbmdlLmVuZCwgJ051bWJlcicpO1xuICAgIGNvbnN0IHRpbWVMYWJlbHNpemUgPSB0aGlzLmJvZHkudXRpbC50b1RpbWUoKHRoaXMucHJvcHMubWlub3JDaGFyV2lkdGggfHwgMTApICogdGhpcy5vcHRpb25zLm1heE1pbm9yQ2hhcnMpLnZhbHVlT2YoKTtcbiAgICBsZXQgbWluaW11bVN0ZXAgPSB0aW1lTGFiZWxzaXplIC0gZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCwgdGhpcy5ib2R5LmhpZGRlbkRhdGVzLCB0aGlzLmJvZHkucmFuZ2UsIHRpbWVMYWJlbHNpemUpO1xuICAgIG1pbmltdW1TdGVwIC09IHRoaXMuYm9keS51dGlsLnRvVGltZSgwKS52YWx1ZU9mKCk7XG5cbiAgICBjb25zdCBzdGVwID0gbmV3IFRpbWVTdGVwKG5ldyBEYXRlKHN0YXJ0KSwgbmV3IERhdGUoZW5kKSwgbWluaW11bVN0ZXAsIHRoaXMuYm9keS5oaWRkZW5EYXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICBzdGVwLnNldE1vbWVudCh0aGlzLm9wdGlvbnMubW9tZW50KTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmZvcm1hdCkge1xuICAgICAgc3RlcC5zZXRGb3JtYXQodGhpcy5vcHRpb25zLmZvcm1hdCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMudGltZUF4aXMpIHtcbiAgICAgIHN0ZXAuc2V0U2NhbGUodGhpcy5vcHRpb25zLnRpbWVBeGlzKTtcbiAgICB9XG4gICAgdGhpcy5zdGVwID0gc3RlcDtcblxuICAgIC8vIE1vdmUgYWxsIERPTSBlbGVtZW50cyB0byBhIFwicmVkdW5kYW50XCIgbGlzdCwgd2hlcmUgdGhleVxuICAgIC8vIGNhbiBiZSBwaWNrZWQgZm9yIHJlLXVzZSwgYW5kIGNsZWFyIHRoZSBsaXN0cyB3aXRoIGxpbmVzIGFuZCB0ZXh0cy5cbiAgICAvLyBBdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbiBfcmVwYWludExhYmVscywgbGVmdCBvdmVyIGVsZW1lbnRzIHdpbGwgYmUgY2xlYW5lZCB1cFxuICAgIGNvbnN0IGRvbSA9IHRoaXMuZG9tO1xuICAgIGRvbS5yZWR1bmRhbnQubGluZXMgPSBkb20ubGluZXM7XG4gICAgZG9tLnJlZHVuZGFudC5tYWpvclRleHRzID0gZG9tLm1ham9yVGV4dHM7XG4gICAgZG9tLnJlZHVuZGFudC5taW5vclRleHRzID0gZG9tLm1pbm9yVGV4dHM7XG4gICAgZG9tLmxpbmVzID0gW107XG4gICAgZG9tLm1ham9yVGV4dHMgPSBbXTtcbiAgICBkb20ubWlub3JUZXh0cyA9IFtdO1xuXG4gICAgbGV0IGN1cnJlbnQ7XG4gICAgbGV0IG5leHQ7XG4gICAgbGV0IHg7XG4gICAgbGV0IHhOZXh0O1xuICAgIGxldCBpc01ham9yO1xuICAgIGxldCBzaG93TWlub3JHcmlkO1xuICAgIGxldCB3aWR0aCA9IDA7XG4gICAgbGV0IHByZXZXaWR0aDtcbiAgICBsZXQgbGluZTtcbiAgICBsZXQgeEZpcnN0TWFqb3JMYWJlbCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGNvbnN0IE1BWCA9IDEwMDA7XG4gICAgbGV0IGNsYXNzTmFtZTtcblxuICAgIHN0ZXAuc3RhcnQoKTtcbiAgICBuZXh0ID0gc3RlcC5nZXRDdXJyZW50KCk7XG4gICAgeE5leHQgPSB0aGlzLmJvZHkudXRpbC50b1NjcmVlbihuZXh0KTtcbiAgICB3aGlsZSAoc3RlcC5oYXNOZXh0KCkgJiYgY291bnQgPCBNQVgpIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGlzTWFqb3IgPSBzdGVwLmlzTWFqb3IoKTtcbiAgICAgIGNsYXNzTmFtZSA9IHN0ZXAuZ2V0Q2xhc3NOYW1lKCk7XG5cbiAgICAgIGN1cnJlbnQgPSBuZXh0O1xuICAgICAgeCA9IHhOZXh0O1xuXG4gICAgICBzdGVwLm5leHQoKTtcbiAgICAgIG5leHQgPSBzdGVwLmdldEN1cnJlbnQoKTtcbiAgICAgIHhOZXh0ID0gdGhpcy5ib2R5LnV0aWwudG9TY3JlZW4obmV4dCk7XG5cbiAgICAgIHByZXZXaWR0aCA9IHdpZHRoO1xuICAgICAgd2lkdGggPSB4TmV4dCAtIHg7XG4gICAgICBzd2l0Y2ggKHN0ZXAuc2NhbGUpIHtcbiAgICAgICAgY2FzZSAnd2Vlayc6ICAgICAgICAgc2hvd01pbm9yR3JpZCA9IHRydWU7IGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICBzaG93TWlub3JHcmlkID0gKHdpZHRoID49IHByZXZXaWR0aCAqIDAuNCk7IGJyZWFrOyAvLyBwcmV2ZW50IGRpc3BsYXlpbmcgb2YgdGhlIDMxdGggb2YgdGhlIG1vbnRoIG9uIGEgc2NhbGUgb2YgNSBkYXlzXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzICYmIHNob3dNaW5vckdyaWQpIHtcbiAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5fcmVwYWludE1pbm9yVGV4dCh4LCBzdGVwLmdldExhYmVsTWlub3IoY3VycmVudCksIG9yaWVudGF0aW9uLCBjbGFzc05hbWUpO1xuICAgICAgICBsYWJlbC5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDsgLy8gc2V0IHdpZHRoIHRvIHByZXZlbnQgb3ZlcmZsb3dcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWFqb3IgJiYgdGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscykge1xuICAgICAgICBpZiAoeCA+IDApIHtcbiAgICAgICAgICBpZiAoeEZpcnN0TWFqb3JMYWJlbCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHhGaXJzdE1ham9yTGFiZWwgPSB4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYWJlbCA9IHRoaXMuX3JlcGFpbnRNYWpvclRleHQoeCwgc3RlcC5nZXRMYWJlbE1ham9yKGN1cnJlbnQpLCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lID0gdGhpcy5fcmVwYWludE1ham9yTGluZSh4LCB3aWR0aCwgb3JpZW50YXRpb24sIGNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHsgLy8gbWlub3IgbGluZVxuICAgICAgICBpZiAoc2hvd01pbm9yR3JpZCkge1xuICAgICAgICAgIGxpbmUgPSB0aGlzLl9yZXBhaW50TWlub3JMaW5lKHgsIHdpZHRoLCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAobGluZSkge1xuICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSB3aWR0aCBvZiB0aGUgcHJldmlvdXMgZ3JpZFxuICAgICAgICAgICAgbGluZS5zdHlsZS53aWR0aCA9IGAke3BhcnNlSW50KGxpbmUuc3R5bGUud2lkdGgpICsgd2lkdGh9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb3VudCA9PT0gTUFYICYmICF3YXJuZWRGb3JPdmVyZmxvdykge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIHRoZSBUaW1lbGluZSBzY2FsZS4gTGltaXRlZCBkcmF3aW5nIG9mIGdyaWQgbGluZXMgdG8gJHtNQVh9IGxpbmVzLmApO1xuICAgICAgICB3YXJuZWRGb3JPdmVyZmxvdyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgbWFqb3IgbGFiZWwgb24gdGhlIGxlZnQgd2hlbiBuZWVkZWRcbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscykge1xuICAgICAgY29uc3QgbGVmdFRpbWUgPSB0aGlzLmJvZHkudXRpbC50b1RpbWUoMCk7IC8vIHVwcGVyIGJvdW5kIGVzdGltYXRpb25cbiAgICAgIGNvbnN0IGxlZnRUZXh0ID0gc3RlcC5nZXRMYWJlbE1ham9yKGxlZnRUaW1lKTtcbiAgICAgIGNvbnN0IHdpZHRoVGV4dCA9IGxlZnRUZXh0Lmxlbmd0aCAqICh0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoIHx8IDEwKSArIDEwO1xuXG4gICAgICBpZiAoeEZpcnN0TWFqb3JMYWJlbCA9PSB1bmRlZmluZWQgfHwgd2lkdGhUZXh0IDwgeEZpcnN0TWFqb3JMYWJlbCkge1xuICAgICAgICB0aGlzLl9yZXBhaW50TWFqb3JUZXh0KDAsIGxlZnRUZXh0LCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhbnVwIGxlZnRvdmVyIERPTSBlbGVtZW50cyBmcm9tIHRoZSByZWR1bmRhbnQgbGlzdFxuICAgIHV0aWwuZm9yRWFjaCh0aGlzLmRvbS5yZWR1bmRhbnQsIGFyciA9PiB7XG4gICAgICB3aGlsZSAoYXJyLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBlbGVtID0gYXJyLnBvcCgpO1xuICAgICAgICBpZiAoZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBlbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtaW5vciBsYWJlbCBmb3IgdGhlIGF4aXMgYXQgcG9zaXRpb24geFxuICAgKiBAcGFyYW0ge251bWJlcn0geFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JpZW50YXRpb24gICBcInRvcFwiIG9yIFwiYm90dG9tXCIgKGRlZmF1bHQpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAgICogQHJldHVybiB7RWxlbWVudH0gUmV0dXJucyB0aGUgSFRNTCBlbGVtZW50IG9mIHRoZSBjcmVhdGVkIGxhYmVsXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVwYWludE1pbm9yVGV4dCh4LCB0ZXh0LCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKSB7XG4gICAgLy8gcmV1c2UgcmVkdW5kYW50IGxhYmVsXG4gICAgbGV0IGxhYmVsID0gdGhpcy5kb20ucmVkdW5kYW50Lm1pbm9yVGV4dHMuc2hpZnQoKTtcblxuICAgIGlmICghbGFiZWwpIHtcbiAgICAgIC8vIGNyZWF0ZSBuZXcgbGFiZWxcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgICBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICB0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICB9XG4gICAgdGhpcy5kb20ubWlub3JUZXh0cy5wdXNoKGxhYmVsKTtcbiAgICBsYWJlbC5pbm5lckhUTUwgPSB1dGlsLnhzcyh0ZXh0KTtcblxuXG4gICAgbGV0IHkgPSAob3JpZW50YXRpb24gPT0gJ3RvcCcpID8gdGhpcy5wcm9wcy5tYWpvckxhYmVsSGVpZ2h0IDogMDtcbiAgICB0aGlzLl9zZXRYWShsYWJlbCwgeCwgeSk7XG5cbiAgICBsYWJlbC5jbGFzc05hbWUgPSBgdmlzLXRleHQgdmlzLW1pbm9yICR7Y2xhc3NOYW1lfWA7XG4gICAgLy9sYWJlbC50aXRsZSA9IHRpdGxlOyAgLy8gVE9ETzogdGhpcyBpcyBhIGhlYXZ5IG9wZXJhdGlvblxuXG4gICAgcmV0dXJuIGxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1ham9yIGxhYmVsIGZvciB0aGUgYXhpcyBhdCBwb3NpdGlvbiB4XG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmllbnRhdGlvbiAgIFwidG9wXCIgb3IgXCJib3R0b21cIiAoZGVmYXVsdClcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBIVE1MIGVsZW1lbnQgb2YgdGhlIGNyZWF0ZWQgbGFiZWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXBhaW50TWFqb3JUZXh0KHgsIHRleHQsIG9yaWVudGF0aW9uLCBjbGFzc05hbWUpIHtcbiAgICAvLyByZXVzZSByZWR1bmRhbnQgbGFiZWxcbiAgICBsZXQgbGFiZWwgPSB0aGlzLmRvbS5yZWR1bmRhbnQubWFqb3JUZXh0cy5zaGlmdCgpO1xuXG4gICAgaWYgKCFsYWJlbCkge1xuICAgICAgLy8gY3JlYXRlIGxhYmVsXG4gICAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbGFiZWwuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICB0aGlzLmRvbS5mb3JlZ3JvdW5kLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICB9XG5cbiAgICBsYWJlbC5jaGlsZE5vZGVzWzBdLmlubmVySFRNTCA9IHV0aWwueHNzKHRleHQpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9IGB2aXMtdGV4dCB2aXMtbWFqb3IgJHtjbGFzc05hbWV9YDtcbiAgICAvL2xhYmVsLnRpdGxlID0gdGl0bGU7IC8vIFRPRE86IHRoaXMgaXMgYSBoZWF2eSBvcGVyYXRpb25cblxuICAgIGxldCB5ID0gKG9yaWVudGF0aW9uID09ICd0b3AnKSA/IDAgOiB0aGlzLnByb3BzLm1pbm9yTGFiZWxIZWlnaHQ7XG4gICAgdGhpcy5fc2V0WFkobGFiZWwsIHgsIHkpO1xuXG4gICAgdGhpcy5kb20ubWFqb3JUZXh0cy5wdXNoKGxhYmVsKTtcbiAgICByZXR1cm4gbGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogc2V0cyB4eVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAgICogQHBhcmFtIHtudW1iZXJ9IHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IHlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRYWShsYWJlbCwgeCwgeSkge1xuICAgIC8vIElmIHJ0bCBpcyB0cnVlLCBpbnZlcnNlIHguXG4gICAgY29uc3QgZGlyZWN0aW9uWCA9IHRoaXMub3B0aW9ucy5ydGwgPyAoeCAqIC0xKSA6IHg7XG4gICAgbGFiZWwuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke2RpcmVjdGlvblh9cHgsICR7eX1weClgO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1pbm9yIGxpbmUgZm9yIHRoZSBheGlzIGF0IHBvc2l0aW9uIHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlZnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmllbnRhdGlvbiAgIFwidG9wXCIgb3IgXCJib3R0b21cIiAoZGVmYXVsdClcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBjcmVhdGVkIGxpbmVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXBhaW50TWlub3JMaW5lKGxlZnQsIHdpZHRoLCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKSB7XG4gICAgLy8gcmV1c2UgcmVkdW5kYW50IGxpbmVcbiAgICBsZXQgbGluZSA9IHRoaXMuZG9tLnJlZHVuZGFudC5saW5lcy5zaGlmdCgpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgLy8gY3JlYXRlIHZlcnRpY2FsIGxpbmVcbiAgICAgIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQobGluZSk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmxpbmVzLnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgXG4gICAgbGluZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBsaW5lLnN0eWxlLmhlaWdodCA9IGAke3Byb3BzLm1pbm9yTGluZUhlaWdodH1weGA7XG5cbiAgICBsZXQgeSA9IChvcmllbnRhdGlvbiA9PSAndG9wJykgPyBwcm9wcy5tYWpvckxhYmVsSGVpZ2h0IDogdGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQ7XG4gICAgbGV0IHggPSBsZWZ0IC0gcHJvcHMubWlub3JMaW5lV2lkdGggLyAyO1xuXG4gICAgdGhpcy5fc2V0WFkobGluZSwgeCwgeSk7XG4gICAgbGluZS5jbGFzc05hbWUgPSBgdmlzLWdyaWQgJHt0aGlzLm9wdGlvbnMucnRsID8gICd2aXMtdmVydGljYWwtcnRsJyA6ICd2aXMtdmVydGljYWwnfSB2aXMtbWlub3IgJHtjbGFzc05hbWV9YDtcblxuICAgIHJldHVybiBsaW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIE1ham9yIGxpbmUgZm9yIHRoZSBheGlzIGF0IHBvc2l0aW9uIHhcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxlZnRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmllbnRhdGlvbiAgIFwidG9wXCIgb3IgXCJib3R0b21cIiAoZGVmYXVsdClcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBjcmVhdGVkIGxpbmVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXBhaW50TWFqb3JMaW5lKGxlZnQsIHdpZHRoLCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lKSB7XG4gICAgLy8gcmV1c2UgcmVkdW5kYW50IGxpbmVcbiAgICBsZXQgbGluZSA9IHRoaXMuZG9tLnJlZHVuZGFudC5saW5lcy5zaGlmdCgpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgLy8gY3JlYXRlIHZlcnRpY2FsIGxpbmVcbiAgICAgIGxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQobGluZSk7XG4gICAgfVxuICAgIHRoaXMuZG9tLmxpbmVzLnB1c2gobGluZSk7XG5cbiAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgXG4gICAgbGluZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICBsaW5lLnN0eWxlLmhlaWdodCA9IGAke3Byb3BzLm1ham9yTGluZUhlaWdodH1weGA7XG5cbiAgICBsZXQgeSA9IChvcmllbnRhdGlvbiA9PSAndG9wJykgPyAwIDogdGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQ7XG4gICAgbGV0IHggPSBsZWZ0IC0gcHJvcHMubWFqb3JMaW5lV2lkdGggLyAyO1xuXG4gICAgdGhpcy5fc2V0WFkobGluZSwgeCwgeSk7XG4gICAgbGluZS5jbGFzc05hbWUgPSBgdmlzLWdyaWQgJHt0aGlzLm9wdGlvbnMucnRsID8gICd2aXMtdmVydGljYWwtcnRsJyA6ICd2aXMtdmVydGljYWwnfSB2aXMtbWFqb3IgJHtjbGFzc05hbWV9YDtcblxuICAgIHJldHVybiBsaW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgc2l6ZSBvZiB0ZXh0IG9uIHRoZSBheGlzIChib3RoIG1ham9yIGFuZCBtaW5vciBheGlzKS5cbiAgICogVGhlIHNpemUgaXMgY2FsY3VsYXRlZCBvbmx5IG9uY2UgYW5kIHRoZW4gY2FjaGVkIGluIHRoaXMucHJvcHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FsY3VsYXRlQ2hhclNpemUoKSB7XG4gICAgLy8gTm90ZTogV2UgY2FsY3VsYXRlIGNoYXIgc2l6ZSB3aXRoIGV2ZXJ5IHJlZHJhdy4gU2l6ZSBtYXkgY2hhbmdlLCBmb3JcbiAgICAvLyBleGFtcGxlIHdoZW4gYW55IG9mIHRoZSB0aW1lbGluZXMgcGFyZW50cyBoYWQgZGlzcGxheTpub25lIGZvciBleGFtcGxlLlxuXG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBjaGFyIHdpZHRoIGFuZCBoZWlnaHQgb24gdGhlIG1pbm9yIGF4aXNcbiAgICBpZiAoIXRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IpIHtcbiAgICAgIHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgIHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IuY2xhc3NOYW1lID0gJ3Zpcy10ZXh0IHZpcy1taW5vciB2aXMtbWVhc3VyZSc7XG4gICAgICB0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblxuICAgICAgdGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnMCcpKTtcbiAgICAgIHRoaXMuZG9tLmZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vcik7XG4gICAgfVxuICAgIHRoaXMucHJvcHMubWlub3JDaGFySGVpZ2h0ID0gdGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGllbnRIZWlnaHQ7XG4gICAgdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aCA9IHRoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3IuY2xpZW50V2lkdGg7XG5cbiAgICAvLyBkZXRlcm1pbmUgdGhlIGNoYXIgd2lkdGggYW5kIGhlaWdodCBvbiB0aGUgbWFqb3IgYXhpc1xuICAgIGlmICghdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvcikge1xuICAgICAgdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGFzc05hbWUgPSAndmlzLXRleHQgdmlzLW1ham9yIHZpcy1tZWFzdXJlJztcbiAgICAgIHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3Iuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXG4gICAgICB0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcwJykpO1xuICAgICAgdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yKTtcbiAgICB9XG4gICAgdGhpcy5wcm9wcy5tYWpvckNoYXJIZWlnaHQgPSB0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsaWVudEhlaWdodDtcbiAgICB0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoID0gdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGllbnRXaWR0aDtcbiAgfVxufVxuXG5cbnZhciB3YXJuZWRGb3JPdmVyZmxvdyA9IGZhbHNlO1xuXG4vKipcbiAqIFR1cm4gYW4gZWxlbWVudCBpbnRvIGFuIGNsaWNrVG9Vc2UgZWxlbWVudC5cbiAqIFdoZW4gbm90IGFjdGl2ZSwgdGhlIGVsZW1lbnQgaGFzIGEgdHJhbnNwYXJlbnQgb3ZlcmxheS4gV2hlbiB0aGUgb3ZlcmxheSBpc1xuICogY2xpY2tlZCwgdGhlIG1vZGUgaXMgY2hhbmdlZCB0byBhY3RpdmUuXG4gKiBXaGVuIGFjdGl2ZSwgdGhlIGVsZW1lbnQgaXMgZGlzcGxheWVkIHdpdGggYSBibHVlIGJvcmRlciBhcm91bmQgaXQsIGFuZFxuICogdGhlIGludGVyYWN0aXZlIGNvbnRlbnRzIG9mIHRoZSBlbGVtZW50IGNhbiBiZSB1c2VkLiBXaGVuIGNsaWNrZWQgb3V0c2lkZVxuICogdGhlIGVsZW1lbnQsIHRoZSBlbGVtZW50cyBtb2RlIGlzIGNoYW5nZWQgdG8gaW5hY3RpdmUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGNvbnRhaW5lclxuICogQGNvbnN0cnVjdG9yIEFjdGl2YXRvclxuICovXG5mdW5jdGlvbiBBY3RpdmF0b3IoY29udGFpbmVyKSB7XG4gIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgdGhpcy5kb20gPSB7XG4gICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgfTtcblxuICB0aGlzLmRvbS5vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZG9tLm92ZXJsYXkuY2xhc3NOYW1lID0gJ3Zpcy1vdmVybGF5JztcblxuICB0aGlzLmRvbS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20ub3ZlcmxheSk7XG5cbiAgdGhpcy5oYW1tZXIgPSBIYW1tZXIodGhpcy5kb20ub3ZlcmxheSk7XG4gIHRoaXMuaGFtbWVyLm9uKCd0YXAnLCB0aGlzLl9vblRhcE92ZXJsYXkuYmluZCh0aGlzKSk7XG5cbiAgLy8gYmxvY2sgYWxsIHRvdWNoIGV2ZW50cyAoZXhjZXB0IHRhcClcbiAgdmFyIG1lID0gdGhpcztcbiAgdmFyIGV2ZW50cyA9IFtcbiAgICAndGFwJywgJ2RvdWJsZXRhcCcsICdwcmVzcycsXG4gICAgJ3BpbmNoJyxcbiAgICAncGFuJywgJ3BhbnN0YXJ0JywgJ3Bhbm1vdmUnLCAncGFuZW5kJ1xuICBdO1xuICBldmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBtZS5oYW1tZXIub24oZXZlbnQsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGF0dGFjaCBhIGNsaWNrIGV2ZW50IHRvIHRoZSB3aW5kb3csIGluIG9yZGVyIHRvIGRlYWN0aXZhdGUgd2hlbiBjbGlja2luZyBvdXRzaWRlIHRoZSB0aW1lbGluZVxuICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQuYm9keSkge1xuICAgIHRoaXMub25DbGljayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKCFfaGFzUGFyZW50KGV2ZW50LnRhcmdldCwgY29udGFpbmVyKSkge1xuICAgICAgICBtZS5kZWFjdGl2YXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbkNsaWNrKTtcbiAgfVxuXG4gIGlmICh0aGlzLmtleWNoYXJtICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmtleWNoYXJtLmRlc3Ryb3koKTtcbiAgfVxuICB0aGlzLmtleWNoYXJtID0ga2V5Y2hhcm0oKTtcblxuICAvLyBrZXljaGFybSBsaXN0ZW5lciBvbmx5IGJvdW5kZWQgd2hlbiBhY3RpdmUpXG4gIHRoaXMuZXNjTGlzdGVuZXIgPSB0aGlzLmRlYWN0aXZhdGUuYmluZCh0aGlzKTtcbn1cblxuLy8gdHVybiBpbnRvIGFuIGV2ZW50IGVtaXR0ZXJcbkVtaXR0ZXIoQWN0aXZhdG9yLnByb3RvdHlwZSk7XG5cbi8vIFRoZSBjdXJyZW50bHkgYWN0aXZlIGFjdGl2YXRvclxuQWN0aXZhdG9yLmN1cnJlbnQgPSBudWxsO1xuXG4vKipcbiAqIERlc3Ryb3kgdGhlIGFjdGl2YXRvci4gQ2xlYW5zIHVwIGFsbCBjcmVhdGVkIERPTSBhbmQgZXZlbnQgbGlzdGVuZXJzXG4gKi9cbkFjdGl2YXRvci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5kZWFjdGl2YXRlKCk7XG5cbiAgLy8gcmVtb3ZlIGRvbVxuICB0aGlzLmRvbS5vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ub3ZlcmxheSk7XG5cbiAgLy8gcmVtb3ZlIGdsb2JhbCBldmVudCBsaXN0ZW5lclxuICBpZiAodGhpcy5vbkNsaWNrKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25DbGljayk7XG4gIH1cbiAgLy8gcmVtb3ZlIGtleWNoYXJtXG4gIGlmICh0aGlzLmtleWNoYXJtICE9PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmtleWNoYXJtLmRlc3Ryb3koKTtcbiAgfVxuICB0aGlzLmtleWNoYXJtID0gbnVsbDtcbiAgLy8gY2xlYW51cCBoYW1tZXIgaW5zdGFuY2VzXG4gIHRoaXMuaGFtbWVyLmRlc3Ryb3koKTtcbiAgdGhpcy5oYW1tZXIgPSBudWxsO1xuICAvLyBGSVhNRTogY2xlYW5pbmcgdXAgaGFtbWVyIGluc3RhbmNlcyBkb2Vzbid0IHdvcmsgKFRpbWVsaW5lIG5vdCByZW1vdmVkIGZyb20gbWVtb3J5KVxufTtcblxuLyoqXG4gKiBBY3RpdmF0ZSB0aGUgZWxlbWVudFxuICogT3ZlcmxheSBpcyBoaWRkZW4sIGVsZW1lbnQgaXMgZGVjb3JhdGVkIHdpdGggYSBibHVlIHNoYWRvdyBib3JkZXJcbiAqL1xuQWN0aXZhdG9yLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gd2UgYWxsb3cgb25seSBvbmUgYWN0aXZlIGFjdGl2YXRvciBhdCBhIHRpbWVcbiAgaWYgKEFjdGl2YXRvci5jdXJyZW50KSB7XG4gICAgQWN0aXZhdG9yLmN1cnJlbnQuZGVhY3RpdmF0ZSgpO1xuICB9XG4gIEFjdGl2YXRvci5jdXJyZW50ID0gdGhpcztcblxuICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gIHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgdXRpbC5hZGRDbGFzc05hbWUodGhpcy5kb20uY29udGFpbmVyLCAndmlzLWFjdGl2ZScpO1xuXG4gIHRoaXMuZW1pdCgnY2hhbmdlJyk7XG4gIHRoaXMuZW1pdCgnYWN0aXZhdGUnKTtcblxuICAvLyB1Z2x5IGhhY2s6IGJpbmQgRVNDIGFmdGVyIGVtaXR0aW5nIHRoZSBldmVudHMsIGFzIHRoZSBOZXR3b3JrIHJlYmluZHMgYWxsXG4gIC8vIGtleWJvYXJkIGV2ZW50cyBvbiBhICdjaGFuZ2UnIGV2ZW50XG4gIHRoaXMua2V5Y2hhcm0uYmluZCgnZXNjJywgdGhpcy5lc2NMaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIERlYWN0aXZhdGUgdGhlIGVsZW1lbnRcbiAqIE92ZXJsYXkgaXMgZGlzcGxheWVkIG9uIHRvcCBvZiB0aGUgZWxlbWVudFxuICovXG5BY3RpdmF0b3IucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbiAoKSB7XG4gIGlmIChBY3RpdmF0b3IuY3VycmVudCA9PT0gdGhpcykge1xuICAgIEFjdGl2YXRvci5jdXJyZW50ID0gbnVsbDtcbiAgfVxuXG4gIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gIHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICcnO1xuICB1dGlsLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5jb250YWluZXIsICd2aXMtYWN0aXZlJyk7XG4gIHRoaXMua2V5Y2hhcm0udW5iaW5kKCdlc2MnLCB0aGlzLmVzY0xpc3RlbmVyKTtcblxuICB0aGlzLmVtaXQoJ2NoYW5nZScpO1xuICB0aGlzLmVtaXQoJ2RlYWN0aXZhdGUnKTtcbn07XG5cbi8qKlxuICogSGFuZGxlIGEgdGFwIGV2ZW50OiBhY3RpdmF0ZSB0aGUgY29udGFpbmVyXG4gKiBAcGFyYW0ge0V2ZW50fSAgZXZlbnQgICBUaGUgZXZlbnRcbiAqIEBwcml2YXRlXG4gKi9cbkFjdGl2YXRvci5wcm90b3R5cGUuX29uVGFwT3ZlcmxheSA9IGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBhY3RpdmF0ZSB0aGUgY29udGFpbmVyXG4gIHRoaXMuYWN0aXZhdGUoKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG4vKipcbiAqIFRlc3Qgd2hldGhlciB0aGUgZWxlbWVudCBoYXMgdGhlIHJlcXVlc3RlZCBwYXJlbnQgZWxlbWVudCBzb21ld2hlcmUgaW5cbiAqIGl0cyBjaGFpbiBvZiBwYXJlbnQgbm9kZXMuXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50XG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBwYXJlbnRcbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIHRydWUgd2hlbiB0aGUgcGFyZW50IGlzIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICBjaGFpbiBvZiBwYXJlbnQgbm9kZXMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfaGFzUGFyZW50KGVsZW1lbnQsIHBhcmVudCkge1xuICB3aGlsZSAoZWxlbWVudCkge1xuICAgIGlmIChlbGVtZW50ID09PSBwYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogSU1QT1JUQU5UOiBMb2NhbGVzIGZvciBNb21lbnQgaGFzIHRvIGJlIGltcG9ydGVkIGluIHRoZSBsZWdhY3kgYW5kIHN0YW5kYWxvbmVcbiAqIGVudHJ5IHBvaW50cy4gRm9yIHRoZSBwZWVyIGJ1aWxkIGl0J3MgdXNlcnMgcmVzcG9uc2liaWxpdHkgdG8gZG8gc28uXG4gKi9cblxuLy8gRW5nbGlzaFxuY29uc3QgZW4gPSB7XG4gIGN1cnJlbnQ6ICdjdXJyZW50JyxcbiAgdGltZTogJ3RpbWUnLFxuICBkZWxldGVTZWxlY3RlZDogJ0RlbGV0ZSBzZWxlY3RlZCcsXG59O1xuY29uc3QgZW5fRU4gPSBlbjtcbmNvbnN0IGVuX1VTID0gZW47XG5cbi8vIEl0YWxpYW5vXG5jb25zdCBpdCA9IHtcbiAgY3VycmVudDogJ2F0dHVhbGUnLFxuICB0aW1lOiAndGVtcG8nLFxuICBkZWxldGVTZWxlY3RlZDogJ0NhbmNlbGxhIGxhIHNlbGV6aW9uZScsXG59O1xuY29uc3QgaXRfSVQgPSBpdDtcbmNvbnN0IGl0X0NIID0gaXQ7XG5cbi8vIER1dGNoXG5jb25zdCBubCA9IHtcbiAgY3VycmVudDogJ2h1aWRpZ2UnLFxuICB0aW1lOiAndGlqZCcsXG4gIGRlbGV0ZVNlbGVjdGVkOiAnU2VsZWN0aWUgdmVyd2lqZGVyZW4nXG59O1xuY29uc3QgbmxfTkwgPSBubDtcbmNvbnN0IG5sX0JFID0gbmw7XG5cbi8vIEdlcm1hblxuY29uc3QgZGUgPSB7XG4gIGN1cnJlbnQ6ICdBa3R1ZWxsZScsXG4gIHRpbWU6ICdaZWl0JyxcbiAgZGVsZXRlU2VsZWN0ZWQ6ICdMXFx1MDBmNnNjaGUgQXVzd2FobCcsXG59O1xuY29uc3QgZGVfREUgPSBkZTtcblxuLy8gRnJlbmNoXG5jb25zdCBmciA9IHtcbiAgY3VycmVudDogJ2FjdHVlbCcsXG4gIHRpbWU6ICdoZXVyZScsXG4gIGRlbGV0ZVNlbGVjdGVkOiAnRWZmYWNlciBsYSBzZWxlY3Rpb24nLFxufTtcbmNvbnN0IGZyX0ZSID0gZnI7XG5jb25zdCBmcl9DQSA9IGZyO1xuY29uc3QgZnJfQkUgPSBmcjtcblxuLy8gRXNwYW5vbFxuY29uc3QgZXMgPSB7XG4gIGN1cnJlbnQ6ICdjb3JyaWVudGUnLFxuICB0aW1lOiAnaG9yYScsXG4gIGRlbGV0ZVNlbGVjdGVkOiAnRWxpbWluYXIgc2VsZWNjaVxcdTAwZjNuJyxcbn07XG5jb25zdCBlc19FUyA9IGVzO1xuXG4vLyBVa3JhaW5pYW5cbmNvbnN0IHVrID0ge1xuICBjdXJyZW50OiAn0L/QvtGC0L7Rh9C90LjQuScsXG4gIHRpbWU6ICfRh9Cw0YEnLFxuICBkZWxldGVTZWxlY3RlZDogJ9CS0LjQtNCw0LvQuNGC0Lgg0L7QsdGA0LDQvdC1Jyxcbn07XG5jb25zdCB1a19VQSA9IHVrO1xuXG4vLyBSdXNzaWFuXG5jb25zdCBydSA9IHtcbiAgY3VycmVudDogJ9GC0LXQutGD0YnQtdC1JyxcbiAgdGltZTogJ9Cy0YDQtdC80Y8nLFxuICBkZWxldGVTZWxlY3RlZDogJ9Cj0LTQsNC70LjRgtGMINCy0YvQsdGA0LDQvdC90L7QtScsXG59O1xuY29uc3QgcnVfUlUgPSBydTtcblxuLy8gUG9saXNoXG5jb25zdCBwbCA9IHtcbiAgY3VycmVudDogJ2FrdHVhbG55JyxcbiAgdGltZTogJ2N6YXMnLFxuICBkZWxldGVTZWxlY3RlZDogJ1VzdcWEIHd5YnJhbmUnLFxufTtcbmNvbnN0IHBsX1BMID0gcGw7XG5cbi8vIFBvcnR1Z3Vlc2VcbmNvbnN0IHB0ID0ge1xuICBjdXJyZW50OiAnYXR1YWwnLFxuICB0aW1lOiAnZGF0YScsXG4gIGRlbGV0ZVNlbGVjdGVkOiAnQXBhZ2FyIHNlbGVjaW9uYWRvJyxcbn07XG5jb25zdCBwdF9CUiA9IHB0O1xuY29uc3QgcHRfUFQgPSBwdDtcblxuLy8gSmFwYW5lc2VcbmNvbnN0IGphID0ge1xuICBjdXJyZW50OiAn54++5ZyoJyxcbiAgdGltZTogJ+aZguWIuycsXG4gIGRlbGV0ZVNlbGVjdGVkOiAn6YG45oqe44GV44KM44Gf44KC44Gu44KS5YmK6ZmkJyxcbn07XG5jb25zdCBqYV9KUCA9IGphO1xuXG5jb25zdCBsb2NhbGVzID0ge1xuICBlbixcbiAgZW5fRU4sXG4gIGVuX1VTLFxuICBpdCxcbiAgaXRfSVQsXG4gIGl0X0NILFxuICBubCxcbiAgbmxfTkwsXG4gIG5sX0JFLFxuICBkZSxcbiAgZGVfREUsXG4gIGZyLFxuICBmcl9GUixcbiAgZnJfQ0EsXG4gIGZyX0JFLFxuICBlcyxcbiAgZXNfRVMsXG4gIHVrLFxuICB1a19VQSxcbiAgcnUsXG4gIHJ1X1JVLFxuICBwbCxcbiAgcGxfUEwsXG4gIHB0LFxuICBwdF9CUixcbiAgcHRfUFQsXG4gIGphLFxuICBqYV9KUCxcbn07XG5cbi8qKiBBIGN1c3RvbSB0aW1lIGJhciAqL1xuY2xhc3MgQ3VzdG9tVGltZSBleHRlbmRzIENvbXBvbmVudCB7XG4gLyoqXG4gKiBAcGFyYW0ge3tyYW5nZTogUmFuZ2UsIGRvbTogT2JqZWN0fX0gYm9keVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgICAgQXZhaWxhYmxlIHBhcmFtZXRlcnM6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyIHwgc3RyaW5nfSBpZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ30gbG9jYWxlc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ30gbG9jYWxlXG4gKiBAY29uc3RydWN0b3IgQ3VzdG9tVGltZVxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cbiAgY29uc3RydWN0b3IoYm9keSwgb3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5ib2R5ID0gYm9keTtcblxuICAgIC8vIGRlZmF1bHQgb3B0aW9uc1xuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICBtb21lbnQsXG4gICAgICBsb2NhbGVzLFxuICAgICAgbG9jYWxlOiAnZW4nLFxuICAgICAgaWQ6IHVuZGVmaW5lZCxcbiAgICAgIHRpdGxlOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRPcHRpb25zKTtcbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLmxvY2FsZXMgPSB1dGlsLmV4dGVuZCh7fSwgbG9jYWxlcywgdGhpcy5vcHRpb25zLmxvY2FsZXMpO1xuICAgIGNvbnN0IGRlZmF1bHRMb2NhbGVzID0gdGhpcy5kZWZhdWx0T3B0aW9ucy5sb2NhbGVzW3RoaXMuZGVmYXVsdE9wdGlvbnMubG9jYWxlXTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubG9jYWxlcykuZm9yRWFjaChsb2NhbGUgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmxvY2FsZXNbbG9jYWxlXSA9IHV0aWwuZXh0ZW5kKFxuICAgICAgICB7fSxcbiAgICAgICAgZGVmYXVsdExvY2FsZXMsXG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NhbGVzW2xvY2FsZV1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRpbWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5jdXN0b21UaW1lID0gb3B0aW9ucy50aW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1c3RvbVRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIH1cblxuICAgIHRoaXMuZXZlbnRQYXJhbXMgPSB7fTsgLy8gc3RvcmVzIHN0YXRlIHBhcmFtZXRlcnMgd2hpbGUgZHJhZ2dpbmcgdGhlIGJhclxuXG4gICAgLy8gY3JlYXRlIHRoZSBET01cbiAgICB0aGlzLl9jcmVhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3B0aW9ucyBmb3IgdGhlIGNvbXBvbmVudC4gT3B0aW9ucyB3aWxsIGJlIG1lcmdlZCBpbiBjdXJyZW50IG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICBBdmFpbGFibGUgcGFyYW1ldGVyczpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge251bWJlciB8IHN0cmluZ30gaWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZ30gbG9jYWxlc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RyaW5nfSBsb2NhbGVcbiAgICovXG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAvLyBjb3B5IGFsbCBvcHRpb25zIHRoYXQgd2Uga25vd1xuICAgICAgdXRpbC5zZWxlY3RpdmVFeHRlbmQoWydtb21lbnQnLCAnbG9jYWxlJywgJ2xvY2FsZXMnLCAnaWQnLCAndGl0bGUnLCAncnRsJywgJ3NuYXAnXSwgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBET00gZm9yIHRoZSBjdXN0b20gdGltZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZSgpIHtcbiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYXJbJ2N1c3RvbS10aW1lJ10gPSB0aGlzO1xuICAgIGJhci5jbGFzc05hbWUgPSBgdmlzLWN1c3RvbS10aW1lICR7dGhpcy5vcHRpb25zLmlkIHx8ICcnfWA7XG4gICAgYmFyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICBiYXIuc3R5bGUudG9wID0gJzBweCc7XG4gICAgYmFyLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB0aGlzLmJhciA9IGJhcjtcblxuICAgIGNvbnN0IGRyYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkcmFnLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICBkcmFnLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIGlmKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgIGRyYWcuc3R5bGUucmlnaHQgPSAnLTEwcHgnO1xuICAgIH0gZWxzZSAge1xuICAgICAgIGRyYWcuc3R5bGUubGVmdCA9ICctMTBweCc7XG4gICAgfVxuICAgIGRyYWcuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgIGRyYWcuc3R5bGUud2lkdGggPSAnMjBweCc7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7V2hlZWxFdmVudH0gZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTW91c2VXaGVlbCAoZSkge1xuICAgICAgdGhpcy5ib2R5LnJhbmdlLl9vbk1vdXNlV2hlZWwoZSk7XG4gICAgfVxuXG4gICAgaWYgKGRyYWcuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgLy8gSUU5LCBDaHJvbWUsIFNhZmFyaSwgT3BlcmFcbiAgICAgIGRyYWcuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIiwgb25Nb3VzZVdoZWVsLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICAgIC8vIEZpcmVmb3hcbiAgICAgIGRyYWcuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsIG9uTW91c2VXaGVlbC5iaW5kKHRoaXMpLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElFIDYvNy84XG4gICAgICBkcmFnLmF0dGFjaEV2ZW50KFwib25tb3VzZXdoZWVsXCIsIG9uTW91c2VXaGVlbC5iaW5kKHRoaXMpKTtcbiAgICB9XG5cbiAgICBiYXIuYXBwZW5kQ2hpbGQoZHJhZyk7XG4gICAgLy8gYXR0YWNoIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuaGFtbWVyID0gbmV3IEhhbW1lcihkcmFnKTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFuc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFubW92ZScsICB0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5oYW1tZXIub24oJ3BhbmVuZCcsICAgdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaGFtbWVyLmdldCgncGFuJykuc2V0KHt0aHJlc2hvbGQ6NSwgZGlyZWN0aW9uOiBIYW1tZXIuRElSRUNUSU9OX0FMTH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIEN1c3RvbVRpbWUgYmFyXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMuaGlkZSgpO1xuXG4gICAgdGhpcy5oYW1tZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuaGFtbWVyID0gbnVsbDtcblxuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVwYWludCB0aGUgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHJlc2l6ZWRcbiAgICovXG4gIHJlZHJhdygpIHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbDtcbiAgICBpZiAodGhpcy5iYXIucGFyZW50Tm9kZSAhPSBwYXJlbnQpIHtcbiAgICAgIC8vIGF0dGFjaCB0byB0aGUgZG9tXG4gICAgICBpZiAodGhpcy5iYXIucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmJhcik7XG4gICAgfVxuXG4gICAgY29uc3QgeCA9IHRoaXMuYm9keS51dGlsLnRvU2NyZWVuKHRoaXMuY3VzdG9tVGltZSk7XG5cbiAgICBsZXQgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07XG4gICAgaWYgKCFsb2NhbGUpIHtcbiAgICAgIGlmICghdGhpcy53YXJuZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyR7dGhpcy5vcHRpb25zLmxvY2FsZX0nXSBub3QgZm91bmQuIFNlZSBodHRwczovL3Zpc2pzLmdpdGh1Yi5pby92aXMtdGltZWxpbmUvZG9jcy90aW1lbGluZS8jTG9jYWxpemF0aW9uYCk7XG4gICAgICAgIHRoaXMud2FybmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGVzWydlbiddOyAvLyBmYWxsIGJhY2sgb24gZW5nbGlzaCB3aGVuIG5vdCBhdmFpbGFibGVcbiAgICB9XG5cbiAgICBsZXQgdGl0bGUgPSB0aGlzLm9wdGlvbnMudGl0bGU7XG4gICAgLy8gVG8gaGlkZSB0aGUgdGl0bGUgY29tcGxldGVseSB1c2UgZW1wdHkgc3RyaW5nICcnLlxuICAgIGlmICh0aXRsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aXRsZSA9IGAke2xvY2FsZS50aW1lfTogJHt0aGlzLm9wdGlvbnMubW9tZW50KHRoaXMuY3VzdG9tVGltZSkuZm9ybWF0KCdkZGRkLCBNTU1NIERvIFlZWVksIEg6bW06c3MnKX1gO1xuICAgICAgdGl0bGUgPSB0aXRsZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRpdGxlLnN1YnN0cmluZygxKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aXRsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aXRsZSA9IHRpdGxlLmNhbGwodGhpcywgdGhpcy5jdXN0b21UaW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMucnRsID8gdGhpcy5iYXIuc3R5bGUucmlnaHQgPSBgJHt4fXB4YCA6IHRoaXMuYmFyLnN0eWxlLmxlZnQgPSBgJHt4fXB4YDtcbiAgICB0aGlzLmJhci50aXRsZSA9IHRpdGxlO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgQ3VzdG9tVGltZSBmcm9tIHRoZSBET01cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBsaW5lIGZyb20gdGhlIERPTVxuICAgIGlmICh0aGlzLmJhci5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1c3RvbSB0aW1lLlxuICAgKiBAcGFyYW0ge0RhdGUgfCBudW1iZXIgfCBzdHJpbmd9IHRpbWVcbiAgICovXG4gIHNldEN1c3RvbVRpbWUodGltZSkge1xuICAgIHRoaXMuY3VzdG9tVGltZSA9IHV0aWwuY29udmVydCh0aW1lLCAnRGF0ZScpO1xuICAgIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgY3VzdG9tIHRpbWUuXG4gICAqIEByZXR1cm4ge0RhdGV9IGN1c3RvbVRpbWVcbiAgICovXG4gIGdldEN1c3RvbVRpbWUoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBjdXN0b20gbWFya2VyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3RpdGxlXSBUaXRsZSBvZiB0aGUgY3VzdG9tIG1hcmtlclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtlZGl0YWJsZV0gTWFrZSB0aGUgY3VzdG9tIG1hcmtlciBlZGl0YWJsZS5cbiAgICovXG4gIHNldEN1c3RvbU1hcmtlcih0aXRsZSwgZWRpdGFibGUpIHtcbiAgICBjb25zdCBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBtYXJrZXIuY2xhc3NOYW1lID0gYHZpcy1jdXN0b20tdGltZS1tYXJrZXJgO1xuICAgIG1hcmtlci5pbm5lckhUTUwgPSB1dGlsLnhzcyh0aXRsZSk7XG4gICAgbWFya2VyLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblxuICAgIGlmIChlZGl0YWJsZSkge1xuICAgICAgbWFya2VyLnNldEF0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJywgJ3RydWUnKTtcbiAgICAgIG1hcmtlci5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbWFya2VyLmZvY3VzKCk7XG4gICAgICB9KTtcbiAgICAgIG1hcmtlci5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIHRoaXMuX29uTWFya2VyQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgICAgLy8gVGhlIGVkaXRhYmxlIGRpdiBlbGVtZW50IGhhcyBubyBjaGFuZ2UgZXZlbnQsIHNvIGhlcmUgZW11bGF0ZXMgdGhlIGNoYW5nZSBldmVudC5cbiAgICAgIG1hcmtlci50aXRsZSA9IHRpdGxlO1xuICAgICAgbWFya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMudGl0bGUgIT0gZXZlbnQudGFyZ2V0LmlubmVySFRNTCkge1xuICAgICAgICAgIHRoaXMuX29uTWFya2VyQ2hhbmdlZChldmVudCk7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IGV2ZW50LnRhcmdldC5pbm5lckhUTUw7XG4gICAgICAgIH1cbiAgICAgIH0uYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgdGhpcy5iYXIuYXBwZW5kQ2hpbGQobWFya2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgICogU2V0IGN1c3RvbSB0aXRsZS5cbiAgICAqIEBwYXJhbSB7RGF0ZSB8IG51bWJlciB8IHN0cmluZ30gdGl0bGVcbiAgICAqL1xuICBzZXRDdXN0b21UaXRsZSh0aXRsZSkge1xuICAgIHRoaXMub3B0aW9ucy50aXRsZSA9IHRpdGxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IG1vdmluZyBob3Jpem9udGFsbHlcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWdTdGFydChldmVudCkge1xuICAgIHRoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMuZXZlbnRQYXJhbXMuY3VzdG9tVGltZSA9IHRoaXMuY3VzdG9tVGltZTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gbW92aW5nIG9wZXJhdGluZy5cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWcoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGxldCBkZWx0YVggPSB0aGlzLm9wdGlvbnMucnRsID8gKC0xKSAqIGV2ZW50LmRlbHRhWCA6IGV2ZW50LmRlbHRhWDtcblxuICAgIGNvbnN0IHggPSB0aGlzLmJvZHkudXRpbC50b1NjcmVlbih0aGlzLmV2ZW50UGFyYW1zLmN1c3RvbVRpbWUpICsgZGVsdGFYO1xuICAgIGNvbnN0IHRpbWUgPSB0aGlzLmJvZHkudXRpbC50b1RpbWUoeCk7XG5cbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuYm9keS51dGlsLmdldFNjYWxlKCk7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuYm9keS51dGlsLmdldFN0ZXAoKTtcbiAgICBjb25zdCBzbmFwID0gdGhpcy5vcHRpb25zLnNuYXA7XG5cbiAgICBjb25zdCBzbmFwcGVkVGltZSA9IHNuYXAgPyBzbmFwKHRpbWUsIHNjYWxlLCBzdGVwKSA6IHRpbWU7XG5cbiAgICB0aGlzLnNldEN1c3RvbVRpbWUoc25hcHBlZFRpbWUpO1xuXG4gICAgLy8gZmlyZSBhIHRpbWVjaGFuZ2UgZXZlbnRcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCd0aW1lY2hhbmdlJywge1xuICAgICAgaWQ6IHRoaXMub3B0aW9ucy5pZCxcbiAgICAgIHRpbWU6IG5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpLFxuICAgICAgZXZlbnRcbiAgICB9KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3AgbW92aW5nIG9wZXJhdGluZy5cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWdFbmQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcpIHJldHVybjtcblxuICAgIC8vIGZpcmUgYSB0aW1lY2hhbmdlZCBldmVudFxuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoJ3RpbWVjaGFuZ2VkJywge1xuICAgICAgaWQ6IHRoaXMub3B0aW9ucy5pZCxcbiAgICAgIHRpbWU6IG5ldyBEYXRlKHRoaXMuY3VzdG9tVGltZS52YWx1ZU9mKCkpLFxuICAgICAgZXZlbnRcbiAgICB9KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gaW5wdXQgb3BlcmF0aW5nLlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uTWFya2VyQ2hhbmdlKGV2ZW50KSB7XG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnbWFya2VyY2hhbmdlJywge1xuICAgICAgaWQ6IHRoaXMub3B0aW9ucy5pZCxcbiAgICAgIHRpdGxlOiBldmVudC50YXJnZXQuaW5uZXJIVE1MLFxuICAgICAgZXZlbnRcbiAgICB9KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gY2hhbmdlIG9wZXJhdGluZy5cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbk1hcmtlckNoYW5nZWQoZXZlbnQpIHtcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdtYXJrZXJjaGFuZ2VkJywge1xuICAgICAgaWQ6IHRoaXMub3B0aW9ucy5pZCxcbiAgICAgIHRpdGxlOiBldmVudC50YXJnZXQuaW5uZXJIVE1MLFxuICAgICAgZXZlbnRcbiAgICB9KTtcblxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBjdXN0b20gdGltZSBmcm9tIGFuIGV2ZW50IHRhcmdldDpcbiAgICogc2VhcmNoZXMgZm9yIHRoZSBhdHRyaWJ1dGUgJ2N1c3RvbS10aW1lJyBpbiB0aGUgZXZlbnQgdGFyZ2V0J3MgZWxlbWVudCB0cmVlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge0N1c3RvbVRpbWUgfCBudWxsfSBjdXN0b21UaW1lXG4gICAqL1xuICBzdGF0aWMgY3VzdG9tVGltZUZyb21UYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHdoaWxlICh0YXJnZXQpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkoJ2N1c3RvbS10aW1lJykpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFsnY3VzdG9tLXRpbWUnXTtcbiAgICAgIH1cbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgdGltZWxpbmUgdmlzdWFsaXphdGlvblxuICogQGNvbnN0cnVjdG9yIENvcmVcbiAqL1xuY2xhc3MgQ29yZSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIG1haW4gRE9NIGZvciB0aGUgQ29yZTogYSByb290IHBhbmVsIGNvbnRhaW5pbmcgbGVmdCwgcmlnaHQsXG4gICAqIHRvcCwgYm90dG9tLCBjb250ZW50LCBhbmQgYmFja2dyb3VuZCBwYW5lbC5cbiAgICogQHBhcmFtIHtFbGVtZW50fSBjb250YWluZXIgIFRoZSBjb250YWluZXIgZWxlbWVudCB3aGVyZSB0aGUgQ29yZSB3aWxsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBhdHRhY2hlZC5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX2NyZWF0ZShjb250YWluZXIpIHtcbiAgICB0aGlzLmRvbSA9IHt9O1xuXG4gICAgdGhpcy5kb20uY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuZG9tLmNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmRvbS5yb290ICAgICAgICAgICAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmJhY2tncm91bmQgICAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lciAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20ubGVmdENvbnRhaW5lciAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5yaWdodENvbnRhaW5lciAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmNlbnRlciAgICAgICAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20ubGVmdCAgICAgICAgICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5yaWdodCAgICAgICAgICAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLnRvcCAgICAgICAgICAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20uYm90dG9tICAgICAgICAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5zaGFkb3dUb3AgICAgICAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLnNoYWRvd0JvdHRvbSAgICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20uc2hhZG93VG9wTGVmdCAgICAgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5zaGFkb3dCb3R0b21MZWZ0ICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0ICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20uc2hhZG93Qm90dG9tUmlnaHQgICAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0biAgICAgICA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmxvYWRpbmdTY3JlZW4gICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICB0aGlzLmRvbS5yb290LmNsYXNzTmFtZSAgICAgICAgICAgICAgICAgPSAndmlzLXRpbWVsaW5lJztcbiAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kLmNsYXNzTmFtZSAgICAgICAgICAgPSAndmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kJztcbiAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuY2xhc3NOYW1lICAgPSAndmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIHZpcy12ZXJ0aWNhbCc7XG4gICAgdGhpcy5kb20uYmFja2dyb3VuZEhvcml6b250YWwuY2xhc3NOYW1lID0gJ3Zpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtaG9yaXpvbnRhbCc7XG4gICAgdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmNsYXNzTmFtZSAgICAgID0gJ3Zpcy1wYW5lbCB2aXMtY2VudGVyJztcbiAgICB0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZSAgICAgICAgPSAndmlzLXBhbmVsIHZpcy1sZWZ0JztcbiAgICB0aGlzLmRvbS5yaWdodENvbnRhaW5lci5jbGFzc05hbWUgICAgICAgPSAndmlzLXBhbmVsIHZpcy1yaWdodCc7XG4gICAgdGhpcy5kb20udG9wLmNsYXNzTmFtZSAgICAgICAgICAgICAgICAgID0gJ3Zpcy1wYW5lbCB2aXMtdG9wJztcbiAgICB0aGlzLmRvbS5ib3R0b20uY2xhc3NOYW1lICAgICAgICAgICAgICAgPSAndmlzLXBhbmVsIHZpcy1ib3R0b20nO1xuICAgIHRoaXMuZG9tLmxlZnQuY2xhc3NOYW1lICAgICAgICAgICAgICAgICA9ICd2aXMtY29udGVudCc7XG4gICAgdGhpcy5kb20uY2VudGVyLmNsYXNzTmFtZSAgICAgICAgICAgICAgID0gJ3Zpcy1jb250ZW50JztcbiAgICB0aGlzLmRvbS5yaWdodC5jbGFzc05hbWUgICAgICAgICAgICAgICAgPSAndmlzLWNvbnRlbnQnO1xuICAgIHRoaXMuZG9tLnNoYWRvd1RvcC5jbGFzc05hbWUgICAgICAgICAgICA9ICd2aXMtc2hhZG93IHZpcy10b3AnO1xuICAgIHRoaXMuZG9tLnNoYWRvd0JvdHRvbS5jbGFzc05hbWUgICAgICAgICA9ICd2aXMtc2hhZG93IHZpcy1ib3R0b20nO1xuICAgIHRoaXMuZG9tLnNoYWRvd1RvcExlZnQuY2xhc3NOYW1lICAgICAgICA9ICd2aXMtc2hhZG93IHZpcy10b3AnO1xuICAgIHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQuY2xhc3NOYW1lICAgICA9ICd2aXMtc2hhZG93IHZpcy1ib3R0b20nO1xuICAgIHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0LmNsYXNzTmFtZSAgICAgICA9ICd2aXMtc2hhZG93IHZpcy10b3AnO1xuICAgIHRoaXMuZG9tLnNoYWRvd0JvdHRvbVJpZ2h0LmNsYXNzTmFtZSAgICA9ICd2aXMtc2hhZG93IHZpcy1ib3R0b20nO1xuICAgIHRoaXMuZG9tLnJvbGxpbmdNb2RlQnRuLmNsYXNzTmFtZSAgICAgICA9ICd2aXMtcm9sbGluZy1tb2RlLWJ0bic7XG4gICAgdGhpcy5kb20ubG9hZGluZ1NjcmVlbi5jbGFzc05hbWUgICAgICAgID0gJ3Zpcy1sb2FkaW5nLXNjcmVlbic7XG5cbiAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpO1xuICAgIHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsKTtcbiAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsKTtcbiAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lcik7XG4gICAgdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0Q29udGFpbmVyKTtcbiAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyKTtcbiAgICB0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLnRvcCk7XG4gICAgdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5ib3R0b20pO1xuICAgIHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20ucm9sbGluZ01vZGVCdG4pO1xuXG4gICAgdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlcik7XG4gICAgdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0KTtcbiAgICB0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodCk7XG4gICAgdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcCk7XG4gICAgdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbSk7XG4gICAgdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0KTtcbiAgICB0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQpO1xuICAgIHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0KTtcbiAgICB0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodCk7XG4gICAgXG4gICAgLy8gc2l6ZSBwcm9wZXJ0aWVzIG9mIGVhY2ggb2YgdGhlIHBhbmVsc1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICByb290OiB7fSxcbiAgICAgIGJhY2tncm91bmQ6IHt9LFxuICAgICAgY2VudGVyQ29udGFpbmVyOiB7fSxcbiAgICAgIGxlZnRDb250YWluZXI6IHt9LFxuICAgICAgcmlnaHRDb250YWluZXI6IHt9LFxuICAgICAgY2VudGVyOiB7fSxcbiAgICAgIGxlZnQ6IHt9LFxuICAgICAgcmlnaHQ6IHt9LFxuICAgICAgdG9wOiB7fSxcbiAgICAgIGJvdHRvbToge30sXG4gICAgICBib3JkZXI6IHt9LFxuICAgICAgc2Nyb2xsVG9wOiAwLFxuICAgICAgc2Nyb2xsVG9wTWluOiAwXG4gICAgfTtcblxuICAgIHRoaXMub24oJ3JhbmdlY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaW5pdGlhbERyYXdEb25lID09PSB0cnVlKSB7XG4gICAgICAgIHRoaXMuX3JlZHJhdygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub24oJ3JhbmdlY2hhbmdlZCcsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lKSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbFJhbmdlQ2hhbmdlRG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5vbigndG91Y2gnLCAgICAgICB0aGlzLl9vblRvdWNoLmJpbmQodGhpcykpO1xuICAgIHRoaXMub24oJ3Bhbm1vdmUnLCAgICAgICAgIHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKTtcblxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICB0aGlzLl9vcmlnUmVkcmF3ID0gdGhpcy5fcmVkcmF3LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fcmVkcmF3ID0gdXRpbC50aHJvdHRsZSh0aGlzLl9vcmlnUmVkcmF3KTtcblxuICAgIHRoaXMub24oJ19jaGFuZ2UnLCBwcm9wZXJ0aWVzID0+IHtcbiAgICAgIGlmIChtZS5pdGVtU2V0ICYmIG1lLml0ZW1TZXQuaW5pdGlhbEl0ZW1TZXREcmF3biAmJiBwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMucXVldWUgPT0gdHJ1ZSkge1xuICAgICAgICBtZS5fcmVkcmF3KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZS5fb3JpZ1JlZHJhdygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gY3JlYXRlIGV2ZW50IGxpc3RlbmVycyBmb3IgYWxsIGludGVyZXN0aW5nIGV2ZW50cywgdGhlc2UgZXZlbnRzIHdpbGwgYmVcbiAgICAvLyBlbWl0dGVkIHZpYSBlbWl0dGVyXG4gICAgdGhpcy5oYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuZG9tLnJvb3QpO1xuICAgIGNvbnN0IHBpbmNoUmVjb2duaXplciA9IHRoaXMuaGFtbWVyLmdldCgncGluY2gnKS5zZXQoe2VuYWJsZTogdHJ1ZX0pO1xuICAgIHBpbmNoUmVjb2duaXplciAmJiBkaXNhYmxlUHJldmVudERlZmF1bHRWZXJ0aWNhbGx5KHBpbmNoUmVjb2duaXplcik7XG4gICAgdGhpcy5oYW1tZXIuZ2V0KCdwYW4nKS5zZXQoe3RocmVzaG9sZDo1LCBkaXJlY3Rpb246IEhhbW1lci5ESVJFQ1RJT05fQUxMfSk7XG4gICAgdGhpcy50aW1lbGluZUxpc3RlbmVycyA9IHt9O1xuXG4gICAgY29uc3QgZXZlbnRzID0gW1xuICAgICAgJ3RhcCcsICdkb3VibGV0YXAnLCAncHJlc3MnLFxuICAgICAgJ3BpbmNoJyxcbiAgICAgICdwYW4nLCAncGFuc3RhcnQnLCAncGFubW92ZScsICdwYW5lbmQnXG4gICAgICAgIC8vIFRPRE86IGNsZWFudXBcbiAgICAgIC8vJ3RvdWNoJywgJ3BpbmNoJyxcbiAgICAgIC8vJ3RhcCcsICdkb3VibGV0YXAnLCAnaG9sZCcsXG4gICAgICAvLydkcmFnc3RhcnQnLCAnZHJhZycsICdkcmFnZW5kJyxcbiAgICAgIC8vJ21vdXNld2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnIC8vIERPTU1vdXNlU2Nyb2xsIGlzIG5lZWRlZCBmb3IgRmlyZWZveFxuICAgIF07XG4gICAgZXZlbnRzLmZvckVhY2godHlwZSA9PiB7XG4gICAgICBjb25zdCBsaXN0ZW5lciA9IGV2ZW50ID0+IHtcbiAgICAgICAgaWYgKG1lLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICBtZS5lbWl0KHR5cGUsIGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG1lLmhhbW1lci5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICBtZS50aW1lbGluZUxpc3RlbmVyc1t0eXBlXSA9IGxpc3RlbmVyO1xuICAgIH0pO1xuXG4gICAgLy8gZW11bGF0ZSBhIHRvdWNoIGV2ZW50IChlbWl0dGVkIGJlZm9yZSB0aGUgc3RhcnQgb2YgYSBwYW4sIHBpbmNoLCB0YXAsIG9yIHByZXNzKVxuICAgIG9uVG91Y2godGhpcy5oYW1tZXIsIGV2ZW50ID0+IHtcbiAgICAgIG1lLmVtaXQoJ3RvdWNoJywgZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgLy8gZW11bGF0ZSBhIHJlbGVhc2UgZXZlbnQgKGVtaXR0ZWQgYWZ0ZXIgYSBwYW4sIHBpbmNoLCB0YXAsIG9yIHByZXNzKVxuICAgIG9uUmVsZWFzZSh0aGlzLmhhbW1lciwgZXZlbnQgPT4ge1xuICAgICAgbWUuZW1pdCgncmVsZWFzZScsIGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtXaGVlbEV2ZW50fSBldmVudFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIG9uTW91c2VXaGVlbChldmVudCkge1xuXG4gICAgICAvLyBSZWFzb25hYmxlIGRlZmF1bHQgd2hlZWwgZGVsdGFzXG4gICAgICBjb25zdCBMSU5FX0hFSUdIVCA9IDQwO1xuICAgICAgY29uc3QgUEFHRV9IRUlHSFQgPSA4MDA7XG5cbiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdtb3VzZXdoZWVsJywgZXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBkZWx0YVggYW5kIGRlbHRhWSBub3JtYWxpemF0aW9uIGZyb20ganF1ZXJ5Lm1vdXNld2hlZWwuanNcbiAgICAgIGxldCBkZWx0YVggPSAwO1xuICAgICAgbGV0IGRlbHRhWSA9IDA7XG5cbiAgICAgIC8vIE9sZCBzY2hvb2wgc2Nyb2xsd2hlZWwgZGVsdGFcbiAgICAgIGlmICggJ2RldGFpbCcgICAgICBpbiBldmVudCApIHsgZGVsdGFZID0gZXZlbnQuZGV0YWlsICogLTE7ICAgICAgfVxuICAgICAgaWYgKCAnd2hlZWxEZWx0YScgIGluIGV2ZW50ICkgeyBkZWx0YVkgPSBldmVudC53aGVlbERlbHRhOyAgICAgICB9XG4gICAgICBpZiAoICd3aGVlbERlbHRhWScgaW4gZXZlbnQgKSB7IGRlbHRhWSA9IGV2ZW50LndoZWVsRGVsdGFZOyAgICAgIH1cbiAgICAgIGlmICggJ3doZWVsRGVsdGFYJyBpbiBldmVudCApIHsgZGVsdGFYID0gZXZlbnQud2hlZWxEZWx0YVggKiAtMTsgfVxuXG4gICAgICAvLyBGaXJlZm94IDwgMTcgaG9yaXpvbnRhbCBzY3JvbGxpbmcgcmVsYXRlZCB0byBET01Nb3VzZVNjcm9sbCBldmVudFxuICAgICAgaWYgKCAnYXhpcycgaW4gZXZlbnQgJiYgZXZlbnQuYXhpcyA9PT0gZXZlbnQuSE9SSVpPTlRBTF9BWElTICkge1xuICAgICAgICBkZWx0YVggPSBkZWx0YVkgKiAtMTtcbiAgICAgICAgZGVsdGFZID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gTmV3IHNjaG9vbCB3aGVlbCBkZWx0YSAod2hlZWwgZXZlbnQpXG4gICAgICBpZiAoICdkZWx0YVknIGluIGV2ZW50ICkge1xuICAgICAgICBkZWx0YVkgPSBldmVudC5kZWx0YVkgKiAtMTtcbiAgICAgIH1cbiAgICAgIGlmICggJ2RlbHRhWCcgaW4gZXZlbnQgKSB7XG4gICAgICAgIGRlbHRhWCA9IGV2ZW50LmRlbHRhWDtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsaXplIGRlbHRhc1xuICAgICAgaWYgKGV2ZW50LmRlbHRhTW9kZSkge1xuICAgICAgICAgIGlmIChldmVudC5kZWx0YU1vZGUgPT09IDEpIHsgICAvLyBkZWx0YSBpbiBMSU5FIHVuaXRzXG4gICAgICAgICAgICBkZWx0YVggKj0gTElORV9IRUlHSFQ7XG4gICAgICAgICAgICBkZWx0YVkgKj0gTElORV9IRUlHSFQ7XG4gICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbHRhIGluIFBBR0UgdW5pdHNcbiAgICAgICAgICAgIGRlbHRhWCAqPSBMSU5FX0hFSUdIVDtcbiAgICAgICAgICAgIGRlbHRhWSAqPSBQQUdFX0hFSUdIVDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUHJldmVudCBzY3JvbGxpbmcgd2hlbiB6b29taW5nIChubyB6b29tIGtleSwgb3IgcHJlc3Npbmcgem9vbSBrZXkpXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnByZWZlclpvb20pIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuem9vbUtleSB8fCBldmVudFt0aGlzLm9wdGlvbnMuem9vbUtleV0pIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuem9vbUtleSAmJiBldmVudFt0aGlzLm9wdGlvbnMuem9vbUtleV0pIHJldHVyblxuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcHJldmVudERlZmF1bHQgaWYgeW91IGNhbid0IHNjcm9sbFxuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwgJiYgIXRoaXMub3B0aW9ucy5ob3Jpem9udGFsU2Nyb2xsKSByZXR1cm47XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwgJiYgTWF0aC5hYnMoZGVsdGFZKSA+PSBNYXRoLmFicyhkZWx0YVgpKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnByb3BzLnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSBjdXJyZW50ICsgZGVsdGFZO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgICBjb25zdCBuZXdTY3JvbGxUb3AgPSB0aGlzLl9zZXRTY3JvbGxUb3AoYWRqdXN0ZWQpO1xuXG4gICAgICAgICAgaWYgKG5ld1Njcm9sbFRvcCAhPT0gY3VycmVudCkge1xuICAgICAgICAgICAgdGhpcy5fcmVkcmF3KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Njcm9sbCcsIGV2ZW50KTtcblxuICAgICAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGFjdGlvbnMgY2F1c2VkIGJ5IG1vdXNlIHdoZWVsXG4gICAgICAgICAgICAvLyAoZWxzZSB0aGUgcGFnZSBhbmQgdGltZWxpbmUgYm90aCBzY3JvbGwpXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuaG9yaXpvbnRhbFNjcm9sbCkge1xuICAgICAgICBjb25zdCBkZWx0YSA9IE1hdGguYWJzKGRlbHRhWCkgPj0gTWF0aC5hYnMoZGVsdGFZKSA/IGRlbHRhWCA6IGRlbHRhWTtcblxuICAgICAgICAvLyBjYWxjdWxhdGUgYSBzaW5nbGUgc2Nyb2xsIGp1bXAgcmVsYXRpdmUgdG8gdGhlIHJhbmdlIHNjYWxlXG4gICAgICAgIGNvbnN0IGRpZmYgPSAoZGVsdGEgLyAxMjApICogKHRoaXMucmFuZ2UuZW5kIC0gdGhpcy5yYW5nZS5zdGFydCkgLyAyMDtcbiAgICAgICAgLy8gY2FsY3VsYXRlIG5ldyBzdGFydCBhbmQgZW5kXG4gICAgICAgIGNvbnN0IG5ld1N0YXJ0ID0gdGhpcy5yYW5nZS5zdGFydCArIGRpZmY7XG4gICAgICAgIGNvbnN0IG5ld0VuZCA9IHRoaXMucmFuZ2UuZW5kICsgZGlmZjtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgIGFuaW1hdGlvbjogZmFsc2UsXG4gICAgICAgICAgYnlVc2VyOiB0cnVlLFxuICAgICAgICAgIGV2ZW50XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucmFuZ2Uuc2V0UmFuZ2UobmV3U3RhcnQsIG5ld0VuZCwgb3B0aW9ucyk7XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgbW9kZXJuIHdoZWVsIGV2ZW50IGxpc3RlbmVyXG4gICAgY29uc3Qgd2hlZWxUeXBlID0gXCJvbndoZWVsXCIgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSA/IFwid2hlZWxcIiA6IC8vIE1vZGVybiBicm93c2VycyBzdXBwb3J0IFwid2hlZWxcIlxuICAgIGRvY3VtZW50Lm9ubW91c2V3aGVlbCAhPT0gdW5kZWZpbmVkID8gXCJtb3VzZXdoZWVsXCIgOiAvLyBXZWJraXQgYW5kIElFIHN1cHBvcnQgYXQgbGVhc3QgXCJtb3VzZXdoZWVsXCJcbiAgICBcbiAgICAvLyBET01Nb3VzZVNjcm9sbCAtIE9sZGVyIEZpcmVmb3ggdmVyc2lvbnMgdXNlIFwiRE9NTW91c2VTY3JvbGxcIlxuICAgIC8vIG9ubW91c2V3aGVlbCAtIEFsbCB0aGUgdXNlIFwib25tb3VzZXdoZWVsXCJcbiAgICB0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lciA/IFwiRE9NTW91c2VTY3JvbGxcIiA6ICBcIm9ubW91c2V3aGVlbFwiO1xuICAgIHRoaXMuZG9tLnRvcC5hZGRFdmVudExpc3RlbmVyID8gXCJET01Nb3VzZVNjcm9sbFwiIDogXCJvbm1vdXNld2hlZWxcIjtcbiAgICB0aGlzLmRvbS5ib3R0b20uYWRkRXZlbnRMaXN0ZW5lciA/IFwiRE9NTW91c2VTY3JvbGxcIiA6IFwib25tb3VzZXdoZWVsXCI7XG4gICAgdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIod2hlZWxUeXBlLCBvbk1vdXNlV2hlZWwuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIHRoaXMuZG9tLnRvcC5hZGRFdmVudExpc3RlbmVyKHdoZWVsVHlwZSwgb25Nb3VzZVdoZWVsLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICB0aGlzLmRvbS5ib3R0b20uYWRkRXZlbnRMaXN0ZW5lcih3aGVlbFR5cGUsIG9uTW91c2VXaGVlbC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzY3JvbGx9IGV2ZW50XG4gICAgICovXG4gICAgZnVuY3Rpb24gb25Nb3VzZVNjcm9sbFNpZGUoZXZlbnQpIHtcbiAgICAgIGlmICghbWUub3B0aW9ucy52ZXJ0aWNhbFNjcm9sbCkgcmV0dXJuO1xuICAgICAgXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKG1lLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgY29uc3QgYWRqdXN0ZWQgPSAtZXZlbnQudGFyZ2V0LnNjcm9sbFRvcDtcbiAgICAgICAgbWUuX3NldFNjcm9sbFRvcChhZGp1c3RlZCk7XG4gICAgICAgIG1lLl9yZWRyYXcoKTtcbiAgICAgICAgbWUuZW1pdCgnc2Nyb2xsU2lkZScsIGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgb25Nb3VzZVNjcm9sbFNpZGUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBvbk1vdXNlU2Nyb2xsU2lkZS5iaW5kKHRoaXMpKTtcblxuICAgIGxldCBpdGVtQWRkZWRUb1RpbWVsaW5lID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZHJhZ292ZXJ9IGV2ZW50XG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFuZGxlRHJhZ092ZXIoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICBtZS5lbWl0KCdkcmFnb3ZlcicsIG1lLmdldEV2ZW50UHJvcGVydGllcyhldmVudCkpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBOZWNlc3NhcnkuIEFsbG93cyB1cyB0byBkcm9wLlxuICAgICAgfVxuXG4gICAgICAvLyBtYWtlIHN1cmUgeW91ciB0YXJnZXQgaXMgYSB0aW1lbGluZSBlbGVtZW50XG4gICAgICBpZiAoIShldmVudC50YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoXCJ0aW1lbGluZVwiKSA+IC0xKSkgcmV0dXJuO1xuXG4gICAgICAvLyBtYWtlIHN1cmUgb25seSBvbmUgaXRlbSBpcyBhZGRlZCBldmVyeSB0aW1lIHlvdSdyZSBvdmVyIHRoZSB0aW1lbGluZVxuICAgICAgaWYgKGl0ZW1BZGRlZFRvVGltZWxpbmUpIHJldHVybjtcblxuICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7ICBcbiAgICAgIGl0ZW1BZGRlZFRvVGltZWxpbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHBhcmFtIHtkcm9wfSBldmVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhbmRsZURyb3AoZXZlbnQpIHtcbiAgICAgIC8vIHByZXZlbnQgcmVkaXJlY3QgdG8gYmxhbmsgcGFnZSAtIEZpcmVmb3hcbiAgICAgIGlmKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7IGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IH1cbiAgICAgIGlmKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikgeyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfVxuICAgICAgLy8gcmV0dXJuIHdoZW4gZHJvcHBpbmcgbm9uLXRpbWVsaW5lIGl0ZW1zXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgaXRlbURhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7XG4gICAgICAgIGlmICghaXRlbURhdGEgfHwgIWl0ZW1EYXRhLmNvbnRlbnQpIHJldHVyblxuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaXRlbUFkZGVkVG9UaW1lbGluZSA9IGZhbHNlO1xuICAgICAgZXZlbnQuY2VudGVyID0ge1xuICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgICB9O1xuXG4gICAgICBpZiAoaXRlbURhdGEudGFyZ2V0ICE9PSAnaXRlbScpIHtcbiAgICAgICAgbWUuaXRlbVNldC5fb25BZGRJdGVtKGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lLml0ZW1TZXQuX29uRHJvcE9iamVjdE9uSXRlbShldmVudCk7XG4gICAgICB9XG4gICAgICBtZS5lbWl0KCdkcm9wJywgbWUuZ2V0RXZlbnRQcm9wZXJ0aWVzKGV2ZW50KSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5kb20uY2VudGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgaGFuZGxlRHJhZ092ZXIuYmluZCh0aGlzKSwgZmFsc2UpO1xuICAgIHRoaXMuZG9tLmNlbnRlci5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgaGFuZGxlRHJvcC5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICB0aGlzLmN1c3RvbVRpbWVzID0gW107XG5cbiAgICAvLyBzdG9yZSBzdGF0ZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHRvdWNoIGV2ZW50c1xuICAgIHRoaXMudG91Y2ggPSB7fTtcblxuICAgIHRoaXMucmVkcmF3Q291bnQgPSAwO1xuICAgIHRoaXMuaW5pdGlhbERyYXdEb25lID0gZmFsc2U7XG4gICAgdGhpcy5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lID0gZmFsc2U7XG5cbiAgICAvLyBhdHRhY2ggdGhlIHJvb3QgcGFuZWwgdG8gdGhlIHByb3ZpZGVkIGNvbnRhaW5lclxuICAgIGlmICghY29udGFpbmVyKSB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbnRhaW5lciBwcm92aWRlZCcpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yb290KTtcbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20ubG9hZGluZ1NjcmVlbik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9wdGlvbnMuIE9wdGlvbnMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGNvbXBvbmVudHMgbG9hZGVkIGluIHRoZSBUaW1lbGluZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTdHJpbmd9IG9yaWVudGF0aW9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWwgb3JpZW50YXRpb24gZm9yIHRoZSBUaW1lbGluZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgJ2JvdHRvbScgKGRlZmF1bHQpIG9yICd0b3AnLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpbmcgfCBudW1iZXJ9IHdpZHRoXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkdGggZm9yIHRoZSB0aW1lbGluZSwgYSBudW1iZXIgaW4gcGl4ZWxzIG9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjc3Mgc3RyaW5nIGxpa2UgJzEwMDBweCcgb3IgJzc1JScuICcxMDAlJyBieSBkZWZhdWx0LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpbmcgfCBudW1iZXJ9IGhlaWdodFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkIGhlaWdodCBmb3IgdGhlIFRpbWVsaW5lLCBhIG51bWJlciBpbiBwaXhlbHMgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNzcyBzdHJpbmcgbGlrZSAnNDAwcHgnIG9yICc3NSUnLiBJZiB1bmRlZmluZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFRpbWVsaW5lIHdpbGwgYXV0b21hdGljYWxseSBzaXplIHN1Y2ggdGhhdFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0cyBjb250ZW50cyBmaXQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0cmluZyB8IG51bWJlcn0gbWluSGVpZ2h0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluaW11bSBoZWlnaHQgZm9yIHRoZSBUaW1lbGluZSwgYSBudW1iZXIgaW4gcGl4ZWxzIG9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjc3Mgc3RyaW5nIGxpa2UgJzQwMHB4JyBvciAnNzUlJy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RyaW5nIHwgbnVtYmVyfSBtYXhIZWlnaHRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIGhlaWdodCBmb3IgdGhlIFRpbWVsaW5lLCBhIG51bWJlciBpbiBwaXhlbHMgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNzcyBzdHJpbmcgbGlrZSAnNDAwcHgnIG9yICc3NSUnLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSBzdGFydFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0IGRhdGUgZm9yIHRoZSB2aXNpYmxlIHdpbmRvd1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtudW1iZXIgfCBEYXRlIHwgc3RyaW5nfSBlbmRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgZGF0ZSBmb3IgdGhlIHZpc2libGUgd2luZG93XG4gICAqL1xuICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgLy8gY29weSB0aGUga25vd24gb3B0aW9uc1xuICAgICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgICAnd2lkdGgnLCAnaGVpZ2h0JywgJ21pbkhlaWdodCcsICdtYXhIZWlnaHQnLCAnYXV0b1Jlc2l6ZScsXG4gICAgICAgICdzdGFydCcsICdlbmQnLCAnY2xpY2tUb1VzZScsICdkYXRhQXR0cmlidXRlcycsICdoaWRkZW5EYXRlcycsXG4gICAgICAgICdsb2NhbGUnLCAnbG9jYWxlcycsICdtb21lbnQnLCAncHJlZmVyWm9vbScsICdydGwnLCAnem9vbUtleScsXG4gICAgICAgICdob3Jpem9udGFsU2Nyb2xsJywgJ3ZlcnRpY2FsU2Nyb2xsJywgJ2xvbmdTZWxlY3RQcmVzc1RpbWUnLCAnc25hcCdcbiAgICAgIF07XG4gICAgICB1dGlsLnNlbGVjdGl2ZUV4dGVuZChmaWVsZHMsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgIHRoaXMuZG9tLmNvbnRhaW5lci5zdHlsZS5kaXJlY3Rpb24gPSBcInJ0bFwiO1xuICAgICAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuY2xhc3NOYW1lID0gJ3Zpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtdmVydGljYWwtcnRsJzsgICAgXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgICB0aGlzLmRvbS5yaWdodENvbnRhaW5lci5jbGFzc05hbWUgPSAndmlzLXBhbmVsIHZpcy1yaWdodCB2aXMtdmVydGljYWwtc2Nyb2xsJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZSA9ICd2aXMtcGFuZWwgdmlzLWxlZnQgdmlzLXZlcnRpY2FsLXNjcm9sbCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbiA9IHtpdGVtOnVuZGVmaW5lZCxheGlzOnVuZGVmaW5lZH07XG4gICAgICB9XG4gICAgICBpZiAoJ29yaWVudGF0aW9uJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5vcmllbnRhdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gPSB7XG4gICAgICAgICAgICBpdGVtOiBvcHRpb25zLm9yaWVudGF0aW9uLFxuICAgICAgICAgICAgYXhpczogb3B0aW9ucy5vcmllbnRhdGlvblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKCdpdGVtJyBpbiBvcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSA9IG9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCdheGlzJyBpbiBvcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyA9IG9wdGlvbnMub3JpZW50YXRpb24uYXhpcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzID09PSAnYm90aCcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRpbWVBeGlzMikge1xuICAgICAgICAgIGNvbnN0IHRpbWVBeGlzMiA9IHRoaXMudGltZUF4aXMyID0gbmV3IFRpbWVBeGlzKHRoaXMuYm9keSk7XG4gICAgICAgICAgdGltZUF4aXMyLnNldE9wdGlvbnMgPSBvcHRpb25zID0+IHtcbiAgICAgICAgICAgIGNvbnN0IF9vcHRpb25zID0gb3B0aW9ucyA/IHV0aWwuZXh0ZW5kKHt9LCBvcHRpb25zKSA6IHt9O1xuICAgICAgICAgICAgX29wdGlvbnMub3JpZW50YXRpb24gPSAndG9wJzsgLy8gb3ZlcnJpZGUgdGhlIG9yaWVudGF0aW9uIG9wdGlvbiwgYWx3YXlzIHRvcFxuICAgICAgICAgICAgVGltZUF4aXMucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbCh0aW1lQXhpczIsIF9vcHRpb25zKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHRpbWVBeGlzMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAodGhpcy50aW1lQXhpczIpIHtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuY29tcG9uZW50cy5pbmRleE9mKHRoaXMudGltZUF4aXMyKTtcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50aW1lQXhpczIuZGVzdHJveSgpO1xuICAgICAgICAgIHRoaXMudGltZUF4aXMyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBpZiB0aGUgZ3JhcGgyZCdzIGRyYXdQb2ludHMgaXMgYSBmdW5jdGlvbiBkZWxlZ2F0ZSB0aGUgY2FsbGJhY2sgdG8gdGhlIG9uUmVuZGVyIHByb3BlcnR5XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZHJhd1BvaW50cyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9wdGlvbnMuZHJhd1BvaW50cyA9IHtcbiAgICAgICAgICAgIG9uUmVuZGVyOiBvcHRpb25zLmRyYXdQb2ludHNcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdoaWRkZW5EYXRlcycgaW4gdGhpcy5vcHRpb25zKSB7XG4gICAgICAgIGNvbnZlcnRIaWRkZW5PcHRpb25zKHRoaXMub3B0aW9ucy5tb21lbnQsIHRoaXMuYm9keSwgdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCdjbGlja1RvVXNlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWNrVG9Vc2UpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRvciA9IG5ldyBBY3RpdmF0b3IodGhpcy5kb20ucm9vdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmFjdGl2YXRvcikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0b3IuZGVzdHJveSgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYWN0aXZhdG9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBlbmFibGUvZGlzYWJsZSBhdXRvUmVzaXplXG4gICAgICB0aGlzLl9pbml0QXV0b1Jlc2l6ZSgpO1xuICAgIH1cblxuICAgIC8vIHByb3BhZ2F0ZSBvcHRpb25zIHRvIGFsbCBjb21wb25lbnRzXG4gICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IGNvbXBvbmVudC5zZXRPcHRpb25zKG9wdGlvbnMpKTtcblxuICAgIC8vIGVuYWJsZS9kaXNhYmxlIGNvbmZpZ3VyZVxuICAgIGlmICgnY29uZmlndXJlJyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdG9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlndXJhdG9yID0gdGhpcy5fY3JlYXRlQ29uZmlndXJhdG9yKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29uZmlndXJhdG9yLnNldE9wdGlvbnMob3B0aW9ucy5jb25maWd1cmUpO1xuXG4gICAgICAvLyBjb2xsZWN0IHRoZSBzZXR0aW5ncyBvZiBhbGwgY29tcG9uZW50cywgYW5kIHBhc3MgdGhlbSB0byB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW1cbiAgICAgIGNvbnN0IGFwcGxpZWRPcHRpb25zID0gdXRpbC5kZWVwRXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgdXRpbC5kZWVwRXh0ZW5kKGFwcGxpZWRPcHRpb25zLCBjb21wb25lbnQub3B0aW9ucyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29uZmlndXJhdG9yLnNldE1vZHVsZU9wdGlvbnMoe2dsb2JhbDogYXBwbGllZE9wdGlvbnN9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgVGltZWxpbmUgaXMgYWN0aXZlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQWN0aXZlKCkge1xuICAgIHJldHVybiAhdGhpcy5hY3RpdmF0b3IgfHwgdGhpcy5hY3RpdmF0b3IuYWN0aXZlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIENvcmUsIGNsZWFuIHVwIGFsbCBET00gZWxlbWVudHMgYW5kIGV2ZW50IGxpc3RlbmVycy5cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgLy8gdW5iaW5kIGRhdGFzZXRzXG4gICAgdGhpcy5zZXRJdGVtcyhudWxsKTtcbiAgICB0aGlzLnNldEdyb3VwcyhudWxsKTtcblxuICAgIC8vIHJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5vZmYoKTtcblxuICAgIC8vIHN0b3AgY2hlY2tpbmcgZm9yIGNoYW5nZWQgc2l6ZVxuICAgIHRoaXMuX3N0b3BBdXRvUmVzaXplKCk7XG5cbiAgICAvLyByZW1vdmUgZnJvbSBET01cbiAgICBpZiAodGhpcy5kb20ucm9vdC5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLmRvbS5yb290LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ucm9vdCk7XG4gICAgfVxuICAgIHRoaXMuZG9tID0gbnVsbDtcblxuICAgIC8vIHJlbW92ZSBBY3RpdmF0b3JcbiAgICBpZiAodGhpcy5hY3RpdmF0b3IpIHtcbiAgICAgIHRoaXMuYWN0aXZhdG9yLmRlc3Ryb3koKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2YXRvcjtcbiAgICB9XG5cbiAgICAvLyBjbGVhbnVwIGhhbW1lciB0b3VjaCBldmVudHNcbiAgICBmb3IgKGNvbnN0IGV2ZW50IGluIHRoaXMudGltZWxpbmVMaXN0ZW5lcnMpIHtcbiAgICAgIGlmICh0aGlzLnRpbWVsaW5lTGlzdGVuZXJzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICBkZWxldGUgdGhpcy50aW1lbGluZUxpc3RlbmVyc1tldmVudF07XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudGltZWxpbmVMaXN0ZW5lcnMgPSBudWxsO1xuICAgIHRoaXMuaGFtbWVyICYmIHRoaXMuaGFtbWVyLmRlc3Ryb3koKTtcbiAgICB0aGlzLmhhbW1lciA9IG51bGw7XG5cbiAgICAvLyBnaXZlIGFsbCBjb21wb25lbnRzIHRoZSBvcHBvcnR1bml0eSB0byBjbGVhbnVwXG4gICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IGNvbXBvbmVudC5kZXN0cm95KCkpO1xuXG4gICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjdXN0b20gdGltZSBiYXJcbiAgICogQHBhcmFtIHtEYXRlfSB0aW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaWQ9dW5kZWZpbmVkXSBPcHRpb25hbCBpZCBvZiB0aGUgY3VzdG9tIHRpbWUgYmFyIHRvIGJlIGFkanVzdGVkLlxuICAgKi9cbiAgc2V0Q3VzdG9tVGltZSh0aW1lLCBpZCkge1xuICAgIGNvbnN0IGN1c3RvbVRpbWVzID0gdGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoY29tcG9uZW50ID0+IGlkID09PSBjb21wb25lbnQub3B0aW9ucy5pZCk7XG5cbiAgICBpZiAoY3VzdG9tVGltZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGN1c3RvbSB0aW1lIGJhciBmb3VuZCB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkoaWQpfWApXG4gICAgfVxuXG4gICAgaWYgKGN1c3RvbVRpbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGN1c3RvbVRpbWVzWzBdLnNldEN1c3RvbVRpbWUodGltZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGN1c3RvbSB0aW1lLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2lkPXVuZGVmaW5lZF0gICAgSWQgb2YgdGhlIGN1c3RvbSB0aW1lIGJhci5cbiAgICogQHJldHVybiB7RGF0ZSB8IHVuZGVmaW5lZH0gY3VzdG9tVGltZVxuICAgKi9cbiAgZ2V0Q3VzdG9tVGltZShpZCkge1xuICAgIGNvbnN0IGN1c3RvbVRpbWVzID0gdGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5vcHRpb25zLmlkID09PSBpZCk7XG5cbiAgICBpZiAoY3VzdG9tVGltZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGN1c3RvbSB0aW1lIGJhciBmb3VuZCB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkoaWQpfWApXG4gICAgfVxuICAgIHJldHVybiBjdXN0b21UaW1lc1swXS5nZXRDdXN0b21UaW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY3VzdG9tIG1hcmtlciBmb3IgdGhlIGN1c3RvbSB0aW1lIGJhci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0aXRsZV0gVGl0bGUgb2YgdGhlIGN1c3RvbSBtYXJrZXIuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaWQ9dW5kZWZpbmVkXSBJZCBvZiB0aGUgY3VzdG9tIG1hcmtlci5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZWRpdGFibGU9ZmFsc2VdIE1ha2UgdGhlIGN1c3RvbSBtYXJrZXIgZWRpdGFibGUuXG4gICAqL1xuICBzZXRDdXN0b21UaW1lTWFya2VyKHRpdGxlLCBpZCwgZWRpdGFibGUpIHtcbiAgICBjb25zdCBjdXN0b21UaW1lcyA9IHRoaXMuY3VzdG9tVGltZXMuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQub3B0aW9ucy5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKGN1c3RvbVRpbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAke0pTT04uc3RyaW5naWZ5KGlkKX1gKVxuICAgIH1cbiAgICBpZiAoY3VzdG9tVGltZXMubGVuZ3RoID4gMCkge1xuICAgICAgY3VzdG9tVGltZXNbMF0uc2V0Q3VzdG9tTWFya2VyKHRpdGxlLCBlZGl0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGN1c3RvbSB0aXRsZSBmb3IgdGhlIGN1c3RvbSB0aW1lIGJhci5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0aXRsZV0gQ3VzdG9tIHRpdGxlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbaWQ9dW5kZWZpbmVkXSAgICBJZCBvZiB0aGUgY3VzdG9tIHRpbWUgYmFyLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHNldEN1c3RvbVRpbWVUaXRsZSh0aXRsZSwgaWQpIHtcbiAgICBjb25zdCBjdXN0b21UaW1lcyA9IHRoaXMuY3VzdG9tVGltZXMuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQub3B0aW9ucy5pZCA9PT0gaWQpO1xuXG4gICAgaWYgKGN1c3RvbVRpbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCAke0pTT04uc3RyaW5naWZ5KGlkKX1gKVxuICAgIH1cbiAgICBpZiAoY3VzdG9tVGltZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGN1c3RvbVRpbWVzWzBdLnNldEN1c3RvbVRpdGxlKHRpdGxlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgbWV0YSBpbmZvcm1hdGlvbiBmcm9tIGFuIGV2ZW50LlxuICAgKiBTaG91bGQgYmUgb3ZlcnJpZGRlbiBieSBjbGFzc2VzIGV4dGVuZGluZyBDb3JlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggcmVsYXRlZCBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGdldEV2ZW50UHJvcGVydGllcyhldmVudCkge1xuICAgIHJldHVybiB7IGV2ZW50IH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGN1c3RvbSB2ZXJ0aWNhbCBiYXJcbiAgICogQHBhcmFtIHtEYXRlIHwgc3RyaW5nIHwgbnVtYmVyfSBbdGltZV0gIEEgRGF0ZSwgdW5peCB0aW1lc3RhbXAsIG9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU08gZGF0ZSBzdHJpbmcuIFRpbWUgcG9pbnQgd2hlcmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgYmFyIHNob3VsZCBiZSBwbGFjZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBub3QgcHJvdmlkZWQsIGBuZXcgRGF0ZSgpYCB3aWxsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gW2lkPXVuZGVmaW5lZF0gSWQgb2YgdGhlIG5ldyBiYXIuIE9wdGlvbmFsXG4gICAqIEByZXR1cm4ge251bWJlciB8IHN0cmluZ30gICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBpZCBvZiB0aGUgbmV3IGJhclxuICAgKi9cbiAgYWRkQ3VzdG9tVGltZSh0aW1lLCBpZCkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHRpbWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHV0aWwuY29udmVydCh0aW1lLCAnRGF0ZScpXG4gICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgIGNvbnN0IGV4aXN0cyA9IHRoaXMuY3VzdG9tVGltZXMuc29tZShjdXN0b21UaW1lID0+IGN1c3RvbVRpbWUub3B0aW9ucy5pZCA9PT0gaWQpO1xuICAgIGlmIChleGlzdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQSBjdXN0b20gdGltZSB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkoaWQpfSBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbVRpbWUgPSBuZXcgQ3VzdG9tVGltZSh0aGlzLmJvZHksIHV0aWwuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMsIHtcbiAgICAgIHRpbWU6IHRpbWVzdGFtcCxcbiAgICAgIGlkLFxuICAgICAgc25hcDogdGhpcy5pdGVtU2V0ID8gdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc25hcCA6IHRoaXMub3B0aW9ucy5zbmFwXG4gICAgfSkpO1xuXG4gICAgdGhpcy5jdXN0b21UaW1lcy5wdXNoKGN1c3RvbVRpbWUpO1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGN1c3RvbVRpbWUpO1xuICAgIHRoaXMuX3JlZHJhdygpO1xuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBwcmV2aW91c2x5IGFkZGVkIGN1c3RvbSBiYXJcbiAgICogQHBhcmFtIHtpbnR9IGlkIElEIG9mIHRoZSBjdXN0b20gYmFyIHRvIGJlIHJlbW92ZWRcbiAgICogW2F0XXJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGJhciBleGlzdHMgYW5kIGlzIHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgcmVtb3ZlQ3VzdG9tVGltZShpZCkge1xuICAgIGNvbnN0IGN1c3RvbVRpbWVzID0gdGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoYmFyID0+IGJhci5vcHRpb25zLmlkID09PSBpZCk7XG5cbiAgICBpZiAoY3VzdG9tVGltZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGN1c3RvbSB0aW1lIGJhciBmb3VuZCB3aXRoIGlkICR7SlNPTi5zdHJpbmdpZnkoaWQpfWApXG4gICAgfVxuXG4gICAgY3VzdG9tVGltZXMuZm9yRWFjaChjdXN0b21UaW1lID0+IHtcbiAgICAgIHRoaXMuY3VzdG9tVGltZXMuc3BsaWNlKHRoaXMuY3VzdG9tVGltZXMuaW5kZXhPZihjdXN0b21UaW1lKSwgMSk7XG4gICAgICB0aGlzLmNvbXBvbmVudHMuc3BsaWNlKHRoaXMuY29tcG9uZW50cy5pbmRleE9mKGN1c3RvbVRpbWUpLCAxKTtcbiAgICAgIGN1c3RvbVRpbWUuZGVzdHJveSgpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaWQncyBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgaXRlbXMuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gVGhlIGlkcyBvZiB0aGUgdmlzaWJsZSBpdGVtc1xuICAgKi9cbiAgZ2V0VmlzaWJsZUl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1TZXQgJiYgdGhpcy5pdGVtU2V0LmdldFZpc2libGVJdGVtcygpIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaWQncyBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgZ3JvdXBzLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBpZHMgb2YgdGhlIHZpc2libGUgZ3JvdXBzXG4gICAqL1xuICBnZXRWaXNpYmxlR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1TZXQgJiYgdGhpcy5pdGVtU2V0LmdldFZpc2libGVHcm91cHMoKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgQ29yZSB3aW5kb3cgc3VjaCB0aGF0IGl0IGZpdHMgYWxsIGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuaW1hdGlvbjogYm9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfWBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlIHJhbmdlIGlzIGFuaW1hdGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RobHkgdG8gdGhlIG5ldyB3aW5kb3cuIEFuIG9iamVjdCBjYW4gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB0byBzcGVjaWZ5IGR1cmF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkdXJhdGlvbiBpcyA1MDAgbXMsIGFuZCBkZWZhdWx0IGVhc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzICdlYXNlSW5PdXRRdWFkJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBhIGNhbGxiYWNrIGZ1bnRpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAqL1xuICBmaXQob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0RGF0YVJhbmdlKCk7XG5cbiAgICAvLyBza2lwIHJhbmdlIHNldCBpZiB0aGVyZSBpcyBubyBtaW4gYW5kIG1heCBkYXRlXG4gICAgaWYgKHJhbmdlLm1pbiA9PT0gbnVsbCAmJiByYW5nZS5tYXggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBhcHBseSBhIG1hcmdpbiBvZiAxJSBsZWZ0IGFuZCByaWdodCBvZiB0aGUgZGF0YVxuICAgIGNvbnN0IGludGVydmFsID0gcmFuZ2UubWF4IC0gcmFuZ2UubWluO1xuICAgIGNvbnN0IG1pbiA9IG5ldyBEYXRlKHJhbmdlLm1pbi52YWx1ZU9mKCkgLSBpbnRlcnZhbCAqIDAuMDEpO1xuICAgIGNvbnN0IG1heCA9IG5ldyBEYXRlKHJhbmdlLm1heC52YWx1ZU9mKCkgKyBpbnRlcnZhbCAqIDAuMDEpO1xuICAgIGNvbnN0IGFuaW1hdGlvbiA9IChvcHRpb25zICYmIG9wdGlvbnMuYW5pbWF0aW9uICE9PSB1bmRlZmluZWQpID8gb3B0aW9ucy5hbmltYXRpb24gOiB0cnVlO1xuICAgIHRoaXMucmFuZ2Uuc2V0UmFuZ2UobWluLCBtYXgsIHsgYW5pbWF0aW9uIH0sIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGRhdGEgcmFuZ2Ugb2YgdGhlIGl0ZW1zIHN0YXJ0IGFuZCBlbmQgZGF0ZXNcbiAgICogW2F0XXJldHVybnMge3ttaW46IFtEYXRlXSwgbWF4OiBbRGF0ZV19fVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBnZXREYXRhUmFuZ2UoKSB7XG4gICAgLy8gbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBUaW1lbGluZSBhbmQgR3JhcGgyZFxuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGludm9rZSBhYnN0cmFjdCBtZXRob2QgZ2V0RGF0YVJhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB2aXNpYmxlIHdpbmRvdy4gQm90aCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCwgeW91IGNhbiBjaGFuZ2Ugb25seVxuICAgKiBzdGFydCBvciBvbmx5IGVuZC4gU3ludGF4OlxuICAgKlxuICAgKiAgICAgVGltZUxpbmUuc2V0V2luZG93KHN0YXJ0LCBlbmQpXG4gICAqICAgICBUaW1lTGluZS5zZXRXaW5kb3coc3RhcnQsIGVuZCwgb3B0aW9ucylcbiAgICogICAgIFRpbWVMaW5lLnNldFdpbmRvdyhyYW5nZSlcbiAgICpcbiAgICogV2hlcmUgc3RhcnQgYW5kIGVuZCBjYW4gYmUgYSBEYXRlLCBudW1iZXIsIG9yIHN0cmluZywgYW5kIHJhbmdlIGlzIGFuXG4gICAqIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgc3RhcnQgYW5kIGVuZC5cbiAgICpcbiAgICogQHBhcmFtIHtEYXRlIHwgbnVtYmVyIHwgc3RyaW5nIHwgT2JqZWN0fSBbc3RhcnRdIFN0YXJ0IGRhdGUgb2YgdmlzaWJsZSB3aW5kb3dcbiAgICogQHBhcmFtIHtEYXRlIHwgbnVtYmVyIHwgc3RyaW5nfSBbZW5kXSAgICAgICAgICAgIEVuZCBkYXRlIG9mIHZpc2libGUgd2luZG93XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuaW1hdGlvbjogYm9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfWBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlIHJhbmdlIGlzIGFuaW1hdGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RobHkgdG8gdGhlIG5ldyB3aW5kb3cuIEFuIG9iamVjdCBjYW4gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB0byBzcGVjaWZ5IGR1cmF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkdXJhdGlvbiBpcyA1MDAgbXMsIGFuZCBkZWZhdWx0IGVhc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzICdlYXNlSW5PdXRRdWFkJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBhIGNhbGxiYWNrIGZ1bnRpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAqL1xuICBzZXRXaW5kb3coc3RhcnQsIGVuZCwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1syXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJndW1lbnRzWzJdO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBsZXQgYW5pbWF0aW9uO1xuICAgIGxldCByYW5nZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICByYW5nZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGFuaW1hdGlvbiA9IChyYW5nZS5hbmltYXRpb24gIT09IHVuZGVmaW5lZCkgPyByYW5nZS5hbmltYXRpb24gOiB0cnVlO1xuICAgICAgdGhpcy5yYW5nZS5zZXRSYW5nZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCB7IGFuaW1hdGlvbiB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyICYmIHR5cGVvZiBhcmd1bWVudHNbMV0gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByYW5nZSA9IGFyZ3VtZW50c1swXTtcbiAgICAgIGNhbGxiYWNrID0gYXJndW1lbnRzWzFdO1xuICAgICAgYW5pbWF0aW9uID0gKHJhbmdlLmFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSA/IHJhbmdlLmFuaW1hdGlvbiA6IHRydWU7XG4gICAgICB0aGlzLnJhbmdlLnNldFJhbmdlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQsIHsgYW5pbWF0aW9uIH0sIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBhbmltYXRpb24gPSAob3B0aW9ucyAmJiBvcHRpb25zLmFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuYW5pbWF0aW9uIDogdHJ1ZTtcbiAgICAgIHRoaXMucmFuZ2Uuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgeyBhbmltYXRpb24gfSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSB3aW5kb3cgc3VjaCB0aGF0IGdpdmVuIHRpbWUgaXMgY2VudGVyZWQgb24gc2NyZWVuLlxuICAgKiBAcGFyYW0ge0RhdGUgfCBudW1iZXIgfCBzdHJpbmd9IHRpbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgQXZhaWxhYmxlIG9wdGlvbnM6XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYW5pbWF0aW9uOiBib29sZWFuIHwge2R1cmF0aW9uOiBudW1iZXIsIGVhc2luZ0Z1bmN0aW9uOiBzdHJpbmd9YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpLCB0aGUgcmFuZ2UgaXMgYW5pbWF0ZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhseSB0byB0aGUgbmV3IHdpbmRvdy4gQW4gb2JqZWN0IGNhbiBiZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRvIHNwZWNpZnkgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGR1cmF0aW9uIGlzIDUwMCBtcywgYW5kIGRlZmF1bHQgZWFzaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgJ2Vhc2VJbk91dFF1YWQnLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIGEgY2FsbGJhY2sgZnVudGlvbiB0byBiZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb25cbiAgICovXG4gIG1vdmVUbyh0aW1lLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzFdID09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY2FsbGJhY2sgPSBhcmd1bWVudHNbMV07XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5yYW5nZS5lbmQgLSB0aGlzLnJhbmdlLnN0YXJ0O1xuICAgIGNvbnN0IHQgPSB1dGlsLmNvbnZlcnQodGltZSwgJ0RhdGUnKS52YWx1ZU9mKCk7XG5cbiAgICBjb25zdCBzdGFydCA9IHQgLSBpbnRlcnZhbCAvIDI7XG4gICAgY29uc3QgZW5kID0gdCArIGludGVydmFsIC8gMjtcbiAgICBjb25zdCBhbmltYXRpb24gPSAob3B0aW9ucyAmJiBvcHRpb25zLmFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkKSA/IG9wdGlvbnMuYW5pbWF0aW9uIDogdHJ1ZTtcblxuICAgIHRoaXMucmFuZ2Uuc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgeyBhbmltYXRpb24gfSwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdmlzaWJsZSB3aW5kb3dcbiAgICogQHJldHVybiB7e3N0YXJ0OiBEYXRlLCBlbmQ6IERhdGV9fSAgIFZpc2libGUgcmFuZ2VcbiAgICovXG4gIGdldFdpbmRvdygpIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMucmFuZ2UuZ2V0UmFuZ2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5ldyBEYXRlKHJhbmdlLnN0YXJ0KSxcbiAgICAgIGVuZDogbmV3IERhdGUocmFuZ2UuZW5kKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogWm9vbSBpbiB0aGUgd2luZG93IHN1Y2ggdGhhdCBnaXZlbiB0aW1lIGlzIGNlbnRlcmVkIG9uIHNjcmVlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHBlcmNlbnRhZ2UgLSBtdXN0IGJlIGJldHdlZW4gWzAuLjFdXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuaW1hdGlvbjogYm9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfWBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlIHJhbmdlIGlzIGFuaW1hdGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RobHkgdG8gdGhlIG5ldyB3aW5kb3cuIEFuIG9iamVjdCBjYW4gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB0byBzcGVjaWZ5IGR1cmF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkdXJhdGlvbiBpcyA1MDAgbXMsIGFuZCBkZWZhdWx0IGVhc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzICdlYXNlSW5PdXRRdWFkJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBhIGNhbGxiYWNrIGZ1bnRpb24gdG8gYmUgZXhlY3V0ZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uXG4gICAqL1xuICB6b29tSW4ocGVyY2VudGFnZSwgb3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBpZiAoIXBlcmNlbnRhZ2UgfHwgcGVyY2VudGFnZSA8IDAgfHwgcGVyY2VudGFnZSA+IDEpIHJldHVybjtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1sxXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGNhbGxiYWNrID0gYXJndW1lbnRzWzFdO1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0V2luZG93KCk7XG4gICAgY29uc3Qgc3RhcnQgPSByYW5nZS5zdGFydC52YWx1ZU9mKCk7XG4gICAgY29uc3QgZW5kID0gcmFuZ2UuZW5kLnZhbHVlT2YoKTtcbiAgICBjb25zdCBpbnRlcnZhbCA9IGVuZCAtIHN0YXJ0O1xuICAgIGNvbnN0IG5ld0ludGVydmFsID0gaW50ZXJ2YWwgLyAoMSArIHBlcmNlbnRhZ2UpO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gKGludGVydmFsIC0gbmV3SW50ZXJ2YWwpIC8gMjtcbiAgICBjb25zdCBuZXdTdGFydCA9IHN0YXJ0ICsgZGlzdGFuY2U7XG4gICAgY29uc3QgbmV3RW5kID0gZW5kIC0gZGlzdGFuY2U7XG5cbiAgICB0aGlzLnNldFdpbmRvdyhuZXdTdGFydCwgbmV3RW5kLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogWm9vbSBvdXQgdGhlIHdpbmRvdyBzdWNoIHRoYXQgZ2l2ZW4gdGltZSBpcyBjZW50ZXJlZCBvbiBzY3JlZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwZXJjZW50YWdlIC0gbXVzdCBiZSBiZXR3ZWVuIFswLi4xXVxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdICBBdmFpbGFibGUgb3B0aW9uczpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhbmltYXRpb246IGJvb2xlYW4gfCB7ZHVyYXRpb246IG51bWJlciwgZWFzaW5nRnVuY3Rpb246IHN0cmluZ31gXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCksIHRoZSByYW5nZSBpcyBhbmltYXRlZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aGx5IHRvIHRoZSBuZXcgd2luZG93LiBBbiBvYmplY3QgY2FuIGJlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgdG8gc3BlY2lmeSBkdXJhdGlvbiBhbmQgZWFzaW5nIGZ1bmN0aW9uLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgZHVyYXRpb24gaXMgNTAwIG1zLCBhbmQgZGVmYXVsdCBlYXNpbmdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBpcyAnZWFzZUluT3V0UXVhZCcuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gYSBjYWxsYmFjayBmdW50aW9uIHRvIGJlIGV4ZWN1dGVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvblxuICAgKi9cbiAgem9vbU91dChwZXJjZW50YWdlLCBvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGlmICghcGVyY2VudGFnZSB8fCBwZXJjZW50YWdlIDwgMCB8fCBwZXJjZW50YWdlID4gMSkgcmV0dXJuXG4gICAgaWYgKHR5cGVvZiBhcmd1bWVudHNbMV0gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjYWxsYmFjayA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdldFdpbmRvdygpO1xuICAgIGNvbnN0IHN0YXJ0ID0gcmFuZ2Uuc3RhcnQudmFsdWVPZigpO1xuICAgIGNvbnN0IGVuZCA9IHJhbmdlLmVuZC52YWx1ZU9mKCk7XG4gICAgY29uc3QgaW50ZXJ2YWwgPSBlbmQgLSBzdGFydDtcbiAgICBjb25zdCBuZXdTdGFydCA9IHN0YXJ0IC0gaW50ZXJ2YWwgKiBwZXJjZW50YWdlIC8gMjtcbiAgICBjb25zdCBuZXdFbmQgPSBlbmQgKyBpbnRlcnZhbCAqIHBlcmNlbnRhZ2UgLyAyO1xuXG4gICAgdGhpcy5zZXRXaW5kb3cobmV3U3RhcnQsIG5ld0VuZCwgb3B0aW9ucywgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmNlIGEgcmVkcmF3LiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBpbXBsZW1lbnRhdGlvbnMgb2YgQ29yZVxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBvbiBjb25zdHJ1Y3Rpb24gd2l0aCBhIHRyb3R0bGVkIHZlcnNpb25cbiAgICovXG4gIHJlZHJhdygpIHtcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWRyYXcgZm9yIGludGVybmFsIHVzZS4gUmVkcmF3cyBhbGwgY29tcG9uZW50cy4gU2VlIGFsc28gdGhlIHB1YmxpY1xuICAgKiBtZXRob2QgcmVkcmF3LlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBfcmVkcmF3KCkge1xuICAgIHRoaXMucmVkcmF3Q291bnQrKztcbiAgICBjb25zdCBkb20gPSB0aGlzLmRvbTtcbiAgICBcbiAgICBpZiAoIWRvbSB8fCAhZG9tLmNvbnRhaW5lciB8fCBkb20ucm9vdC5vZmZzZXRXaWR0aCA9PSAwKSByZXR1cm47IC8vIHdoZW4gZGVzdHJveWVkLCBvciBpbnZpc2libGVcbiAgICBcbiAgICBsZXQgcmVzaXplZCA9IGZhbHNlO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgdXBkYXRlSGlkZGVuRGF0ZXModGhpcy5vcHRpb25zLm1vbWVudCwgdGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpO1xuXG4gICAgLy8gdXBkYXRlIGNsYXNzIG5hbWVzXG4gICAgaWYgKG9wdGlvbnMub3JpZW50YXRpb24gPT0gJ3RvcCcpIHtcbiAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKGRvbS5yb290LCAndmlzLXRvcCcpO1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUoZG9tLnJvb3QsICd2aXMtYm90dG9tJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUoZG9tLnJvb3QsICd2aXMtdG9wJyk7XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZShkb20ucm9vdCwgJ3Zpcy1ib3R0b20nKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5ydGwpIHtcbiAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKGRvbS5yb290LCAndmlzLXJ0bCcpO1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUoZG9tLnJvb3QsICd2aXMtbHRyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKGRvbS5yb290LCAndmlzLWx0cicpO1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUoZG9tLnJvb3QsICd2aXMtcnRsJyk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHJvb3Qgd2lkdGggYW5kIGhlaWdodCBvcHRpb25zXG4gICAgZG9tLnJvb3Quc3R5bGUubWF4SGVpZ2h0ID0gdXRpbC5vcHRpb24uYXNTaXplKG9wdGlvbnMubWF4SGVpZ2h0LCAnJyk7XG4gICAgZG9tLnJvb3Quc3R5bGUubWluSGVpZ2h0ID0gdXRpbC5vcHRpb24uYXNTaXplKG9wdGlvbnMubWluSGVpZ2h0LCAnJyk7XG4gICAgZG9tLnJvb3Quc3R5bGUud2lkdGggPSB1dGlsLm9wdGlvbi5hc1NpemUob3B0aW9ucy53aWR0aCwgJycpO1xuICAgIGNvbnN0IHJvb3RPZmZzZXRXaWR0aCA9IGRvbS5yb290Lm9mZnNldFdpZHRoO1xuXG4gICAgLy8gY2FsY3VsYXRlIGJvcmRlciB3aWR0aHNcbiAgICBwcm9wcy5ib3JkZXIubGVmdCA9IDE7XG4gICAgcHJvcHMuYm9yZGVyLnJpZ2h0ID0gMTtcbiAgICBwcm9wcy5ib3JkZXIudG9wID0gMTtcbiAgICBwcm9wcy5ib3JkZXIuYm90dG9tID0gMTtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgaGVpZ2h0cy4gSWYgYW55IG9mIHRoZSBzaWRlIHBhbmVscyBpcyBlbXB0eSwgd2Ugc2V0IHRoZSBoZWlnaHQgdG9cbiAgICAvLyBtaW51cyB0aGUgYm9yZGVyIHdpZHRoLCBzdWNoIHRoYXQgdGhlIGJvcmRlciB3aWxsIGJlIGludmlzaWJsZVxuICAgIHByb3BzLmNlbnRlci5oZWlnaHQgPSBkb20uY2VudGVyLm9mZnNldEhlaWdodDtcbiAgICBwcm9wcy5sZWZ0LmhlaWdodCAgID0gZG9tLmxlZnQub2Zmc2V0SGVpZ2h0O1xuICAgIHByb3BzLnJpZ2h0LmhlaWdodCAgPSBkb20ucmlnaHQub2Zmc2V0SGVpZ2h0O1xuICAgIHByb3BzLnRvcC5oZWlnaHQgICAgPSBkb20udG9wLmNsaWVudEhlaWdodCAgICB8fCAtcHJvcHMuYm9yZGVyLnRvcDtcbiAgICBwcm9wcy5ib3R0b20uaGVpZ2h0ID0gTWF0aC5yb3VuZChkb20uYm90dG9tLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCkgfHwgZG9tLmJvdHRvbS5jbGllbnRIZWlnaHQgfHwgLXByb3BzLmJvcmRlci5ib3R0b207XG5cbiAgICAvLyBUT0RPOiBjb21wZW5zYXRlIGJvcmRlcnMgd2hlbiBhbnkgb2YgdGhlIHBhbmVscyBpcyBlbXB0eS5cblxuICAgIC8vIGFwcGx5IGF1dG8gaGVpZ2h0XG4gICAgLy8gVE9ETzogb25seSBjYWxjdWxhdGUgYXV0b0hlaWdodCB3aGVuIG5lZWRlZCAoZWxzZSB3ZSBjYXVzZSBhbiBleHRyYSByZWZsb3cvcmVwYWludCBvZiB0aGUgRE9NKVxuICAgIGNvbnN0IGNvbnRlbnRIZWlnaHQgPSBNYXRoLm1heChwcm9wcy5sZWZ0LmhlaWdodCwgcHJvcHMuY2VudGVyLmhlaWdodCwgcHJvcHMucmlnaHQuaGVpZ2h0KTtcbiAgICBjb25zdCBhdXRvSGVpZ2h0ID0gcHJvcHMudG9wLmhlaWdodCArIGNvbnRlbnRIZWlnaHQgKyBwcm9wcy5ib3R0b20uaGVpZ2h0ICsgcHJvcHMuYm9yZGVyLnRvcCArIHByb3BzLmJvcmRlci5ib3R0b207XG4gICAgZG9tLnJvb3Quc3R5bGUuaGVpZ2h0ID0gdXRpbC5vcHRpb24uYXNTaXplKG9wdGlvbnMuaGVpZ2h0LCBgJHthdXRvSGVpZ2h0fXB4YCk7XG5cbiAgICAvLyBjYWxjdWxhdGUgaGVpZ2h0cyBvZiB0aGUgY29udGVudCBwYW5lbHNcbiAgICBwcm9wcy5yb290LmhlaWdodCA9IGRvbS5yb290Lm9mZnNldEhlaWdodDtcbiAgICBwcm9wcy5iYWNrZ3JvdW5kLmhlaWdodCA9IHByb3BzLnJvb3QuaGVpZ2h0O1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHByb3BzLnJvb3QuaGVpZ2h0IC0gcHJvcHMudG9wLmhlaWdodCAtIHByb3BzLmJvdHRvbS5oZWlnaHQ7XG4gICAgcHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCAgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgcHJvcHMubGVmdENvbnRhaW5lci5oZWlnaHQgICAgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgcHJvcHMucmlnaHRDb250YWluZXIuaGVpZ2h0ICAgPSBwcm9wcy5sZWZ0Q29udGFpbmVyLmhlaWdodDtcblxuICAgIC8vIGNhbGN1bGF0ZSB0aGUgd2lkdGhzIG9mIHRoZSBwYW5lbHNcbiAgICBwcm9wcy5yb290LndpZHRoID0gcm9vdE9mZnNldFdpZHRoO1xuICAgIHByb3BzLmJhY2tncm91bmQud2lkdGggPSBwcm9wcy5yb290LndpZHRoO1xuXG4gICAgaWYgKCF0aGlzLmluaXRpYWxEcmF3RG9uZSkge1xuICAgICAgcHJvcHMuc2Nyb2xsYmFyV2lkdGggPSB1dGlsLmdldFNjcm9sbEJhcldpZHRoKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbGVmdENvbnRhaW5lckNsaWVudFdpZHRoID0gZG9tLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGg7XG4gICAgY29uc3QgcmlnaHRDb250YWluZXJDbGllbnRXaWR0aCA9IGRvbS5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aDtcblxuICAgIGlmIChvcHRpb25zLnZlcnRpY2FsU2Nyb2xsKSB7XG4gICAgICBpZiAob3B0aW9ucy5ydGwpIHtcbiAgICAgICAgcHJvcHMubGVmdC53aWR0aCA9IGxlZnRDb250YWluZXJDbGllbnRXaWR0aCB8fCAtcHJvcHMuYm9yZGVyLmxlZnQ7XG4gICAgICAgIHByb3BzLnJpZ2h0LndpZHRoID0gcmlnaHRDb250YWluZXJDbGllbnRXaWR0aCArIHByb3BzLnNjcm9sbGJhcldpZHRoIHx8IC1wcm9wcy5ib3JkZXIucmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wcy5sZWZ0LndpZHRoID0gbGVmdENvbnRhaW5lckNsaWVudFdpZHRoICsgcHJvcHMuc2Nyb2xsYmFyV2lkdGggfHwgLXByb3BzLmJvcmRlci5sZWZ0O1xuICAgICAgICBwcm9wcy5yaWdodC53aWR0aCA9IHJpZ2h0Q29udGFpbmVyQ2xpZW50V2lkdGggfHwgLXByb3BzLmJvcmRlci5yaWdodDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvcHMubGVmdC53aWR0aCA9IGxlZnRDb250YWluZXJDbGllbnRXaWR0aCAgfHwgLXByb3BzLmJvcmRlci5sZWZ0O1xuICAgICAgcHJvcHMucmlnaHQud2lkdGggPSByaWdodENvbnRhaW5lckNsaWVudFdpZHRoIHx8IC1wcm9wcy5ib3JkZXIucmlnaHQ7XG4gICAgfVxuXG4gICAgdGhpcy5fc2V0RE9NKCk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIHNjcm9sbFRvcCwgZmVhc2libGUgcmFuZ2UgZm9yIHRoZSBvZmZzZXQgY2FuIGJlIGNoYW5nZWRcbiAgICAvLyB3aGVuIHRoZSBoZWlnaHQgb2YgdGhlIENvcmUgb3Igb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBjZW50ZXIgY2hhbmdlZFxuICAgIGxldCBvZmZzZXQgPSB0aGlzLl91cGRhdGVTY3JvbGxUb3AoKTtcblxuICAgIC8vIHJlcG9zaXRpb24gdGhlIHNjcm9sbGFibGUgY29udGVudHNcbiAgICBpZiAob3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtICE9ICd0b3AnKSB7XG4gICAgICBvZmZzZXQgKz0gTWF0aC5tYXgocHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCAtIHByb3BzLmNlbnRlci5oZWlnaHQgLVxuICAgICAgICBwcm9wcy5ib3JkZXIudG9wIC0gcHJvcHMuYm9yZGVyLmJvdHRvbSwgMCk7XG4gICAgfVxuICAgIGRvbS5jZW50ZXIuc3R5bGUudHJhbnNmb3JtICA9IGB0cmFuc2xhdGVZKCR7b2Zmc2V0fXB4KWA7XG5cbiAgICAvLyBzaG93IHNoYWRvd3Mgd2hlbiB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMgYXZhaWxhYmxlXG4gICAgY29uc3QgdmlzaWJpbGl0eVRvcCA9IHByb3BzLnNjcm9sbFRvcCA9PSAwID8gJ2hpZGRlbicgOiAnJztcbiAgICBjb25zdCB2aXNpYmlsaXR5Qm90dG9tID0gcHJvcHMuc2Nyb2xsVG9wID09IHByb3BzLnNjcm9sbFRvcE1pbiA/ICdoaWRkZW4nIDogJyc7XG4gICAgZG9tLnNoYWRvd1RvcC5zdHlsZS52aXNpYmlsaXR5ICAgICAgICAgID0gdmlzaWJpbGl0eVRvcDtcbiAgICBkb20uc2hhZG93Qm90dG9tLnN0eWxlLnZpc2liaWxpdHkgICAgICAgPSB2aXNpYmlsaXR5Qm90dG9tO1xuICAgIGRvbS5zaGFkb3dUb3BMZWZ0LnN0eWxlLnZpc2liaWxpdHkgICAgICA9IHZpc2liaWxpdHlUb3A7XG4gICAgZG9tLnNoYWRvd0JvdHRvbUxlZnQuc3R5bGUudmlzaWJpbGl0eSAgID0gdmlzaWJpbGl0eUJvdHRvbTtcbiAgICBkb20uc2hhZG93VG9wUmlnaHQuc3R5bGUudmlzaWJpbGl0eSAgICAgPSB2aXNpYmlsaXR5VG9wO1xuICAgIGRvbS5zaGFkb3dCb3R0b21SaWdodC5zdHlsZS52aXNpYmlsaXR5ICA9IHZpc2liaWxpdHlCb3R0b207XG5cbiAgICBpZiAob3B0aW9ucy52ZXJ0aWNhbFNjcm9sbCkge1xuICAgICAgZG9tLnJpZ2h0Q29udGFpbmVyLmNsYXNzTmFtZSA9ICd2aXMtcGFuZWwgdmlzLXJpZ2h0IHZpcy12ZXJ0aWNhbC1zY3JvbGwnO1xuICAgICAgZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lID0gJ3Zpcy1wYW5lbCB2aXMtbGVmdCB2aXMtdmVydGljYWwtc2Nyb2xsJztcblxuICAgICAgZG9tLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHkgICAgID0gXCJoaWRkZW5cIjtcbiAgICAgIGRvbS5zaGFkb3dCb3R0b21SaWdodC5zdHlsZS52aXNpYmlsaXR5ICA9IFwiaGlkZGVuXCI7XG4gICAgICBkb20uc2hhZG93VG9wTGVmdC5zdHlsZS52aXNpYmlsaXR5ICAgICAgPSBcImhpZGRlblwiO1xuICAgICAgZG9tLnNoYWRvd0JvdHRvbUxlZnQuc3R5bGUudmlzaWJpbGl0eSAgID0gXCJoaWRkZW5cIjtcblxuICAgICAgZG9tLmxlZnQuc3R5bGUudG9wICAgID0gJzBweCc7XG4gICAgICBkb20ucmlnaHQuc3R5bGUudG9wICAgPSAnMHB4JztcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMudmVydGljYWxTY3JvbGwgfHwgIHByb3BzLmNlbnRlci5oZWlnaHQgPCBwcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0KSB7XG4gICAgICBkb20ubGVmdC5zdHlsZS50b3AgICAgPSBgJHtvZmZzZXR9cHhgO1xuICAgICAgZG9tLnJpZ2h0LnN0eWxlLnRvcCAgID0gYCR7b2Zmc2V0fXB4YDtcbiAgICAgIGRvbS5yaWdodENvbnRhaW5lci5jbGFzc05hbWUgPSBkb20ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKD86XnxcXFxccyknKyAndmlzLXZlcnRpY2FsLXNjcm9sbCcgKyAnKD86XFxcXHN8JCknKSwgJyAnKTtcbiAgICAgIGRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZSA9IGRvbS5sZWZ0Q29udGFpbmVyLmNsYXNzTmFtZS5yZXBsYWNlKG5ldyBSZWdFeHAoJyg/Ol58XFxcXHMpJysgJ3Zpcy12ZXJ0aWNhbC1zY3JvbGwnICsgJyg/OlxcXFxzfCQpJyksICcgJyk7XG4gICAgICBwcm9wcy5sZWZ0LndpZHRoID0gbGVmdENvbnRhaW5lckNsaWVudFdpZHRoICB8fCAtcHJvcHMuYm9yZGVyLmxlZnQ7XG4gICAgICBwcm9wcy5yaWdodC53aWR0aCA9IHJpZ2h0Q29udGFpbmVyQ2xpZW50V2lkdGggfHwgLXByb3BzLmJvcmRlci5yaWdodDtcbiAgICAgIHRoaXMuX3NldERPTSgpO1xuICAgIH1cblxuICAgIC8vIGVuYWJsZS9kaXNhYmxlIHZlcnRpY2FsIHBhbm5pbmdcbiAgICBjb25zdCBjb250ZW50c092ZXJmbG93ID0gcHJvcHMuY2VudGVyLmhlaWdodCA+IHByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQ7XG4gICAgdGhpcy5oYW1tZXIuZ2V0KCdwYW4nKS5zZXQoe1xuICAgICAgZGlyZWN0aW9uOiBjb250ZW50c092ZXJmbG93ID8gSGFtbWVyLkRJUkVDVElPTl9BTEwgOiBIYW1tZXIuRElSRUNUSU9OX0hPUklaT05UQUxcbiAgICB9KTtcblxuICAgIC8vIHNldCB0aGUgbG9uZyBwcmVzcyB0aW1lXG4gICAgdGhpcy5oYW1tZXIuZ2V0KCdwcmVzcycpLnNldCh7XG4gICAgICB0aW1lOiB0aGlzLm9wdGlvbnMubG9uZ1NlbGVjdFByZXNzVGltZVxuICAgIH0pO1xuXG4gICAgLy8gcmVkcmF3IGFsbCBjb21wb25lbnRzXG4gICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgIHJlc2l6ZWQgPSBjb21wb25lbnQucmVkcmF3KCkgfHwgcmVzaXplZDtcbiAgICB9KTtcbiAgICBjb25zdCBNQVhfUkVEUkFXID0gNTtcbiAgICBpZiAocmVzaXplZCkge1xuICAgICAgaWYgKHRoaXMucmVkcmF3Q291bnQgPCBNQVhfUkVEUkFXKSB7XG4gICAgICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoJ19jaGFuZ2UnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdXQVJOSU5HOiBpbmZpbml0ZSBsb29wIGluIHJlZHJhdz8nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWRyYXdDb3VudCA9IDA7XG4gICAgfVxuXG4gICAgLy9FbWl0IHB1YmxpYyAnY2hhbmdlZCcgZXZlbnQgZm9yIFVJIHVwZGF0ZXMsIHNlZSBpc3N1ZSAjMTU5MlxuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJjaGFuZ2VkXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgdGhlIGJhc2ljIERPTSBjb21wb25lbnRzIG5lZWRlZCBmb3IgdGhlIHRpbWVsaW5lXFxncmFwaDJkXG4gICAqL1xuICBfc2V0RE9NKCkge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCBkb20gPSB0aGlzLmRvbTtcblxuICAgIHByb3BzLmxlZnRDb250YWluZXIud2lkdGggPSBwcm9wcy5sZWZ0LndpZHRoO1xuICAgIHByb3BzLnJpZ2h0Q29udGFpbmVyLndpZHRoID0gcHJvcHMucmlnaHQud2lkdGg7XG4gICAgY29uc3QgY2VudGVyV2lkdGggPSBwcm9wcy5yb290LndpZHRoIC0gcHJvcHMubGVmdC53aWR0aCAtIHByb3BzLnJpZ2h0LndpZHRoO1xuICAgIHByb3BzLmNlbnRlci53aWR0aCAgICAgICAgICA9IGNlbnRlcldpZHRoO1xuICAgIHByb3BzLmNlbnRlckNvbnRhaW5lci53aWR0aCA9IGNlbnRlcldpZHRoO1xuICAgIHByb3BzLnRvcC53aWR0aCAgICAgICAgICAgICA9IGNlbnRlcldpZHRoO1xuICAgIHByb3BzLmJvdHRvbS53aWR0aCAgICAgICAgICA9IGNlbnRlcldpZHRoO1xuXG4gICAgLy8gcmVzaXplIHRoZSBwYW5lbHNcbiAgICBkb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQgICAgICAgICAgID0gYCR7cHJvcHMuYmFja2dyb3VuZC5oZWlnaHR9cHhgO1xuICAgIGRvbS5iYWNrZ3JvdW5kVmVydGljYWwuc3R5bGUuaGVpZ2h0ICAgPSBgJHtwcm9wcy5iYWNrZ3JvdW5kLmhlaWdodH1weGA7XG4gICAgZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLmhlaWdodCA9IGAke3Byb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHR9cHhgO1xuICAgIGRvbS5jZW50ZXJDb250YWluZXIuc3R5bGUuaGVpZ2h0ICAgICAgPSBgJHtwcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0fXB4YDtcbiAgICBkb20ubGVmdENvbnRhaW5lci5zdHlsZS5oZWlnaHQgICAgICAgID0gYCR7cHJvcHMubGVmdENvbnRhaW5lci5oZWlnaHR9cHhgO1xuICAgIGRvbS5yaWdodENvbnRhaW5lci5zdHlsZS5oZWlnaHQgICAgICAgPSBgJHtwcm9wcy5yaWdodENvbnRhaW5lci5oZWlnaHR9cHhgO1xuXG4gICAgZG9tLmJhY2tncm91bmQuc3R5bGUud2lkdGggICAgICAgICAgICA9IGAke3Byb3BzLmJhY2tncm91bmQud2lkdGh9cHhgO1xuICAgIGRvbS5iYWNrZ3JvdW5kVmVydGljYWwuc3R5bGUud2lkdGggICAgPSBgJHtwcm9wcy5jZW50ZXJDb250YWluZXIud2lkdGh9cHhgO1xuICAgIGRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS53aWR0aCAgPSBgJHtwcm9wcy5iYWNrZ3JvdW5kLndpZHRofXB4YDtcbiAgICBkb20uY2VudGVyQ29udGFpbmVyLnN0eWxlLndpZHRoICAgICAgID0gYCR7cHJvcHMuY2VudGVyLndpZHRofXB4YDtcbiAgICBkb20udG9wLnN0eWxlLndpZHRoICAgICAgICAgICAgICAgICAgID0gYCR7cHJvcHMudG9wLndpZHRofXB4YDtcbiAgICBkb20uYm90dG9tLnN0eWxlLndpZHRoICAgICAgICAgICAgICAgID0gYCR7cHJvcHMuYm90dG9tLndpZHRofXB4YDtcblxuICAgIC8vIHJlcG9zaXRpb24gdGhlIHBhbmVsc1xuICAgIGRvbS5iYWNrZ3JvdW5kLnN0eWxlLmxlZnQgICAgICAgICAgID0gJzAnO1xuICAgIGRvbS5iYWNrZ3JvdW5kLnN0eWxlLnRvcCAgICAgICAgICAgID0gJzAnO1xuICAgIGRvbS5iYWNrZ3JvdW5kVmVydGljYWwuc3R5bGUubGVmdCAgID0gYCR7cHJvcHMubGVmdC53aWR0aCArIHByb3BzLmJvcmRlci5sZWZ0fXB4YDtcbiAgICBkb20uYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLnRvcCAgICA9ICcwJztcbiAgICBkb20uYmFja2dyb3VuZEhvcml6b250YWwuc3R5bGUubGVmdCA9ICcwJztcbiAgICBkb20uYmFja2dyb3VuZEhvcml6b250YWwuc3R5bGUudG9wICA9IGAke3Byb3BzLnRvcC5oZWlnaHR9cHhgO1xuICAgIGRvbS5jZW50ZXJDb250YWluZXIuc3R5bGUubGVmdCAgICAgID0gYCR7cHJvcHMubGVmdC53aWR0aH1weGA7XG4gICAgZG9tLmNlbnRlckNvbnRhaW5lci5zdHlsZS50b3AgICAgICAgPSBgJHtwcm9wcy50b3AuaGVpZ2h0fXB4YDtcbiAgICBkb20ubGVmdENvbnRhaW5lci5zdHlsZS5sZWZ0ICAgICAgICA9ICcwJztcbiAgICBkb20ubGVmdENvbnRhaW5lci5zdHlsZS50b3AgICAgICAgICA9IGAke3Byb3BzLnRvcC5oZWlnaHR9cHhgO1xuICAgIGRvbS5yaWdodENvbnRhaW5lci5zdHlsZS5sZWZ0ICAgICAgID0gYCR7cHJvcHMubGVmdC53aWR0aCArIHByb3BzLmNlbnRlci53aWR0aH1weGA7XG4gICAgZG9tLnJpZ2h0Q29udGFpbmVyLnN0eWxlLnRvcCAgICAgICAgPSBgJHtwcm9wcy50b3AuaGVpZ2h0fXB4YDtcbiAgICBkb20udG9wLnN0eWxlLmxlZnQgICAgICAgICAgICAgICAgICA9IGAke3Byb3BzLmxlZnQud2lkdGh9cHhgO1xuICAgIGRvbS50b3Auc3R5bGUudG9wICAgICAgICAgICAgICAgICAgID0gJzAnO1xuICAgIGRvbS5ib3R0b20uc3R5bGUubGVmdCAgICAgICAgICAgICAgID0gYCR7cHJvcHMubGVmdC53aWR0aH1weGA7XG4gICAgZG9tLmJvdHRvbS5zdHlsZS50b3AgICAgICAgICAgICAgICAgPSBgJHtwcm9wcy50b3AuaGVpZ2h0ICsgcHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodH1weGA7XG4gICAgZG9tLmNlbnRlci5zdHlsZS5sZWZ0ICAgICAgICAgICAgICAgPSAnMCc7XG4gICAgZG9tLmxlZnQuc3R5bGUubGVmdCAgICAgICAgICAgICAgICAgPSAnMCc7XG4gICAgZG9tLnJpZ2h0LnN0eWxlLmxlZnQgICAgICAgICAgICAgICAgPSAnMCc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY3VycmVudCB0aW1lLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIHRvIGVuc3VyZSB0aGF0IGEgY2xpZW50J3NcbiAgICogdGltZSBpcyBzeW5jaHJvbml6ZWQgd2l0aCBhIHNoYXJlZCBzZXJ2ZXIgdGltZS5cbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gb3B0aW9uIGBzaG93Q3VycmVudFRpbWVgIGlzIHRydWUuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bWJlcn0gdGltZSAgICAgQSBEYXRlLCB1bml4IHRpbWVzdGFtcCwgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU08gZGF0ZSBzdHJpbmcuXG4gICAqL1xuICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgaWYgKCF0aGlzLmN1cnJlbnRUaW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbiBzaG93Q3VycmVudFRpbWUgbXVzdCBiZSB0cnVlJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VGltZS5zZXRDdXJyZW50VGltZSh0aW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgdGltZS5cbiAgICogT25seSBhcHBsaWNhYmxlIHdoZW4gb3B0aW9uIGBzaG93Q3VycmVudFRpbWVgIGlzIHRydWUuXG4gICAqIEByZXR1cm4ge0RhdGV9IFJldHVybnMgdGhlIGN1cnJlbnQgdGltZS5cbiAgICovXG4gIGdldEN1cnJlbnRUaW1lKCkge1xuICAgIGlmICghdGhpcy5jdXJyZW50VGltZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdPcHRpb24gc2hvd0N1cnJlbnRUaW1lIG11c3QgYmUgdHJ1ZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRUaW1lLmdldEN1cnJlbnRUaW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIHBvc2l0aW9uIG9uIHNjcmVlbiAocGl4ZWxzKSB0byBhIGRhdGV0aW1lXG4gICAqIEBwYXJhbSB7aW50fSAgICAgeCAgICBQb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGluIHBpeGVsc1xuICAgKiBAcmV0dXJuIHtEYXRlfSAgIHRpbWUgVGhlIGRhdGV0aW1lIHRoZSBjb3JyZXNwb25kcyB3aXRoIGdpdmVuIHBvc2l0aW9uIHhcbiAgICogQHByb3RlY3RlZFxuICAgKiBUT0RPOiBtb3ZlIHRoaXMgZnVuY3Rpb24gdG8gUmFuZ2VcbiAgICovXG4gIF90b1RpbWUoeCkge1xuICAgIHJldHVybiB0b1RpbWUodGhpcywgeCwgdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBwb3NpdGlvbiBvbiB0aGUgZ2xvYmFsIHNjcmVlbiAocGl4ZWxzKSB0byBhIGRhdGV0aW1lXG4gICAqIEBwYXJhbSB7aW50fSAgICAgeCAgICBQb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGluIHBpeGVsc1xuICAgKiBAcmV0dXJuIHtEYXRlfSAgIHRpbWUgVGhlIGRhdGV0aW1lIHRoZSBjb3JyZXNwb25kcyB3aXRoIGdpdmVuIHBvc2l0aW9uIHhcbiAgICogQHByb3RlY3RlZFxuICAgKiBUT0RPOiBtb3ZlIHRoaXMgZnVuY3Rpb24gdG8gUmFuZ2VcbiAgICovXG4gIF90b0dsb2JhbFRpbWUoeCkge1xuICAgIHJldHVybiB0b1RpbWUodGhpcywgeCwgdGhpcy5wcm9wcy5yb290LndpZHRoKTtcbiAgICAvL3ZhciBjb252ZXJzaW9uID0gdGhpcy5yYW5nZS5jb252ZXJzaW9uKHRoaXMucHJvcHMucm9vdC53aWR0aCk7XG4gICAgLy9yZXR1cm4gbmV3IERhdGUoeCAvIGNvbnZlcnNpb24uc2NhbGUgKyBjb252ZXJzaW9uLm9mZnNldCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGRhdGV0aW1lIChEYXRlIG9iamVjdCkgaW50byBhIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW5cbiAgICogQHBhcmFtIHtEYXRlfSAgIHRpbWUgQSBkYXRlXG4gICAqIEByZXR1cm4ge2ludH0gICB4ICAgIFRoZSBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIGluIHBpeGVscyB3aGljaCBjb3JyZXNwb25kc1xuICAgKiAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBnaXZlbiBkYXRlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIFRPRE86IG1vdmUgdGhpcyBmdW5jdGlvbiB0byBSYW5nZVxuICAgKi9cbiAgX3RvU2NyZWVuKHRpbWUpIHtcbiAgICByZXR1cm4gdG9TY3JlZW4odGhpcywgdGltZSwgdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBkYXRldGltZSAoRGF0ZSBvYmplY3QpIGludG8gYSBwb3NpdGlvbiBvbiB0aGUgcm9vdFxuICAgKiBUaGlzIGlzIHVzZWQgdG8gZ2V0IHRoZSBwaXhlbCBkZW5zaXR5IGVzdGltYXRlIGZvciB0aGUgc2NyZWVuLCBub3QgdGhlIGNlbnRlciBwYW5lbFxuICAgKiBAcGFyYW0ge0RhdGV9ICAgdGltZSBBIGRhdGVcbiAgICogQHJldHVybiB7aW50fSAgIHggICAgVGhlIHBvc2l0aW9uIG9uIHJvb3QgaW4gcGl4ZWxzIHdoaWNoIGNvcnJlc3BvbmRzXG4gICAqICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGdpdmVuIGRhdGUuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogVE9ETzogbW92ZSB0aGlzIGZ1bmN0aW9uIHRvIFJhbmdlXG4gICAqL1xuICBfdG9HbG9iYWxTY3JlZW4odGltZSkge1xuICAgIHJldHVybiB0b1NjcmVlbih0aGlzLCB0aW1lLCB0aGlzLnByb3BzLnJvb3Qud2lkdGgpO1xuICAgIC8vdmFyIGNvbnZlcnNpb24gPSB0aGlzLnJhbmdlLmNvbnZlcnNpb24odGhpcy5wcm9wcy5yb290LndpZHRoKTtcbiAgICAvL3JldHVybiAodGltZS52YWx1ZU9mKCkgLSBjb252ZXJzaW9uLm9mZnNldCkgKiBjb252ZXJzaW9uLnNjYWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgd2F0Y2hpbmcgd2hlbiBvcHRpb24gYXV0b1Jlc2l6ZSBpcyB0cnVlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdEF1dG9SZXNpemUoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hdXRvUmVzaXplID09IHRydWUpIHtcbiAgICAgIHRoaXMuX3N0YXJ0QXV0b1Jlc2l6ZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3N0b3BBdXRvUmVzaXplKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGZvciBjaGFuZ2VzIGluIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIuIE9uIHJlc2l6ZSwgdGhlIFBhbmVsIHdpbGxcbiAgICogYXV0b21hdGljYWxseSByZWRyYXcgaXRzZWxmLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N0YXJ0QXV0b1Jlc2l6ZSgpIHtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG5cbiAgICB0aGlzLl9zdG9wQXV0b1Jlc2l6ZSgpO1xuXG4gICAgdGhpcy5fb25SZXNpemUgPSAoKSA9PiB7XG4gICAgICBpZiAobWUub3B0aW9ucy5hdXRvUmVzaXplICE9IHRydWUpIHtcbiAgICAgICAgLy8gc3RvcCB3YXRjaGluZyB3aGVuIHRoZSBvcHRpb24gYXV0b1Jlc2l6ZSBpcyBjaGFuZ2VkIHRvIGZhbHNlXG4gICAgICAgIG1lLl9zdG9wQXV0b1Jlc2l6ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZS5kb20ucm9vdCkge1xuICAgICAgICBjb25zdCByb290T2Zmc2V0SGVpZ2h0ID0gbWUuZG9tLnJvb3Qub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBjb25zdCByb290T2Zmc2V0V2lkdGggPSBtZS5kb20ucm9vdC5vZmZzZXRXaWR0aDtcbiAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZnJhbWUgaXMgcmVzaXplZFxuICAgICAgICAvLyBOb3RlOiB3ZSBjb21wYXJlIG9mZnNldFdpZHRoIGhlcmUsIG5vdCBjbGllbnRXaWR0aC4gRm9yIHNvbWUgcmVhc29uLFxuICAgICAgICAvLyBJRSBkb2VzIG5vdCByZXN0b3JlIHRoZSBjbGllbnRXaWR0aCBmcm9tIDAgdG8gdGhlIGFjdHVhbCB3aWR0aCBhZnRlclxuICAgICAgICAvLyBjaGFuZ2luZyB0aGUgdGltZWxpbmUncyBjb250YWluZXIgZGlzcGxheSBzdHlsZSBmcm9tIG5vbmUgdG8gdmlzaWJsZVxuICAgICAgICBpZiAoKHJvb3RPZmZzZXRXaWR0aCAhPSBtZS5wcm9wcy5sYXN0V2lkdGgpIHx8XG4gICAgICAgICAgKHJvb3RPZmZzZXRIZWlnaHQgIT0gbWUucHJvcHMubGFzdEhlaWdodCkpIHtcbiAgICAgICAgICBtZS5wcm9wcy5sYXN0V2lkdGggPSByb290T2Zmc2V0V2lkdGg7XG4gICAgICAgICAgbWUucHJvcHMubGFzdEhlaWdodCA9IHJvb3RPZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgbWUucHJvcHMuc2Nyb2xsYmFyV2lkdGggPSB1dGlsLmdldFNjcm9sbEJhcldpZHRoKCk7XG5cbiAgICAgICAgICBtZS5ib2R5LmVtaXR0ZXIuZW1pdCgnX2NoYW5nZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGFkZCBldmVudCBsaXN0ZW5lciB0byB3aW5kb3cgcmVzaXplXG4gICAgdXRpbC5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplKTtcblxuICAgIC8vUHJldmVudCBpbml0aWFsIHVubmVjZXNzYXJ5IHJlZHJhd1xuICAgIGlmIChtZS5kb20ucm9vdCkge1xuICAgICAgICBtZS5wcm9wcy5sYXN0V2lkdGggPSBtZS5kb20ucm9vdC5vZmZzZXRXaWR0aDtcbiAgICAgICAgbWUucHJvcHMubGFzdEhlaWdodCA9IG1lLmRvbS5yb290Lm9mZnNldEhlaWdodDtcbiAgICB9XG5cbiAgICB0aGlzLndhdGNoVGltZXIgPSBzZXRJbnRlcnZhbCh0aGlzLl9vblJlc2l6ZSwgMTAwMCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCB3YXRjaGluZyBmb3IgYSByZXNpemUgb2YgdGhlIGZyYW1lLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N0b3BBdXRvUmVzaXplKCkge1xuICAgIGlmICh0aGlzLndhdGNoVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy53YXRjaFRpbWVyKTtcbiAgICAgIHRoaXMud2F0Y2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgZXZlbnQgbGlzdGVuZXIgb24gd2luZG93LnJlc2l6ZVxuICAgIGlmICh0aGlzLl9vblJlc2l6ZSkge1xuICAgICAgdXRpbC5yZW1vdmVFdmVudExpc3RlbmVyKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuX29uUmVzaXplKTtcbiAgICAgIHRoaXMuX29uUmVzaXplID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgbW92aW5nIHRoZSB0aW1lbGluZSB2ZXJ0aWNhbGx5XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Ub3VjaChldmVudCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHRoaXMudG91Y2guYWxsb3dEcmFnZ2luZyA9IHRydWU7XG4gICAgdGhpcy50b3VjaC5pbml0aWFsU2Nyb2xsVG9wID0gdGhpcy5wcm9wcy5zY3JvbGxUb3A7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgbW92aW5nIHRoZSB0aW1lbGluZSB2ZXJ0aWNhbGx5XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25QaW5jaChldmVudCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHRoaXMudG91Y2guYWxsb3dEcmFnZ2luZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIHRpbWVsaW5lIHZlcnRpY2FsbHlcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWcoZXZlbnQpIHtcbiAgICBpZiAoIWV2ZW50KSByZXR1cm5cbiAgICAvLyByZWZ1c2UgdG8gZHJhZyB3aGVuIHdlIHdoZXJlIHBpbmNoaW5nIHRvIHByZXZlbnQgdGhlIHRpbWVsaW5lIG1ha2UgYSBqdW1wXG4gICAgLy8gd2hlbiByZWxlYXNpbmcgdGhlIGZpbmdlcnMgaW4gb3Bwb3NpdGUgb3JkZXIgZnJvbSB0aGUgdG91Y2ggc2NyZWVuXG4gICAgaWYgKCF0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmcpIHJldHVybjtcblxuICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGVsdGFZO1xuXG4gICAgY29uc3Qgb2xkU2Nyb2xsVG9wID0gdGhpcy5fZ2V0U2Nyb2xsVG9wKCk7XG4gICAgY29uc3QgbmV3U2Nyb2xsVG9wID0gdGhpcy5fc2V0U2Nyb2xsVG9wKHRoaXMudG91Y2guaW5pdGlhbFNjcm9sbFRvcCArIGRlbHRhKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuZG9tLmxlZnQucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSAtdGhpcy5wcm9wcy5zY3JvbGxUb3A7XG4gICAgICB0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IC10aGlzLnByb3BzLnNjcm9sbFRvcDtcbiAgICB9XG5cbiAgICBpZiAobmV3U2Nyb2xsVG9wICE9IG9sZFNjcm9sbFRvcCkge1xuICAgICAgdGhpcy5lbWl0KFwidmVydGljYWxEcmFnXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhIHNjcm9sbFRvcFxuICAgKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsVG9wXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNjcm9sbFRvcCAgUmV0dXJucyB0aGUgYXBwbGllZCBzY3JvbGxUb3BcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRTY3JvbGxUb3Aoc2Nyb2xsVG9wKSB7XG4gICAgdGhpcy5wcm9wcy5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgdGhpcy5fdXBkYXRlU2Nyb2xsVG9wKCk7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsVG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY3VycmVudCBzY3JvbGxUb3Agd2hlbiB0aGUgaGVpZ2h0IG9mICB0aGUgY29udGFpbmVycyBoYXMgYmVlbiBjaGFuZ2VkXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNjcm9sbFRvcCAgUmV0dXJucyB0aGUgYXBwbGllZCBzY3JvbGxUb3BcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVTY3JvbGxUb3AoKSB7XG4gICAgLy8gcmVjYWxjdWxhdGUgdGhlIHNjcm9sbFRvcE1pblxuICAgIGNvbnN0IHNjcm9sbFRvcE1pbiA9IE1hdGgubWluKHRoaXMucHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCAtIHRoaXMucHJvcHMuYm9yZGVyLnRvcCAtIHRoaXMucHJvcHMuYm9yZGVyLmJvdHRvbSAtIHRoaXMucHJvcHMuY2VudGVyLmhlaWdodCwgMCk7IC8vIGlzIG5lZ2F0aXZlIG9yIHplcm8gICAgXG4gICAgaWYgKHNjcm9sbFRvcE1pbiAhPSB0aGlzLnByb3BzLnNjcm9sbFRvcE1pbikge1xuICAgICAgLy8gaW4gY2FzZSBvZiBib3R0b20gb3JpZW50YXRpb24sIGNoYW5nZSB0aGUgc2Nyb2xsVG9wIHN1Y2ggdGhhdCB0aGUgY29udGVudHNcbiAgICAgIC8vIGRvIG5vdCBtb3ZlIHJlbGF0aXZlIHRvIHRoZSB0aW1lIGF4aXMgYXQgdGhlIGJvdHRvbVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtICE9ICd0b3AnKSB7XG4gICAgICAgIHRoaXMucHJvcHMuc2Nyb2xsVG9wICs9IChzY3JvbGxUb3BNaW4gLSB0aGlzLnByb3BzLnNjcm9sbFRvcE1pbik7XG4gICAgICB9XG4gICAgICB0aGlzLnByb3BzLnNjcm9sbFRvcE1pbiA9IHNjcm9sbFRvcE1pbjtcbiAgICB9XG5cbiAgICAvLyBsaW1pdCB0aGUgc2Nyb2xsVG9wIHRvIHRoZSBmZWFzaWJsZSBzY3JvbGwgcmFuZ2VcbiAgICBpZiAodGhpcy5wcm9wcy5zY3JvbGxUb3AgPiAwKSB0aGlzLnByb3BzLnNjcm9sbFRvcCA9IDA7XG4gICAgaWYgKHRoaXMucHJvcHMuc2Nyb2xsVG9wIDwgc2Nyb2xsVG9wTWluKSB0aGlzLnByb3BzLnNjcm9sbFRvcCA9IHNjcm9sbFRvcE1pbjtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwpIHtcbiAgICAgIHRoaXMuZG9tLmxlZnQucGFyZW50Tm9kZS5zY3JvbGxUb3AgPSAtdGhpcy5wcm9wcy5zY3JvbGxUb3A7XG4gICAgICB0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcCA9IC10aGlzLnByb3BzLnNjcm9sbFRvcDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsVG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzY3JvbGxUb3BcbiAgICogQHJldHVybnMge251bWJlcn0gc2Nyb2xsVG9wXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0U2Nyb2xsVG9wKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnNjcm9sbFRvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgY29uZmlndXJhdG9yXG4gICAqIFthdF1yZXR1cm5zIHtPYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlQ29uZmlndXJhdG9yKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGludm9rZSBhYnN0cmFjdCBtZXRob2QgX2NyZWF0ZUNvbmZpZ3VyYXRvcicpO1xuICB9XG59XG5cbi8vIHR1cm4gQ29yZSBpbnRvIGFuIGV2ZW50IGVtaXR0ZXJcbkVtaXR0ZXIoQ29yZS5wcm90b3R5cGUpO1xuXG4vKipcbiAqIEEgY3VycmVudCB0aW1lIGJhclxuICovXG5jbGFzcyBDdXJyZW50VGltZSBleHRlbmRzIENvbXBvbmVudCB7XG4vKipcbiAqIEBwYXJhbSB7e3JhbmdlOiBSYW5nZSwgZG9tOiBPYmplY3QsIGRvbVByb3BzOiBPYmplY3R9fSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdICAgICAgICBBdmFpbGFibGUgcGFyYW1ldGVyczpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtCb29sZWFufSBbc2hvd0N1cnJlbnRUaW1lXVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1N0cmluZ30gIFthbGlnbkN1cnJlbnRUaW1lXVxuICogQGNvbnN0cnVjdG9yIEN1cnJlbnRUaW1lXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuICBjb25zdHJ1Y3Rvcihib2R5LCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuXG4gICAgLy8gZGVmYXVsdCBvcHRpb25zXG4gICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgIHJ0bDogZmFsc2UsXG4gICAgICBzaG93Q3VycmVudFRpbWU6IHRydWUsXG4gICAgICBhbGlnbkN1cnJlbnRUaW1lOiB1bmRlZmluZWQsXG5cbiAgICAgIG1vbWVudCxcbiAgICAgIGxvY2FsZXMsXG4gICAgICBsb2NhbGU6ICdlbidcbiAgICB9O1xuICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRPcHRpb25zKTtcbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgdGhpcy5vcHRpb25zLmxvY2FsZXMgPSB1dGlsLmV4dGVuZCh7fSwgbG9jYWxlcywgdGhpcy5vcHRpb25zLmxvY2FsZXMpO1xuICAgIGNvbnN0IGRlZmF1bHRMb2NhbGVzID0gdGhpcy5kZWZhdWx0T3B0aW9ucy5sb2NhbGVzW3RoaXMuZGVmYXVsdE9wdGlvbnMubG9jYWxlXTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubG9jYWxlcykuZm9yRWFjaChsb2NhbGUgPT4ge1xuICAgICAgdGhpcy5vcHRpb25zLmxvY2FsZXNbbG9jYWxlXSA9IHV0aWwuZXh0ZW5kKFxuICAgICAgICB7fSxcbiAgICAgICAgZGVmYXVsdExvY2FsZXMsXG4gICAgICAgIHRoaXMub3B0aW9ucy5sb2NhbGVzW2xvY2FsZV1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5vZmZzZXQgPSAwO1xuXG4gICAgdGhpcy5fY3JlYXRlKCk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEhUTUwgRE9NIGZvciB0aGUgY3VycmVudCB0aW1lIGJhclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZSgpIHtcbiAgICBjb25zdCBiYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYXIuY2xhc3NOYW1lID0gJ3Zpcy1jdXJyZW50LXRpbWUnO1xuICAgIGJhci5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgYmFyLnN0eWxlLnRvcCA9ICcwcHgnO1xuICAgIGJhci5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG5cbiAgICB0aGlzLmJhciA9IGJhcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IHRoZSBDdXJyZW50VGltZSBiYXJcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5vcHRpb25zLnNob3dDdXJyZW50VGltZSA9IGZhbHNlO1xuICAgIHRoaXMucmVkcmF3KCk7IC8vIHdpbGwgcmVtb3ZlIHRoZSBiYXIgZnJvbSB0aGUgRE9NIGFuZCBzdG9wIHJlZnJlc2hpbmdcblxuICAgIHRoaXMuYm9keSA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9wdGlvbnMgZm9yIHRoZSBjb21wb25lbnQuIE9wdGlvbnMgd2lsbCBiZSBtZXJnZWQgaW4gY3VycmVudCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAgQXZhaWxhYmxlIHBhcmFtZXRlcnM6XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gW3Nob3dDdXJyZW50VGltZV1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHtTdHJpbmd9ICBbYWxpZ25DdXJyZW50VGltZV1cbiAgICovXG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAvLyBjb3B5IGFsbCBvcHRpb25zIHRoYXQgd2Uga25vd1xuICAgICAgdXRpbC5zZWxlY3RpdmVFeHRlbmQoWydydGwnLCAnc2hvd0N1cnJlbnRUaW1lJywgJ2FsaWduQ3VycmVudFRpbWUnLCAnbW9tZW50JywgJ2xvY2FsZScsICdsb2NhbGVzJ10sIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyByZXNpemVkXG4gICAqL1xuICByZWRyYXcoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93Q3VycmVudFRpbWUpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsO1xuICAgICAgaWYgKHRoaXMuYmFyLnBhcmVudE5vZGUgIT0gcGFyZW50KSB7XG4gICAgICAgIC8vIGF0dGFjaCB0byB0aGUgZG9tXG4gICAgICAgIGlmICh0aGlzLmJhci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgdGhpcy5iYXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmJhcik7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblxuICAgICAgICB0aGlzLnN0YXJ0KCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBub3cgPSB0aGlzLm9wdGlvbnMubW9tZW50KERhdGUubm93KCkgKyB0aGlzLm9mZnNldCk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWxpZ25DdXJyZW50VGltZSkge1xuICAgICAgICBub3cgPSBub3cuc3RhcnRPZih0aGlzLm9wdGlvbnMuYWxpZ25DdXJyZW50VGltZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHggPSB0aGlzLmJvZHkudXRpbC50b1NjcmVlbihub3cpO1xuXG4gICAgICBsZXQgbG9jYWxlID0gdGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07XG4gICAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgICBpZiAoIXRoaXMud2FybmVkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyR7dGhpcy5vcHRpb25zLmxvY2FsZX0nXSBub3QgZm91bmQuIFNlZSBodHRwczovL3Zpc2pzLmdpdGh1Yi5pby92aXMtdGltZWxpbmUvZG9jcy90aW1lbGluZS8jTG9jYWxpemF0aW9uYCk7XG4gICAgICAgICAgdGhpcy53YXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGVzWydlbiddOyAvLyBmYWxsIGJhY2sgb24gZW5nbGlzaCB3aGVuIG5vdCBhdmFpbGFibGVcbiAgICAgIH1cbiAgICAgIGxldCB0aXRsZSA9IGAke2xvY2FsZS5jdXJyZW50fSAke2xvY2FsZS50aW1lfTogJHtub3cuZm9ybWF0KCdkZGRkLCBNTU1NIERvIFlZWVksIEg6bW06c3MnKX1gO1xuICAgICAgdGl0bGUgPSB0aXRsZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRpdGxlLnN1YnN0cmluZygxKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgdGhpcy5iYXIuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHt4ICogLTF9cHgpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYmFyLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7eH1weClgO1xuICAgICAgfVxuICAgICAgdGhpcy5iYXIudGl0bGUgPSB0aXRsZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyByZW1vdmUgdGhlIGxpbmUgZnJvbSB0aGUgRE9NXG4gICAgICBpZiAodGhpcy5iYXIucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhdXRvIHJlZnJlc2hpbmcgdGhlIGN1cnJlbnQgdGltZSBiYXJcbiAgICovXG4gIHN0YXJ0KCkge1xuICAgIGNvbnN0IG1lID0gdGhpcztcblxuICAgICAgLyoqXG4gICAgICAgKiAgVXBkYXRlcyB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgICovXG4gICAgICBmdW5jdGlvbiB1cGRhdGUgKCkge1xuICAgICAgbWUuc3RvcCgpO1xuXG4gICAgICAvLyBkZXRlcm1pbmUgaW50ZXJ2YWwgdG8gcmVmcmVzaFxuICAgICAgY29uc3Qgc2NhbGUgPSBtZS5ib2R5LnJhbmdlLmNvbnZlcnNpb24obWUuYm9keS5kb21Qcm9wcy5jZW50ZXIud2lkdGgpLnNjYWxlO1xuICAgICAgbGV0IGludGVydmFsID0gMSAvIHNjYWxlIC8gMTA7XG4gICAgICBpZiAoaW50ZXJ2YWwgPCAzMCkgICBpbnRlcnZhbCA9IDMwO1xuICAgICAgaWYgKGludGVydmFsID4gMTAwMCkgaW50ZXJ2YWwgPSAxMDAwO1xuXG4gICAgICBtZS5yZWRyYXcoKTtcbiAgICAgIG1lLmJvZHkuZW1pdHRlci5lbWl0KCdjdXJyZW50VGltZVRpY2snKTtcblxuICAgICAgLy8gc3RhcnQgYSByZW5kZXJUaW1lciB0byBhZGp1c3QgZm9yIHRoZSBuZXcgdGltZVxuICAgICAgbWUuY3VycmVudFRpbWVUaW1lciA9IHNldFRpbWVvdXQodXBkYXRlLCBpbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcCBhdXRvIHJlZnJlc2hpbmcgdGhlIGN1cnJlbnQgdGltZSBiYXJcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFRpbWVUaW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZVRpbWVyKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmN1cnJlbnRUaW1lVGltZXI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGN1cnJlbnQgdGltZS4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSB0byBlbnN1cmUgdGhhdCBhIGNsaWVudCdzXG4gICAqIHRpbWUgaXMgc3luY2hyb25pemVkIHdpdGggYSBzaGFyZWQgc2VydmVyIHRpbWUuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bWJlcn0gdGltZSAgICAgQSBEYXRlLCB1bml4IHRpbWVzdGFtcCwgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU08gZGF0ZSBzdHJpbmcuXG4gICAqL1xuICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgY29uc3QgdCA9IHV0aWwuY29udmVydCh0aW1lLCAnRGF0ZScpLnZhbHVlT2YoKTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMub2Zmc2V0ID0gdCAtIG5vdztcbiAgICB0aGlzLnJlZHJhdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCB0aW1lLlxuICAgKiBAcmV0dXJuIHtEYXRlfSBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUuXG4gICAqL1xuICBnZXRDdXJyZW50VGltZSgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSArIHRoaXMub2Zmc2V0KTtcbiAgfVxufVxuXG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igb3JkZXJpbmcgYW5kIHN0YWNraW5nIG9mIGl0ZW1zXG5jb25zdCBFUFNJTE9OID0gMC4wMDE7IC8vIHVzZWQgd2hlbiBjaGVja2luZyBjb2xsaXNpb25zLCB0byBwcmV2ZW50IHJvdW5kLW9mZiBlcnJvcnNcblxuLyoqXG4gKiBPcmRlciBpdGVtcyBieSB0aGVpciBzdGFydCBkYXRhXG4gKiBAcGFyYW0ge0l0ZW1bXX0gaXRlbXNcbiAqL1xuZnVuY3Rpb24gb3JkZXJCeVN0YXJ0KGl0ZW1zKSB7XG4gIGl0ZW1zLnNvcnQoKGEsIGIpID0+IGEuZGF0YS5zdGFydCAtIGIuZGF0YS5zdGFydCk7XG59XG5cbi8qKlxuICogT3JkZXIgaXRlbXMgYnkgdGhlaXIgZW5kIGRhdGUuIElmIHRoZXkgaGF2ZSBubyBlbmQgZGF0ZSwgdGhlaXIgc3RhcnQgZGF0ZVxuICogaXMgdXNlZC5cbiAqIEBwYXJhbSB7SXRlbVtdfSBpdGVtc1xuICovXG5mdW5jdGlvbiBvcmRlckJ5RW5kKGl0ZW1zKSB7XG4gIGl0ZW1zLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVGltZSA9ICgnZW5kJyBpbiBhLmRhdGEpID8gYS5kYXRhLmVuZCA6IGEuZGF0YS5zdGFydDtcbiAgICBjb25zdCBiVGltZSA9ICgnZW5kJyBpbiBiLmRhdGEpID8gYi5kYXRhLmVuZCA6IGIuZGF0YS5zdGFydDtcblxuICAgIHJldHVybiBhVGltZSAtIGJUaW1lO1xuICB9KTtcbn1cblxuLyoqXG4gKiBBZGp1c3QgdmVydGljYWwgcG9zaXRpb25zIG9mIHRoZSBpdGVtcyBzdWNoIHRoYXQgdGhleSBkb24ndCBvdmVybGFwIGVhY2hcbiAqIG90aGVyLlxuICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gKiAgICAgICAgICAgIEFsbCB2aXNpYmxlIGl0ZW1zXG4gKiBAcGFyYW0ge3tpdGVtOiB7aG9yaXpvbnRhbDogbnVtYmVyLCB2ZXJ0aWNhbDogbnVtYmVyfSwgYXhpczogbnVtYmVyfX0gbWFyZ2luXG4gKiAgICAgICAgICAgIE1hcmdpbnMgYmV0d2VlbiBpdGVtcyBhbmQgYmV0d2VlbiBpdGVtcyBhbmQgdGhlIGF4aXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmb3JjZT1mYWxzZV1cbiAqICAgICAgICAgICAgSWYgdHJ1ZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmVwb3NpdGlvbmVkLiBJZiBmYWxzZSAoZGVmYXVsdCksIG9ubHlcbiAqICAgICAgICAgICAgaXRlbXMgaGF2aW5nIGEgdG9wPT09bnVsbCB3aWxsIGJlIHJlLXN0YWNrZWRcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHNob3VsZEJhaWxJdGVtc1JlZHJhd0Z1bmN0aW9uXG4gKiAgICAgICAgICAgIGJhaWxpbmcgZnVuY3Rpb25cbiAqIEByZXR1cm4ge2Jvb2xlYW59IHNob3VsZEJhaWxcbiAqL1xuZnVuY3Rpb24gc3RhY2soaXRlbXMsIG1hcmdpbiwgZm9yY2UsIHNob3VsZEJhaWxJdGVtc1JlZHJhd0Z1bmN0aW9uKSB7XG4gIGlmIChmb3JjZSkge1xuICAgIC8vIHJlc2V0IHRvcCBwb3NpdGlvbiBvZiBhbGwgaXRlbXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpdGVtc1tpXS50b3AgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSBuZXcsIG5vbi1vdmVybGFwcGluZyBwb3NpdGlvbnNcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZWRlY2xhcmVcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG4gICAgaWYgKGl0ZW0uc3RhY2sgJiYgaXRlbS50b3AgPT09IG51bGwpIHtcbiAgICAgIC8vIGluaXRpYWxpemUgdG9wIHBvc2l0aW9uXG4gICAgICBpdGVtLnRvcCA9IG1hcmdpbi5heGlzO1xuICAgICAgdmFyIHNob3VsZEJhaWwgPSBmYWxzZTtcblxuICAgICAgZG8ge1xuICAgICAgICAvLyBUT0RPOiBvcHRpbWl6ZSBjaGVja2luZyBmb3Igb3ZlcmxhcC4gd2hlbiB0aGVyZSBpcyBhIGdhcCB3aXRob3V0IGl0ZW1zLFxuICAgICAgICAvLyAgICAgICB5b3Ugb25seSBuZWVkIHRvIGNoZWNrIGZvciBpdGVtcyBmcm9tIHRoZSBuZXh0IGl0ZW0gb24sIG5vdCBmcm9tIHplcm9cbiAgICAgICAgdmFyIGNvbGxpZGluZ0l0ZW0gPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBqID0gMCwgamogPSBpdGVtcy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICAgICAgY29uc3Qgb3RoZXIgPSBpdGVtc1tqXTtcbiAgICAgICAgICBzaG91bGRCYWlsID0gc2hvdWxkQmFpbEl0ZW1zUmVkcmF3RnVuY3Rpb24oKSB8fCBmYWxzZTtcblxuICAgICAgICAgIGlmIChzaG91bGRCYWlsKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICBpZiAob3RoZXIudG9wICE9PSBudWxsICYmIG90aGVyICE9PSBpdGVtICYmIG90aGVyLnN0YWNrICYmIGNvbGxpc2lvbihpdGVtLCBvdGhlciwgbWFyZ2luLml0ZW0sIG90aGVyLm9wdGlvbnMucnRsKSkge1xuICAgICAgICAgICAgY29sbGlkaW5nSXRlbSA9IG90aGVyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbGxpZGluZ0l0ZW0gIT0gbnVsbCkge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIGEgY29sbGlzaW9uLiBSZXBvc2l0aW9uIHRoZSBpdGVtcyBhYm92ZSB0aGUgY29sbGlkaW5nIGVsZW1lbnRcbiAgICAgICAgICBpdGVtLnRvcCA9IGNvbGxpZGluZ0l0ZW0udG9wICsgY29sbGlkaW5nSXRlbS5oZWlnaHQgKyBtYXJnaW4uaXRlbS52ZXJ0aWNhbDtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoY29sbGlkaW5nSXRlbSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaG91bGRCYWlsO1xufVxuXG4vKipcbiAqIEFkanVzdCB2ZXJ0aWNhbCBwb3NpdGlvbnMgb2YgdGhlIGl0ZW1zIHdpdGhpbiBhIHNpbmdsZSBzdWJncm91cCBzdWNoIHRoYXQgdGhleVxuICogZG9uJ3Qgb3ZlcmxhcCBlYWNoIG90aGVyLlxuICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gKiAgICAgICAgICAgIEFsbCBpdGVtcyB3aXRoaW5hIHN1Ymdyb3VwXG4gKiBAcGFyYW0ge3tpdGVtOiB7aG9yaXpvbnRhbDogbnVtYmVyLCB2ZXJ0aWNhbDogbnVtYmVyfSwgYXhpczogbnVtYmVyfX0gbWFyZ2luXG4gKiAgICAgICAgICAgIE1hcmdpbnMgYmV0d2VlbiBpdGVtcyBhbmQgYmV0d2VlbiBpdGVtcyBhbmQgdGhlIGF4aXMuXG4gKiBAcGFyYW0ge3N1Ymdyb3VwfSBzdWJncm91cFxuICogICAgICAgICAgICBUaGUgc3ViZ3JvdXAgdGhhdCBpcyBiZWluZyBzdGFja2VkXG4gKi9cbmZ1bmN0aW9uIHN1YnN0YWNrKGl0ZW1zLCBtYXJnaW4sIHN1Ymdyb3VwKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICBpdGVtc1tpXS50b3AgPSBudWxsO1xuICB9XG5cbiAgLy8gU2V0IHRoZSBpbml0aWFsIGhlaWdodFxuICBsZXQgc3ViZ3JvdXBIZWlnaHQgPSBzdWJncm91cC5oZWlnaHQ7XG5cbiAgLy8gY2FsY3VsYXRlIG5ldywgbm9uLW92ZXJsYXBwaW5nIHBvc2l0aW9uc1xuICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpdGVtID0gaXRlbXNbaV07XG5cbiAgICBpZiAoaXRlbS5zdGFjayAmJiBpdGVtLnRvcCA9PT0gbnVsbCkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSB0b3AgcG9zaXRpb25cbiAgICAgIGl0ZW0udG9wID0gaXRlbS5iYXNlVG9wOy8vbWFyZ2luLmF4aXMgKyBpdGVtLmJhc2VUb3A7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgLy8gVE9ETzogb3B0aW1pemUgY2hlY2tpbmcgZm9yIG92ZXJsYXAuIHdoZW4gdGhlcmUgaXMgYSBnYXAgd2l0aG91dCBpdGVtcyxcbiAgICAgICAgLy8gICAgICAgeW91IG9ubHkgbmVlZCB0byBjaGVjayBmb3IgaXRlbXMgZnJvbSB0aGUgbmV4dCBpdGVtIG9uLCBub3QgZnJvbSB6ZXJvXG4gICAgICAgIHZhciBjb2xsaWRpbmdJdGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGpqID0gaXRlbXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgICAgIGNvbnN0IG90aGVyID0gaXRlbXNbal07XG4gICAgICAgICAgaWYgKG90aGVyLnRvcCAhPT0gbnVsbCAmJiBvdGhlciAhPT0gaXRlbSAvKiYmIG90aGVyLnN0YWNrKi8gJiYgY29sbGlzaW9uKGl0ZW0sIG90aGVyLCBtYXJnaW4uaXRlbSwgb3RoZXIub3B0aW9ucy5ydGwpKSB7XG4gICAgICAgICAgICBjb2xsaWRpbmdJdGVtID0gb3RoZXI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sbGlkaW5nSXRlbSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgYSBjb2xsaXNpb24uIFJlcG9zaXRpb24gdGhlIGl0ZW1zIGFib3ZlIHRoZSBjb2xsaWRpbmcgZWxlbWVudFxuICAgICAgICAgIGl0ZW0udG9wID0gY29sbGlkaW5nSXRlbS50b3AgKyBjb2xsaWRpbmdJdGVtLmhlaWdodCArIG1hcmdpbi5pdGVtLnZlcnRpY2FsOy8vICsgaXRlbS5iYXNlVG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0udG9wICsgaXRlbS5oZWlnaHQgPiBzdWJncm91cEhlaWdodCkge1xuICAgICAgICAgIHN1Ymdyb3VwSGVpZ2h0ID0gaXRlbS50b3AgKyBpdGVtLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoY29sbGlkaW5nSXRlbSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHRoZSBuZXcgaGVpZ2h0XG4gIHN1Ymdyb3VwLmhlaWdodCA9IHN1Ymdyb3VwSGVpZ2h0IC0gc3ViZ3JvdXAudG9wICsgMC41ICogbWFyZ2luLml0ZW0udmVydGljYWw7XG59XG5cbi8qKlxuICogQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9ucyBvZiB0aGUgaXRlbXMgd2l0aG91dCBzdGFja2luZyB0aGVtXG4gKiBAcGFyYW0ge0l0ZW1bXX0gaXRlbXNcbiAqICAgICAgICAgICAgQWxsIHZpc2libGUgaXRlbXNcbiAqIEBwYXJhbSB7e2l0ZW06IHtob3Jpem9udGFsOiBudW1iZXIsIHZlcnRpY2FsOiBudW1iZXJ9LCBheGlzOiBudW1iZXJ9fSBtYXJnaW5cbiAqICAgICAgICAgICAgTWFyZ2lucyBiZXR3ZWVuIGl0ZW1zIGFuZCBiZXR3ZWVuIGl0ZW1zIGFuZCB0aGUgYXhpcy5cbiAqIEBwYXJhbSB7c3ViZ3JvdXBzW119IHN1Ymdyb3Vwc1xuICogICAgICAgICAgICBBbGwgc3ViZ3JvdXBzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3RhY2tTdWJncm91cHNcbiAqL1xuZnVuY3Rpb24gbm9zdGFjayhpdGVtcywgbWFyZ2luLCBzdWJncm91cHMsIGlzU3RhY2tTdWJncm91cHMpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpdGVtc1tpXS5kYXRhLnN1Ymdyb3VwID09IHVuZGVmaW5lZCkge1xuICAgICAgaXRlbXNbaV0udG9wID0gbWFyZ2luLml0ZW0udmVydGljYWw7XG4gICAgfSBlbHNlIGlmIChpdGVtc1tpXS5kYXRhLnN1Ymdyb3VwICE9PSB1bmRlZmluZWQgJiYgaXNTdGFja1N1Ymdyb3Vwcykge1xuICAgICAgbGV0IG5ld1RvcCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHN1Ymdyb3VwIGluIHN1Ymdyb3Vwcykge1xuICAgICAgICBpZiAoc3ViZ3JvdXBzLmhhc093blByb3BlcnR5KHN1Ymdyb3VwKSkge1xuICAgICAgICAgIGlmIChzdWJncm91cHNbc3ViZ3JvdXBdLnZpc2libGUgPT0gdHJ1ZSAmJiBzdWJncm91cHNbc3ViZ3JvdXBdLmluZGV4IDwgc3ViZ3JvdXBzW2l0ZW1zW2ldLmRhdGEuc3ViZ3JvdXBdLmluZGV4KSB7XG4gICAgICAgICAgICBuZXdUb3AgKz0gc3ViZ3JvdXBzW3N1Ymdyb3VwXS5oZWlnaHQ7XG4gICAgICAgICAgICBzdWJncm91cHNbaXRlbXNbaV0uZGF0YS5zdWJncm91cF0udG9wID0gbmV3VG9wO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaXRlbXNbaV0udG9wID0gbmV3VG9wICsgMC41ICogbWFyZ2luLml0ZW0udmVydGljYWw7XG4gICAgfVxuICB9XG4gIGlmICghaXNTdGFja1N1Ymdyb3Vwcykge1xuICAgIHN0YWNrU3ViZ3JvdXBzKGl0ZW1zLCBtYXJnaW4sIHN1Ymdyb3Vwcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGp1c3QgdmVydGljYWwgcG9zaXRpb25zIG9mIHRoZSBzdWJncm91cHMgc3VjaCB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcmxhcCBlYWNoXG4gKiBvdGhlci5cbiAqIEBwYXJhbSB7QXJyYXkuPHRpbWVsaW5lLkl0ZW0+fSBpdGVtc1xuICogQHBhcmFtIHt7aXRlbToge2hvcml6b250YWw6IG51bWJlciwgdmVydGljYWw6IG51bWJlcn0sIGF4aXM6IG51bWJlcn19IG1hcmdpbiBNYXJnaW5zIGJldHdlZW4gaXRlbXMgYW5kIGJldHdlZW4gaXRlbXMgYW5kIHRoZSBheGlzLlxuICogQHBhcmFtIHtzdWJncm91cHNbXX0gc3ViZ3JvdXBzXG4gKiAgICAgICAgICAgIEFsbCBzdWJncm91cHNcbiAqL1xuZnVuY3Rpb24gc3RhY2tTdWJncm91cHMoaXRlbXMsIG1hcmdpbiwgc3ViZ3JvdXBzKSB7XG4gIGZvciAoY29uc3Qgc3ViZ3JvdXAgaW4gc3ViZ3JvdXBzKSB7XG4gICAgaWYgKHN1Ymdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShzdWJncm91cCkpIHtcblxuXG4gICAgICBzdWJncm91cHNbc3ViZ3JvdXBdLnRvcCA9IDA7XG4gICAgICBkbyB7XG4gICAgICAgIC8vIFRPRE86IG9wdGltaXplIGNoZWNraW5nIGZvciBvdmVybGFwLiB3aGVuIHRoZXJlIGlzIGEgZ2FwIHdpdGhvdXQgaXRlbXMsXG4gICAgICAgIC8vICAgICAgIHlvdSBvbmx5IG5lZWQgdG8gY2hlY2sgZm9yIGl0ZW1zIGZyb20gdGhlIG5leHQgaXRlbSBvbiwgbm90IGZyb20gemVyb1xuICAgICAgICB2YXIgY29sbGlkaW5nSXRlbSA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3Qgb3RoZXJTdWJncm91cCBpbiBzdWJncm91cHMpIHtcbiAgICAgICAgICBpZiAoc3ViZ3JvdXBzW290aGVyU3ViZ3JvdXBdLnRvcCAhPT0gbnVsbCAmJiBvdGhlclN1Ymdyb3VwICE9PSBzdWJncm91cCAmJiBzdWJncm91cHNbc3ViZ3JvdXBdLmluZGV4ID4gc3ViZ3JvdXBzW290aGVyU3ViZ3JvdXBdLmluZGV4ICYmIGNvbGxpc2lvbkJ5VGltZXMoc3ViZ3JvdXBzW3N1Ymdyb3VwXSwgc3ViZ3JvdXBzW290aGVyU3ViZ3JvdXBdKSkge1xuICAgICAgICAgICAgY29sbGlkaW5nSXRlbSA9IHN1Ymdyb3Vwc1tvdGhlclN1Ymdyb3VwXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xsaWRpbmdJdGVtICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBhIGNvbGxpc2lvbi4gUmVwb3NpdGlvbiB0aGUgc3ViZ3JvdXBzIGFib3ZlIHRoZSBjb2xsaWRpbmcgZWxlbWVudFxuICAgICAgICAgIHN1Ymdyb3Vwc1tzdWJncm91cF0udG9wID0gY29sbGlkaW5nSXRlbS50b3AgKyBjb2xsaWRpbmdJdGVtLmhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfSB3aGlsZSAoY29sbGlkaW5nSXRlbSk7XG4gICAgfVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoaXRlbXNbaV0uZGF0YS5zdWJncm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdGVtc1tpXS50b3AgPSBzdWJncm91cHNbaXRlbXNbaV0uZGF0YS5zdWJncm91cF0udG9wICsgMC41ICogbWFyZ2luLml0ZW0udmVydGljYWw7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWRqdXN0IHZlcnRpY2FsIHBvc2l0aW9ucyBvZiB0aGUgc3ViZ3JvdXBzIHN1Y2ggdGhhdCB0aGV5IGRvbid0IG92ZXJsYXAgZWFjaFxuICogb3RoZXIsIHRoZW4gc3RhY2tzIHRoZSBjb250ZW50cyBvZiBlYWNoIHN1Ymdyb3VwIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSB7SXRlbVtdfSBzdWJncm91cEl0ZW1zXG4gKiAgICAgICAgICAgIEFsbCB0aGUgaXRlbXMgaW4gYSBzdWJncm91cFxuICogQHBhcmFtIHt7aXRlbToge2hvcml6b250YWw6IG51bWJlciwgdmVydGljYWw6IG51bWJlcn0sIGF4aXM6IG51bWJlcn19IG1hcmdpblxuICogICAgICAgICAgICBNYXJnaW5zIGJldHdlZW4gaXRlbXMgYW5kIGJldHdlZW4gaXRlbXMgYW5kIHRoZSBheGlzLlxuICogQHBhcmFtIHtzdWJncm91cHNbXX0gc3ViZ3JvdXBzXG4gKiAgICAgICAgICAgIEFsbCBzdWJncm91cHNcbiAqL1xuZnVuY3Rpb24gc3RhY2tTdWJncm91cHNXaXRoSW5uZXJTdGFjayhzdWJncm91cEl0ZW1zLCBtYXJnaW4sIHN1Ymdyb3Vwcykge1xuICBsZXQgZG9TdWJTdGFjayA9IGZhbHNlO1xuXG4gIC8vIFJ1biBzdWJncm91cHMgaW4gdGhlaXIgb3JkZXIgKGlmIGFueSlcbiAgY29uc3Qgc3ViZ3JvdXBPcmRlciA9IFtdO1xuXG4gIGZvcih2YXIgc3ViZ3JvdXAgaW4gc3ViZ3JvdXBzKSB7XG4gICAgaWYgKHN1Ymdyb3Vwc1tzdWJncm91cF0uaGFzT3duUHJvcGVydHkoXCJpbmRleFwiKSkge1xuICAgICAgc3ViZ3JvdXBPcmRlcltzdWJncm91cHNbc3ViZ3JvdXBdLmluZGV4XSA9IHN1Ymdyb3VwO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHN1Ymdyb3VwT3JkZXIucHVzaChzdWJncm91cCk7XG4gICAgfVxuICB9XG5cbiAgZm9yKGxldCBqID0gMDsgaiA8IHN1Ymdyb3VwT3JkZXIubGVuZ3RoOyBqKyspIHtcbiAgICBzdWJncm91cCA9IHN1Ymdyb3VwT3JkZXJbal07XG4gICAgaWYgKHN1Ymdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShzdWJncm91cCkpIHtcblxuICAgICAgZG9TdWJTdGFjayA9IGRvU3ViU3RhY2sgfHwgc3ViZ3JvdXBzW3N1Ymdyb3VwXS5zdGFjaztcbiAgICAgIHN1Ymdyb3Vwc1tzdWJncm91cF0udG9wID0gMDtcblxuICAgICAgZm9yIChjb25zdCBvdGhlclN1Ymdyb3VwIGluIHN1Ymdyb3Vwcykge1xuICAgICAgICBpZiAoc3ViZ3JvdXBzW290aGVyU3ViZ3JvdXBdLnZpc2libGUgJiYgc3ViZ3JvdXBzW3N1Ymdyb3VwXS5pbmRleCA+IHN1Ymdyb3Vwc1tvdGhlclN1Ymdyb3VwXS5pbmRleCkge1xuICAgICAgICAgIHN1Ymdyb3Vwc1tzdWJncm91cF0udG9wICs9IHN1Ymdyb3Vwc1tvdGhlclN1Ymdyb3VwXS5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaXRlbXMgPSBzdWJncm91cEl0ZW1zW3N1Ymdyb3VwXTtcbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXRlbXNbaV0uZGF0YS5zdWJncm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaXRlbXNbaV0udG9wID0gc3ViZ3JvdXBzW2l0ZW1zW2ldLmRhdGEuc3ViZ3JvdXBdLnRvcCArIDAuNSAqIG1hcmdpbi5pdGVtLnZlcnRpY2FsO1xuXG4gICAgICAgICAgaWYgKHN1Ymdyb3Vwc1tzdWJncm91cF0uc3RhY2spIHtcbiAgICAgICAgICAgIGl0ZW1zW2ldLmJhc2VUb3AgPSBpdGVtc1tpXS50b3A7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkb1N1YlN0YWNrICYmIHN1Ymdyb3Vwc1tzdWJncm91cF0uc3RhY2spIHtcbiAgICAgICAgc3Vic3RhY2soc3ViZ3JvdXBJdGVtc1tzdWJncm91cF0sIG1hcmdpbiwgc3ViZ3JvdXBzW3N1Ymdyb3VwXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGVzdCBpZiB0aGUgdHdvIHByb3ZpZGVkIGl0ZW1zIGNvbGxpZGVcbiAqIFRoZSBpdGVtcyBtdXN0IGhhdmUgcGFyYW1ldGVycyBsZWZ0LCB3aWR0aCwgdG9wLCBhbmQgaGVpZ2h0LlxuICogQHBhcmFtIHtJdGVtfSBhICAgICAgICAgIFRoZSBmaXJzdCBpdGVtXG4gKiBAcGFyYW0ge0l0ZW19IGIgICAgICAgICAgVGhlIHNlY29uZCBpdGVtXG4gKiBAcGFyYW0ge3tob3Jpem9udGFsOiBudW1iZXIsIHZlcnRpY2FsOiBudW1iZXJ9fSBtYXJnaW5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBvYmplY3QgY29udGFpbmluZyBhIGhvcml6b250YWwgYW5kIHZlcnRpY2FsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bSByZXF1aXJlZCBtYXJnaW4uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJ0bFxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgIHRydWUgaWYgYSBhbmQgYiBjb2xsaWRlLCBlbHNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNvbGxpc2lvbihhLCBiLCBtYXJnaW4sIHJ0bCkge1xuICBpZiAocnRsKSB7XG4gICAgcmV0dXJuICAoKGEucmlnaHQgLSBtYXJnaW4uaG9yaXpvbnRhbCArIEVQU0lMT04pICA8IChiLnJpZ2h0ICsgYi53aWR0aCkgJiZcbiAgICAoYS5yaWdodCArIGEud2lkdGggKyBtYXJnaW4uaG9yaXpvbnRhbCAtIEVQU0lMT04pID4gYi5yaWdodCAmJlxuICAgIChhLnRvcCAtIG1hcmdpbi52ZXJ0aWNhbCArIEVQU0lMT04pICAgICAgICAgICAgICA8IChiLnRvcCArIGIuaGVpZ2h0KSAmJlxuICAgIChhLnRvcCArIGEuaGVpZ2h0ICsgbWFyZ2luLnZlcnRpY2FsIC0gRVBTSUxPTikgICA+IGIudG9wKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gKChhLmxlZnQgLSBtYXJnaW4uaG9yaXpvbnRhbCArIEVQU0lMT04pICAgPCAoYi5sZWZ0ICsgYi53aWR0aCkgJiZcbiAgICAoYS5sZWZ0ICsgYS53aWR0aCArIG1hcmdpbi5ob3Jpem9udGFsIC0gRVBTSUxPTikgPiBiLmxlZnQgJiZcbiAgICAoYS50b3AgLSBtYXJnaW4udmVydGljYWwgKyBFUFNJTE9OKSAgICAgICAgICAgICAgPCAoYi50b3AgKyBiLmhlaWdodCkgJiZcbiAgICAoYS50b3AgKyBhLmhlaWdodCArIG1hcmdpbi52ZXJ0aWNhbCAtIEVQU0lMT04pICAgPiBiLnRvcCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUZXN0IGlmIHRoZSB0d28gcHJvdmlkZWQgb2JqZWN0cyBjb2xsaWRlXG4gKiBUaGUgb2JqZWN0cyBtdXN0IGhhdmUgcGFyYW1ldGVycyBzdGFydCwgZW5kLCB0b3AsIGFuZCBoZWlnaHQuXG4gKiBAcGFyYW0ge09iamVjdH0gYSAgICAgICAgICBUaGUgZmlyc3QgT2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gYiAgICAgICAgICBUaGUgc2Vjb25kIE9iamVjdFxuICogQHJldHVybiB7Ym9vbGVhbn0gICAgICAgIHRydWUgaWYgYSBhbmQgYiBjb2xsaWRlLCBlbHNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGNvbGxpc2lvbkJ5VGltZXMoYSwgYikge1xuXG4gIC8vIENoZWNrIGZvciBvdmVybGFwIGJ5IHRpbWUgYW5kIGhlaWdodC4gQWJ1dHRpbmcgaXMgT0sgYW5kXG4gIC8vIG5vdCBjb25zaWRlcmVkIGEgY29sbGlzaW9uIHdoaWxlIG92ZXJsYXAgaXMgY29uc2lkZXJlZCBhIGNvbGxpc2lvbi5cbiAgY29uc3QgdGltZU92ZXJsYXAgPSBhLnN0YXJ0IDwgYi5lbmQgJiYgYS5lbmQgPiBiLnN0YXJ0O1xuICBjb25zdCBoZWlnaHRPdmVybGFwID0gYS50b3AgPCAoYi50b3AgKyBiLmhlaWdodCkgJiYgKGEudG9wICsgYS5oZWlnaHQpID4gYi50b3A7XG4gIHJldHVybiB0aW1lT3ZlcmxhcCAmJiBoZWlnaHRPdmVybGFwO1xufVxuXG52YXIgc3RhY2skMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcbiAgX19wcm90b19fOiBudWxsLFxuICBvcmRlckJ5U3RhcnQ6IG9yZGVyQnlTdGFydCxcbiAgb3JkZXJCeUVuZDogb3JkZXJCeUVuZCxcbiAgc3RhY2s6IHN0YWNrLFxuICBzdWJzdGFjazogc3Vic3RhY2ssXG4gIG5vc3RhY2s6IG5vc3RhY2ssXG4gIHN0YWNrU3ViZ3JvdXBzOiBzdGFja1N1Ymdyb3VwcyxcbiAgc3RhY2tTdWJncm91cHNXaXRoSW5uZXJTdGFjazogc3RhY2tTdWJncm91cHNXaXRoSW5uZXJTdGFjayxcbiAgY29sbGlzaW9uOiBjb2xsaXNpb24sXG4gIGNvbGxpc2lvbkJ5VGltZXM6IGNvbGxpc2lvbkJ5VGltZXNcbn0pO1xuXG5jb25zdCBVTkdST1VQRUQgPSAnX191bmdyb3VwZWRfXyc7ICAgLy8gcmVzZXJ2ZWQgZ3JvdXAgaWQgZm9yIHVuZ3JvdXBlZCBpdGVtc1xuY29uc3QgQkFDS0dST1VORCA9ICdfX2JhY2tncm91bmRfXyc7IC8vIHJlc2VydmVkIGdyb3VwIGlkIGZvciBiYWNrZ3JvdW5kIGl0ZW1zIHdpdGhvdXQgZ3JvdXBcblxuY29uc3QgUmVzZXJ2ZWRHcm91cElkcyA9IHtcbiAgVU5HUk9VUEVELFxuICBCQUNLR1JPVU5EXG59O1xuXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIEdyb3VwXG4gKi9cbmNsYXNzIEdyb3VwIHtcbiAgLyoqXG4gKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gZ3JvdXBJZFxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAqIEBwYXJhbSB7SXRlbVNldH0gaXRlbVNldFxuICogQGNvbnN0cnVjdG9yIEdyb3VwXG4gKi9cbiAgY29uc3RydWN0b3IoZ3JvdXBJZCwgZGF0YSwgaXRlbVNldCkge1xuICAgIHRoaXMuZ3JvdXBJZCA9IGdyb3VwSWQ7XG4gICAgdGhpcy5zdWJncm91cHMgPSB7fTtcbiAgICB0aGlzLnN1Ymdyb3VwU3RhY2sgPSB7fTtcbiAgICB0aGlzLnN1Ymdyb3VwU3RhY2tBbGwgPSBmYWxzZTtcbiAgICB0aGlzLnN1Ymdyb3VwVmlzaWJpbGl0eSA9IHt9O1xuICAgIHRoaXMuZG9Jbm5lclN0YWNrID0gZmFsc2U7XG4gICAgdGhpcy5zaG91bGRCYWlsU3RhY2tJdGVtcyA9IGZhbHNlO1xuICAgIHRoaXMuc3ViZ3JvdXBJbmRleCA9IDA7XG4gICAgdGhpcy5zdWJncm91cE9yZGVyZXIgPSBkYXRhICYmIGRhdGEuc3ViZ3JvdXBPcmRlcjtcbiAgICB0aGlzLml0ZW1TZXQgPSBpdGVtU2V0O1xuICAgIHRoaXMuaXNWaXNpYmxlID0gbnVsbDtcbiAgICB0aGlzLnN0YWNrRGlydHkgPSB0cnVlOyAvLyBpZiB0cnVlLCBpdGVtcyB3aWxsIGJlIHJlc3RhY2tlZCBvbiBuZXh0IHJlZHJhd1xuXG4gICAgLy8gVGhpcyBpcyBhIHN0YWNrIG9mIGZ1bmN0aW9ucyAoYCgpID0+IHZvaWRgKSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlXG4gICAgLy8gdGhlIGluc3RhbmNlIGlzIGRpc3Bvc2VkIG9mZiAobWV0aG9kIGBkaXNwb3NlYCkuIEFueXRoaW5nIHRoYXQgbmVlZHMgdG9cbiAgICAvLyBiZSBtYW51YWxseSBkaXNwb3NlZCBvZmYgYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbiBoYXBwZW5zIChvciBzbyB0aGF0XG4gICAgLy8gZ2FyYmFnZSBjb2xsZWN0aW9uIGNhbiBoYXBwZW4pIHNob3VsZCBiZSBhZGRlZCB0byB0aGlzIHN0YWNrLlxuICAgIHRoaXMuX2Rpc3Bvc2VDYWxsYmFja3MgPSBbXTtcblxuICAgIGlmIChkYXRhICYmIGRhdGEubmVzdGVkR3JvdXBzKSB7XG4gICAgICB0aGlzLm5lc3RlZEdyb3VwcyA9IGRhdGEubmVzdGVkR3JvdXBzO1xuICAgICAgaWYgKGRhdGEuc2hvd05lc3RlZCA9PSBmYWxzZSkge1xuICAgICAgICB0aGlzLnNob3dOZXN0ZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd05lc3RlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5zdWJncm91cFN0YWNrKSB7XG4gICAgICBpZiAodHlwZW9mIGRhdGEuc3ViZ3JvdXBTdGFjayA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgdGhpcy5kb0lubmVyU3RhY2sgPSBkYXRhLnN1Ymdyb3VwU3RhY2s7XG4gICAgICAgIHRoaXMuc3ViZ3JvdXBTdGFja0FsbCA9IGRhdGEuc3ViZ3JvdXBTdGFjaztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBXZSBtaWdodCBiZSBkb2luZyBzdGFja2luZyBvbiBzcGVjaWZpYyBzdWIgZ3JvdXBzLCBidXQgb25seVxuICAgICAgICAvLyBpZiBhdCBsZWFzdCBvbmUgaXMgc2V0IHRvIGRvIHN0YWNraW5nXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gZGF0YS5zdWJncm91cFN0YWNrKSB7XG4gICAgICAgICAgdGhpcy5zdWJncm91cFN0YWNrW2tleV0gPSBkYXRhLnN1Ymdyb3VwU3RhY2tba2V5XTtcbiAgICAgICAgICB0aGlzLmRvSW5uZXJTdGFjayA9IHRoaXMuZG9Jbm5lclN0YWNrIHx8IGRhdGEuc3ViZ3JvdXBTdGFja1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5oZWlnaHRNb2RlKSB7XG4gICAgICB0aGlzLmhlaWdodE1vZGUgPSBkYXRhLmhlaWdodE1vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVpZ2h0TW9kZSA9IGl0ZW1TZXQub3B0aW9ucy5ncm91cEhlaWdodE1vZGU7XG4gICAgfVxuXG4gICAgdGhpcy5uZXN0ZWRJbkdyb3VwID0gbnVsbDtcblxuICAgIHRoaXMuZG9tID0ge307XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGxhYmVsOiB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuY2xhc3NOYW1lID0gbnVsbDtcblxuICAgIHRoaXMuaXRlbXMgPSB7fTsgICAgICAgIC8vIGl0ZW1zIGZpbHRlcmVkIGJ5IGdyb3VwSWQgb2YgdGhpcyBncm91cFxuICAgIHRoaXMudmlzaWJsZUl0ZW1zID0gW107IC8vIGl0ZW1zIGN1cnJlbnRseSB2aXNpYmxlIGluIHdpbmRvd1xuICAgIHRoaXMuaXRlbXNJblJhbmdlID0gW107IC8vIGl0ZW1zIGN1cnJlbnRseSBpbiByYW5nZVxuICAgIHRoaXMub3JkZXJlZEl0ZW1zID0ge1xuICAgICAgYnlTdGFydDogW10sXG4gICAgICBieUVuZDogW11cbiAgICB9O1xuICAgIHRoaXMuY2hlY2tSYW5nZWRJdGVtcyA9IGZhbHNlOyAvLyBuZWVkZWQgdG8gcmVmcmVzaCB0aGUgcmFuZ2VkIGl0ZW1zIGlmIHRoZSB3aW5kb3cgaXMgcHJvZ3JhbWF0aWNhbGx5IGNoYW5nZWQgd2l0aCBOTyBvdmVybGFwLlxuXG4gICAgY29uc3QgaGFuZGxlQ2hlY2tSYW5nZWRJdGVtcyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2hlY2tSYW5nZWRJdGVtcyA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLml0ZW1TZXQuYm9keS5lbWl0dGVyLm9uKFwiY2hlY2tSYW5nZWRJdGVtc1wiLCBoYW5kbGVDaGVja1JhbmdlZEl0ZW1zKTtcbiAgICB0aGlzLl9kaXNwb3NlQ2FsbGJhY2tzLnB1c2goKCkgPT4ge1xuICAgICAgdGhpcy5pdGVtU2V0LmJvZHkuZW1pdHRlci5vZmYoXCJjaGVja1JhbmdlZEl0ZW1zXCIsIGhhbmRsZUNoZWNrUmFuZ2VkSXRlbXMpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fY3JlYXRlKCk7XG5cbiAgICB0aGlzLnNldERhdGEoZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIERPTSBlbGVtZW50cyBmb3IgdGhlIGdyb3VwXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlKCkge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgaWYgKHRoaXMuaXRlbVNldC5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXIpIHtcbiAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICd2aXMtbGFiZWwgZHJhZ2dhYmxlJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGFiZWwuY2xhc3NOYW1lID0gJ3Zpcy1sYWJlbCc7XG4gICAgfVxuICAgIHRoaXMuZG9tLmxhYmVsID0gbGFiZWw7XG5cbiAgICBjb25zdCBpbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGlubmVyLmNsYXNzTmFtZSA9ICd2aXMtaW5uZXInO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKGlubmVyKTtcbiAgICB0aGlzLmRvbS5pbm5lciA9IGlubmVyO1xuXG4gICAgY29uc3QgZm9yZWdyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZvcmVncm91bmQuY2xhc3NOYW1lID0gJ3Zpcy1ncm91cCc7XG4gICAgZm9yZWdyb3VuZFsndmlzLWdyb3VwJ10gPSB0aGlzO1xuICAgIHRoaXMuZG9tLmZvcmVncm91bmQgPSBmb3JlZ3JvdW5kO1xuXG4gICAgdGhpcy5kb20uYmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmJhY2tncm91bmQuY2xhc3NOYW1lID0gJ3Zpcy1ncm91cCc7XG5cbiAgICB0aGlzLmRvbS5heGlzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20uYXhpcy5jbGFzc05hbWUgPSAndmlzLWdyb3VwJztcblxuICAgIC8vIGNyZWF0ZSBhIGhpZGRlbiBtYXJrZXIgdG8gZGV0ZWN0IHdoZW4gdGhlIFRpbWVsaW5lcyBjb250YWluZXIgaXMgYXR0YWNoZWRcbiAgICAvLyB0byB0aGUgRE9NLCBvciB0aGUgc3R5bGUgb2YgYSBwYXJlbnQgb2YgdGhlIFRpbWVsaW5lIGlzIGNoYW5nZWQgZnJvbVxuICAgIC8vIGRpc3BsYXk6bm9uZSBpcyBjaGFuZ2VkIHRvIHZpc2libGUuXG4gICAgdGhpcy5kb20ubWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5kb20ubWFya2VyLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB0aGlzLmRvbS5tYXJrZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgIHRoaXMuZG9tLm1hcmtlci5pbm5lckhUTUwgPSAnJztcbiAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1hcmtlcik7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBncm91cCBkYXRhIGZvciB0aGlzIGdyb3VwXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhICAgR3JvdXAgZGF0YSwgY2FuIGNvbnRhaW4gcHJvcGVydGllcyBjb250ZW50IGFuZCBjbGFzc05hbWVcbiAgICovXG4gIHNldERhdGEoZGF0YSkge1xuICAgIGlmICh0aGlzLml0ZW1TZXQuZ3JvdXBUb3VjaFBhcmFtcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAvLyB1cGRhdGUgY29udGVudHNcbiAgICBsZXQgY29udGVudDtcbiAgICBsZXQgdGVtcGxhdGVGdW5jdGlvbjtcblxuICAgIGlmIChkYXRhICYmIGRhdGEuc3ViZ3JvdXBWaXNpYmlsaXR5KSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhLnN1Ymdyb3VwVmlzaWJpbGl0eSkge1xuICAgICAgICB0aGlzLnN1Ymdyb3VwVmlzaWJpbGl0eVtrZXldID0gZGF0YS5zdWJncm91cFZpc2liaWxpdHlba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5pdGVtU2V0Lm9wdGlvbnMgJiYgdGhpcy5pdGVtU2V0Lm9wdGlvbnMuZ3JvdXBUZW1wbGF0ZSkge1xuICAgICAgdGVtcGxhdGVGdW5jdGlvbiA9IHRoaXMuaXRlbVNldC5vcHRpb25zLmdyb3VwVGVtcGxhdGUuYmluZCh0aGlzKTtcbiAgICAgIGNvbnRlbnQgPSB0ZW1wbGF0ZUZ1bmN0aW9uKGRhdGEsIHRoaXMuZG9tLmlubmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudCA9IGRhdGEgJiYgZGF0YS5jb250ZW50O1xuICAgIH1cblxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgd2hpbGUgKHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgdGhpcy5kb20uaW5uZXIucmVtb3ZlQ2hpbGQodGhpcy5kb20uaW5uZXIuZmlyc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRvbS5pbm5lci5hcHBlbmRDaGlsZChjb250ZW50KTtcbiAgICB9IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBPYmplY3QgJiYgY29udGVudC5pc1JlYWN0Q29tcG9uZW50KSA7IGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHRlbXBsYXRlRnVuY3Rpb24oZGF0YSwgdGhpcy5kb20uaW5uZXIpO1xuICAgIH0gZWxzZSBpZiAoY29udGVudCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZG9tLmlubmVyLmlubmVySFRNTCA9IHV0aWwueHNzKGNvbnRlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvbS5pbm5lci5pbm5lckhUTUwgPSB1dGlsLnhzcyh0aGlzLmdyb3VwSWQgfHwgJycpOyAvLyBncm91cElkIGNhbiBiZSBudWxsXG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIHRpdGxlXG4gICAgdGhpcy5kb20ubGFiZWwudGl0bGUgPSBkYXRhICYmIGRhdGEudGl0bGUgfHwgJyc7XG4gICAgaWYgKCF0aGlzLmRvbS5pbm5lci5maXJzdENoaWxkKSB7XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5pbm5lciwgJ3Zpcy1oaWRkZW4nKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB1dGlsLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5pbm5lciwgJ3Zpcy1oaWRkZW4nKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLm5lc3RlZEdyb3Vwcykge1xuICAgICAgaWYgKCF0aGlzLm5lc3RlZEdyb3VwcyB8fCB0aGlzLm5lc3RlZEdyb3VwcyAhPSBkYXRhLm5lc3RlZEdyb3Vwcykge1xuICAgICAgICB0aGlzLm5lc3RlZEdyb3VwcyA9IGRhdGEubmVzdGVkR3JvdXBzO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS5zaG93TmVzdGVkICE9PSB1bmRlZmluZWQgfHwgdGhpcy5zaG93TmVzdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGRhdGEuc2hvd05lc3RlZCA9PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuc2hvd05lc3RlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2hvd05lc3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXRpbC5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsICd2aXMtbmVzdGluZy1ncm91cCcpO1xuICAgICAgaWYgKHRoaXMuc2hvd05lc3RlZCkge1xuICAgICAgICB1dGlsLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ2V4cGFuZGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1dGlsLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ2V4cGFuZGVkJyk7XG4gICAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLCAnY29sbGFwc2VkJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLm5lc3RlZEdyb3Vwcykge1xuICAgICAgdGhpcy5uZXN0ZWRHcm91cHMgPSBudWxsO1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsICdjb2xsYXBzZWQnKTtcbiAgICAgIHV0aWwucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLCAnZXhwYW5kZWQnKTtcbiAgICAgIHV0aWwucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLCAndmlzLW5lc3RpbmctZ3JvdXAnKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiAoZGF0YS50cmVlTGV2ZWx8fCBkYXRhLm5lc3RlZEluR3JvdXApKSB7XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ3Zpcy1uZXN0ZWQtZ3JvdXAnKTtcbiAgICAgIGlmIChkYXRhLnRyZWVMZXZlbCkge1xuICAgICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ3Zpcy1ncm91cC1sZXZlbC0nICsgZGF0YS50cmVlTGV2ZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTmVzdGluZyBsZXZlbCBpcyB1bmtub3duLCBidXQgd2UncmUgc3VyZSBpdCdzIGF0IGxlYXN0IDFcbiAgICAgICAgdXRpbC5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsICd2aXMtZ3JvdXAtbGV2ZWwtdW5rbm93bi1idXQtZ3RlMScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgJ3Zpcy1ncm91cC1sZXZlbC0wJyk7XG4gICAgfVxuICAgIFxuICAgIC8vIHVwZGF0ZSBjbGFzc05hbWVcbiAgICBjb25zdCBjbGFzc05hbWUgPSBkYXRhICYmIGRhdGEuY2xhc3NOYW1lIHx8IG51bGw7XG4gICAgaWYgKGNsYXNzTmFtZSAhPSB0aGlzLmNsYXNzTmFtZSkge1xuICAgICAgaWYgKHRoaXMuY2xhc3NOYW1lKSB7XG4gICAgICAgIHV0aWwucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLCB0aGlzLmNsYXNzTmFtZSk7XG4gICAgICAgIHV0aWwucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmZvcmVncm91bmQsIHRoaXMuY2xhc3NOYW1lKTtcbiAgICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCwgdGhpcy5jbGFzc05hbWUpO1xuICAgICAgICB1dGlsLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5heGlzLCB0aGlzLmNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCwgY2xhc3NOYW1lKTtcbiAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmZvcmVncm91bmQsIGNsYXNzTmFtZSk7XG4gICAgICB1dGlsLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5iYWNrZ3JvdW5kLCBjbGFzc05hbWUpO1xuICAgICAgdXRpbC5hZGRDbGFzc05hbWUodGhpcy5kb20uYXhpcywgY2xhc3NOYW1lKTtcbiAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBzdHlsZVxuICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICB1dGlsLnJlbW92ZUNzc1RleHQodGhpcy5kb20ubGFiZWwsIHRoaXMuc3R5bGUpO1xuICAgICAgdGhpcy5zdHlsZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChkYXRhICYmIGRhdGEuc3R5bGUpIHtcbiAgICAgIHV0aWwuYWRkQ3NzVGV4dCh0aGlzLmRvbS5sYWJlbCwgZGF0YS5zdHlsZSk7XG4gICAgICB0aGlzLnN0eWxlID0gZGF0YS5zdHlsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB3aWR0aCBvZiB0aGUgZ3JvdXAgbGFiZWxcbiAgICogQHJldHVybiB7bnVtYmVyfSB3aWR0aFxuICAgKi9cbiAgZ2V0TGFiZWxXaWR0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5sYWJlbC53aWR0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBjaGVjayBpZiBncm91cCBoYXMgaGFkIGFuIGluaXRpYWwgaGVpZ2h0IGhhbmdlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBcbiAgICovXG4gIF9kaWRNYXJrZXJIZWlnaHRDaGFuZ2UoKSB7XG4gICAgY29uc3QgbWFya2VySGVpZ2h0ID0gdGhpcy5kb20ubWFya2VyLmNsaWVudEhlaWdodDtcbiAgICBpZiAobWFya2VySGVpZ2h0ICE9IHRoaXMubGFzdE1hcmtlckhlaWdodCkge1xuICAgICAgdGhpcy5sYXN0TWFya2VySGVpZ2h0ID0gbWFya2VySGVpZ2h0O1xuICAgICAgY29uc3QgcmVkcmF3UXVldWUgPSB7fTtcbiAgICAgIGxldCByZWRyYXdRdWV1ZUxlbmd0aCA9IDA7XG5cbiAgICAgIHV0aWwuZm9yRWFjaCh0aGlzLml0ZW1zLCAoaXRlbSwga2V5KSA9PiB7XG4gICAgICAgIGl0ZW0uZGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ZWQpIHtcbiAgICAgICAgICBjb25zdCByZXR1cm5RdWV1ZSA9IHRydWU7XG4gICAgICAgICAgcmVkcmF3UXVldWVba2V5XSA9IGl0ZW0ucmVkcmF3KHJldHVyblF1ZXVlKTtcbiAgICAgICAgICByZWRyYXdRdWV1ZUxlbmd0aCA9IHJlZHJhd1F1ZXVlW2tleV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbmVlZFJlZHJhdyA9IHJlZHJhd1F1ZXVlTGVuZ3RoID4gMDtcbiAgICAgIGlmIChuZWVkUmVkcmF3KSB7XG4gICAgICAgIC8vIHJlZHJhdyBhbGwgcmVndWxhciBpdGVtc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHJhd1F1ZXVlTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB1dGlsLmZvckVhY2gocmVkcmF3UXVldWUsIGZucyA9PiB7XG4gICAgICAgICAgICBmbnNbaV0oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2FsY3VsYXRlIGdyb3VwIGRpbWVudGlvbnMgYW5kIHBvc2l0aW9uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbHNcbiAgICovXG4gIF9jYWxjdWxhdGVHcm91cFNpemVBbmRQb3NpdGlvbigpIHtcbiAgICBjb25zdCB7IG9mZnNldFRvcCwgb2Zmc2V0TGVmdCwgb2Zmc2V0V2lkdGggfSA9IHRoaXMuZG9tLmZvcmVncm91bmQ7XG4gICAgdGhpcy50b3AgPSBvZmZzZXRUb3A7XG4gICAgdGhpcy5yaWdodCA9IG9mZnNldExlZnQ7XG4gICAgdGhpcy53aWR0aCA9IG9mZnNldFdpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrcyBpZiBzaG91bGQgYmFpbCByZWRyYXcgb2YgaXRlbXNcbiAgICogQHJldHVybnMge2Jvb2xlYW59IHNob3VsZCBiYWlsIFxuICAgKi9cbiAgX3Nob3VsZEJhaWxJdGVtc1JlZHJhdygpIHtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgY29uc3QgdGltZW91dE9wdGlvbnMgPSB0aGlzLml0ZW1TZXQub3B0aW9ucy5vblRpbWVvdXQ7XG4gICAgY29uc3QgYmFpbE9wdGlvbnMgPSB7XG4gICAgICByZWxhdGl2ZUJhaWxpbmdUaW1lOiB0aGlzLml0ZW1TZXQuaXRlbXNTZXR0aW5nVGltZSxcbiAgICAgIGJhaWxUaW1lTXM6IHRpbWVvdXRPcHRpb25zICYmIHRpbWVvdXRPcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgIHVzZXJCYWlsRnVuY3Rpb246IHRpbWVvdXRPcHRpb25zICYmIHRpbWVvdXRPcHRpb25zLmNhbGxiYWNrLFxuICAgICAgc2hvdWxkQmFpbFN0YWNrSXRlbXM6IHRoaXMuc2hvdWxkQmFpbFN0YWNrSXRlbXNcbiAgICB9O1xuICAgIGxldCBiYWlsID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuaXRlbVNldC5pbml0aWFsRHJhd0RvbmUpIHtcbiAgICAgIGlmIChiYWlsT3B0aW9ucy5zaG91bGRCYWlsU3RhY2tJdGVtcykgeyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgaWYgKE1hdGguYWJzKERhdGUubm93KCkgLSBuZXcgRGF0ZShiYWlsT3B0aW9ucy5yZWxhdGl2ZUJhaWxpbmdUaW1lKSkgPiBiYWlsT3B0aW9ucy5iYWlsVGltZU1zKSB7XG4gICAgICAgIGlmIChiYWlsT3B0aW9ucy51c2VyQmFpbEZ1bmN0aW9uICYmIHRoaXMuaXRlbVNldC51c2VyQ29udGludWVOb3RCYWlsID09IG51bGwpIHtcbiAgICAgICAgICBiYWlsT3B0aW9ucy51c2VyQmFpbEZ1bmN0aW9uKGRpZFVzZXJDb250aW51ZSA9PiB7XG4gICAgICAgICAgICBtZS5pdGVtU2V0LnVzZXJDb250aW51ZU5vdEJhaWwgPSBkaWRVc2VyQ29udGludWU7XG4gICAgICAgICAgICBiYWlsID0gIWRpZFVzZXJDb250aW51ZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChtZS5pdGVtU2V0LnVzZXJDb250aW51ZU5vdEJhaWwgPT0gZmFsc2UpIHtcbiAgICAgICAgICBiYWlsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiYWlsID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFpbDtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWRyYXdzIGl0ZW1zXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VSZXN0YWNrXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gbGFzdElzVmlzaWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWFyZ2luXG4gICAqIEBwYXJhbSB7b2JqZWN0fSByYW5nZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlZHJhd0l0ZW1zKGZvcmNlUmVzdGFjaywgbGFzdElzVmlzaWJsZSwgbWFyZ2luLCByYW5nZSkge1xuICAgIGNvbnN0IHJlc3RhY2sgPSBmb3JjZVJlc3RhY2sgfHwgdGhpcy5zdGFja0RpcnR5IHx8IHRoaXMuaXNWaXNpYmxlICYmICFsYXN0SXNWaXNpYmxlO1xuXG4gICAgLy8gaWYgcmVzdGFja2luZywgcmVwb3NpdGlvbiB2aXNpYmxlIGl0ZW1zIHZlcnRpY2FsbHlcbiAgICBpZiAocmVzdGFjaykge1xuICAgICAgY29uc3Qgb3JkZXJlZEl0ZW1zID0ge1xuICAgICAgICBieUVuZDogdGhpcy5vcmRlcmVkSXRlbXMuYnlFbmQuZmlsdGVyKGl0ZW0gPT4gIWl0ZW0uaXNDbHVzdGVyKSxcbiAgICAgICAgYnlTdGFydDogdGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydC5maWx0ZXIoaXRlbSA9PiAhaXRlbS5pc0NsdXN0ZXIpXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvcmRlcmVkQ2x1c3RlcnMgPSB7XG4gICAgICAgIGJ5RW5kOiBbLi4ubmV3IFNldCh0aGlzLm9yZGVyZWRJdGVtcy5ieUVuZC5tYXAoaXRlbSA9PiBpdGVtLmNsdXN0ZXIpLmZpbHRlcihpdGVtID0+ICEhaXRlbSkpXSxcbiAgICAgICAgYnlTdGFydDogWy4uLm5ldyBTZXQodGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydC5tYXAoaXRlbSA9PiBpdGVtLmNsdXN0ZXIpLmZpbHRlcihpdGVtID0+ICEhaXRlbSkpXSxcbiAgICAgIH07XG5cbiAgICAgLyoqXG4gICAgICogR2V0IGFsbCB2aXNpYmxlIGl0ZW1zIGluIHJhbmdlXG4gICAgICogQHJldHVybiB7YXJyYXl9IGl0ZW1zXG4gICAgICovXG4gICAgICBjb25zdCBnZXRWaXNpYmxlSXRlbXMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpc2libGVJdGVtcyA9IHRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZShvcmRlcmVkSXRlbXMsIHRoaXMudmlzaWJsZUl0ZW1zLmZpbHRlcihpdGVtID0+ICFpdGVtLmlzQ2x1c3RlciksIHJhbmdlKTtcbiAgICAgICAgY29uc3QgdmlzaWJsZUNsdXN0ZXJzID0gdGhpcy5fdXBkYXRlQ2x1c3RlcnNJblJhbmdlKG9yZGVyZWRDbHVzdGVycywgdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc0NsdXN0ZXIpLCByYW5nZSk7XG4gICAgICAgIHJldHVybiBbLi4udmlzaWJsZUl0ZW1zLCAuLi52aXNpYmxlQ2x1c3RlcnNdO1xuICAgICAgfTtcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgdmlzaWJsZSBpdGVtcyBncm91cGVkIGJ5IHN1Ymdyb3VwXG4gICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBvcmRlckZuIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIG9yZGVyIGl0ZW1zIGluc2lkZSB0aGUgc3ViZ3JvdXBzXG4gICAgICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGdldFZpc2libGVJdGVtc0dyb3VwZWRCeVN1Ymdyb3VwID0gb3JkZXJGbiA9PiB7XG4gICAgICAgIGxldCB2aXNpYmxlU3ViZ3JvdXBzSXRlbXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBzdWJncm91cCBpbiB0aGlzLnN1Ymdyb3Vwcykge1xuICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXMuZmlsdGVyKGl0ZW0gPT4gaXRlbS5kYXRhLnN1Ymdyb3VwID09PSBzdWJncm91cCk7XG4gICAgICAgICAgdmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zW3N1Ymdyb3VwXSA9IG9yZGVyRm4gPyBpdGVtcy5zb3J0KChhLCBiKSA9PiBvcmRlckZuKGEuZGF0YSwgYi5kYXRhKSkgOiBpdGVtcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zO1xuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLml0ZW1TZXQub3B0aW9ucy5vcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBhIGN1c3RvbSBvcmRlciBmdW5jdGlvblxuICAgICAgICAvL3Nob3cgYWxsIGl0ZW1zXG4gICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMuZG9Jbm5lclN0YWNrICYmIHRoaXMuaXRlbVNldC5vcHRpb25zLnN0YWNrU3ViZ3JvdXBzKSB7XG4gICAgICAgICAgLy8gT3JkZXIgdGhlIGl0ZW1zIHdpdGhpbiBlYWNoIHN1Ymdyb3VwXG4gICAgICAgICAgY29uc3QgdmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zR3JvdXBlZEJ5U3ViZ3JvdXAodGhpcy5pdGVtU2V0Lm9wdGlvbnMub3JkZXIpO1xuICAgICAgICAgIHN0YWNrU3ViZ3JvdXBzV2l0aElubmVyU3RhY2sodmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zLCBtYXJnaW4sIHRoaXMuc3ViZ3JvdXBzKTtcbiAgICAgICAgICB0aGlzLnZpc2libGVJdGVtcyA9IGdldFZpc2libGVJdGVtcygpO1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVN1Ykdyb3VwSGVpZ2h0cyhtYXJnaW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMudmlzaWJsZUl0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zKCk7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlU3ViR3JvdXBIZWlnaHRzKG1hcmdpbik7XG4gICAgICAgICAgLy8gb3JkZXIgYWxsIGl0ZW1zIGFuZCBmb3JjZSBhIHJlc3RhY2tpbmdcbiAgICAgICAgICAgLy8gb3JkZXIgYWxsIGl0ZW1zIG91dHNpZGUgY2x1c3RlcnMgYW5kIGZvcmNlIGEgcmVzdGFja2luZ1xuICAgICAgICAgIGNvbnN0IGN1c3RvbU9yZGVyZWRJdGVtcyA9IHRoaXMudmlzaWJsZUl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc0NsdXN0ZXIgfHwgKCFpdGVtLmlzQ2x1c3RlciAmJiAhaXRlbS5jbHVzdGVyKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWUuaXRlbVNldC5vcHRpb25zLm9yZGVyKGEuZGF0YSwgYi5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNob3VsZEJhaWxTdGFja0l0ZW1zID0gc3RhY2soY3VzdG9tT3JkZXJlZEl0ZW1zLCBtYXJnaW4sIHRydWUsIHRoaXMuX3Nob3VsZEJhaWxJdGVtc1JlZHJhdy5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm8gY3VzdG9tIG9yZGVyIGZ1bmN0aW9uLCBsYXp5IHN0YWNraW5nXG4gICAgICAgIHRoaXMudmlzaWJsZUl0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zKCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVN1Ykdyb3VwSGVpZ2h0cyhtYXJnaW4pO1xuXG4gICAgICAgIGlmICh0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFjaykge1xuICAgICAgICAgIGlmICh0aGlzLmRvSW5uZXJTdGFjayAmJiB0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFja1N1Ymdyb3Vwcykge1xuICAgICAgICAgICAgY29uc3QgdmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zID0gZ2V0VmlzaWJsZUl0ZW1zR3JvdXBlZEJ5U3ViZ3JvdXAoKTtcbiAgICAgICAgICAgIHN0YWNrU3ViZ3JvdXBzV2l0aElubmVyU3RhY2sodmlzaWJsZVN1Ymdyb3Vwc0l0ZW1zLCBtYXJnaW4sIHRoaXMuc3ViZ3JvdXBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPOiB1Z2x5IHdheSB0byBhY2Nlc3Mgb3B0aW9ucy4uLlxuICAgICAgICAgICAgdGhpcy5zaG91bGRCYWlsU3RhY2tJdGVtcyA9IHN0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLCBtYXJnaW4sIHRydWUsIHRoaXMuX3Nob3VsZEJhaWxJdGVtc1JlZHJhdy5iaW5kKHRoaXMpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm8gc3RhY2tpbmdcbiAgICAgICAgICBub3N0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLCBtYXJnaW4sIHRoaXMuc3ViZ3JvdXBzLCB0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFja1N1Ymdyb3Vwcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnZpc2libGVJdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLnZpc2libGVJdGVtc1tpXS5yZXBvc2l0aW9uWCgpO1xuICAgICAgICBpZiAodGhpcy5zdWJncm91cFZpc2liaWxpdHlbdGhpcy52aXNpYmxlSXRlbXNbaV0uZGF0YS5zdWJncm91cF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICghdGhpcy5zdWJncm91cFZpc2liaWxpdHlbdGhpcy52aXNpYmxlSXRlbXNbaV0uZGF0YS5zdWJncm91cF0pIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZUl0ZW1zW2ldLmhpZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXRlbVNldC5vcHRpb25zLmNsdXN0ZXIpIHtcbiAgICAgICAgdXRpbC5mb3JFYWNoKHRoaXMuaXRlbXMsIGl0ZW0gPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmNsdXN0ZXIgJiYgaXRlbS5kaXNwbGF5ZWQpIHtcbiAgICAgICAgICAgIGl0ZW0uaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZEJhaWxTdGFja0l0ZW1zKSB7XG4gICAgICAgIHRoaXMuaXRlbVNldC5ib2R5LmVtaXR0ZXIuZW1pdCgnZGVzdHJveVRpbWVsaW5lJyk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0YWNrRGlydHkgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgaWYgZ3JvdXAgcmVzaXplZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlc2l6ZWRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBkaWQgcmVzaXplXG4gICAqL1xuICBfZGlkUmVzaXplKHJlc2l6ZWQsIGhlaWdodCkge1xuICAgIHJlc2l6ZWQgPSB1dGlsLnVwZGF0ZVByb3BlcnR5KHRoaXMsICdoZWlnaHQnLCBoZWlnaHQpIHx8IHJlc2l6ZWQ7XG4gICAgLy8gcmVjYWxjdWxhdGUgc2l6ZSBvZiBsYWJlbFxuICAgIGNvbnN0IGxhYmVsV2lkdGggPSB0aGlzLmRvbS5pbm5lci5jbGllbnRXaWR0aDtcbiAgICBjb25zdCBsYWJlbEhlaWdodCA9IHRoaXMuZG9tLmlubmVyLmNsaWVudEhlaWdodDtcbiAgICByZXNpemVkID0gdXRpbC51cGRhdGVQcm9wZXJ0eSh0aGlzLnByb3BzLmxhYmVsLCAnd2lkdGgnLCBsYWJlbFdpZHRoKSB8fCByZXNpemVkO1xuICAgIHJlc2l6ZWQgPSB1dGlsLnVwZGF0ZVByb3BlcnR5KHRoaXMucHJvcHMubGFiZWwsICdoZWlnaHQnLCBsYWJlbEhlaWdodCkgfHwgcmVzaXplZDtcbiAgICByZXR1cm4gcmVzaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBhcHBseSBncm91cCBoZWlnaHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICAgKi9cbiAgX2FwcGx5R3JvdXBIZWlnaHQoaGVpZ2h0KSB7XG4gICAgdGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgIHRoaXMuZG9tLmZvcmVncm91bmQuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcbiAgICB0aGlzLmRvbS5sYWJlbC5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBpdGVtcyBhZnRlciB0aGV5IGFyZSByZS1zdGFja2VkIGFuZCB0aGUgaGVpZ2h0IG9mIHRoZSBncm91cCBpcyBjYWxjdWxhdGVkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXJnaW5cbiAgICovXG4gIF91cGRhdGVJdGVtc1ZlcnRpY2FsUG9zaXRpb24obWFyZ2luKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gdGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMudmlzaWJsZUl0ZW1zW2ldO1xuICAgICAgaXRlbS5yZXBvc2l0aW9uWShtYXJnaW4pO1xuICAgICAgaWYgKCF0aGlzLmlzVmlzaWJsZSAmJiB0aGlzLmdyb3VwSWQgIT0gUmVzZXJ2ZWRHcm91cElkcy5CQUNLR1JPVU5EKSB7XG4gICAgICAgIGlmIChpdGVtLmRpc3BsYXllZCkgaXRlbS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhpcyBncm91cFxuICAgKiBAcGFyYW0ge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IHJhbmdlXG4gICAqIEBwYXJhbSB7e2l0ZW06IHtob3Jpem9udGFsOiBudW1iZXIsIHZlcnRpY2FsOiBudW1iZXJ9LCBheGlzOiBudW1iZXJ9fSBtYXJnaW5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZm9yY2VSZXN0YWNrPWZhbHNlXSAgRm9yY2UgcmVzdGFja2luZyBvZiBhbGwgaXRlbXNcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuUXVldWU9ZmFsc2VdICByZXR1cm4gdGhlIHF1ZXVlIG9yIGlmIHRoZSBncm91cCByZXNpemVkXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JvdXAgaXMgcmVzaXplZCBvciB0aGUgcmVkcmF3IHF1ZXVlIGlmIHJldHVyblF1ZXVlPXRydWVcbiAgICovXG4gIHJlZHJhdyhyYW5nZSwgbWFyZ2luLCBmb3JjZVJlc3RhY2ssIHJldHVyblF1ZXVlKSB7XG4gICAgbGV0IHJlc2l6ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBsYXN0SXNWaXNpYmxlID0gdGhpcy5pc1Zpc2libGU7XG4gICAgbGV0IGhlaWdodDtcblxuICAgIGNvbnN0IHF1ZXVlID0gW1xuICAgICAgKCkgPT4ge1xuICAgICAgICBmb3JjZVJlc3RhY2sgPSB0aGlzLl9kaWRNYXJrZXJIZWlnaHRDaGFuZ2UuY2FsbCh0aGlzKSB8fCBmb3JjZVJlc3RhY2s7XG4gICAgICB9LFxuICAgICAgXG4gICAgICAvLyByZWNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBzdWJncm91cHNcbiAgICAgIHRoaXMuX3VwZGF0ZVN1Ykdyb3VwSGVpZ2h0cy5iaW5kKHRoaXMsIG1hcmdpbiksXG5cbiAgICAgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgc2l6ZSBhbmQgcG9zaXRpb25cbiAgICAgIHRoaXMuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uLmJpbmQodGhpcyksXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5pc1Zpc2libGUgPSB0aGlzLl9pc0dyb3VwVmlzaWJsZS5iaW5kKHRoaXMpKHJhbmdlLCBtYXJnaW4pO1xuICAgICAgfSxcbiAgICAgIFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZWRyYXdJdGVtcy5iaW5kKHRoaXMpKGZvcmNlUmVzdGFjaywgbGFzdElzVmlzaWJsZSwgbWFyZ2luLCByYW5nZSk7XG4gICAgICB9LFxuXG4gICAgICAvLyB1cGRhdGUgc3ViZ3JvdXBzXG4gICAgICB0aGlzLl91cGRhdGVTdWJncm91cHNTaXplcy5iaW5kKHRoaXMpLFxuXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGhlaWdodCA9IHRoaXMuX2NhbGN1bGF0ZUhlaWdodC5iaW5kKHRoaXMpKG1hcmdpbik7XG4gICAgICB9LFxuXG4gICAgICAvLyBjYWxjdWxhdGUgYWN0dWFsIHNpemUgYW5kIHBvc2l0aW9uIGFnYWluXG4gICAgICB0aGlzLl9jYWxjdWxhdGVHcm91cFNpemVBbmRQb3NpdGlvbi5iaW5kKHRoaXMpLFxuXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHJlc2l6ZWQgPSB0aGlzLl9kaWRSZXNpemUuYmluZCh0aGlzKShyZXNpemVkLCBoZWlnaHQpO1xuICAgICAgfSxcblxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLl9hcHBseUdyb3VwSGVpZ2h0LmJpbmQodGhpcykoaGVpZ2h0KTtcbiAgICAgIH0sXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlSXRlbXNWZXJ0aWNhbFBvc2l0aW9uLmJpbmQodGhpcykobWFyZ2luKTtcbiAgICAgIH0sXG5cbiAgICAgICgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5pc1Zpc2libGUgJiYgdGhpcy5oZWlnaHQpIHtcbiAgICAgICAgICByZXNpemVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc2l6ZWRcbiAgICAgIH0pLmJpbmQodGhpcylcbiAgICBdO1xuXG4gICAgaWYgKHJldHVyblF1ZXVlKSB7XG4gICAgICByZXR1cm4gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBxdWV1ZS5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVjYWxjdWxhdGUgdGhlIGhlaWdodCBvZiB0aGUgc3ViZ3JvdXBzXG4gICAqXG4gICAqIEBwYXJhbSB7e2l0ZW06IHRpbWVsaW5lLkl0ZW19fSBtYXJnaW5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVTdWJHcm91cEhlaWdodHMobWFyZ2luKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3ViZ3JvdXBzKS5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBtZSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX3Jlc2V0U3ViZ3JvdXBzKCk7XG5cbiAgICAgIHV0aWwuZm9yRWFjaCh0aGlzLnZpc2libGVJdGVtcywgaXRlbSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmRhdGEuc3ViZ3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1lLnN1Ymdyb3Vwc1tpdGVtLmRhdGEuc3ViZ3JvdXBdLmhlaWdodCA9IE1hdGgubWF4KG1lLnN1Ymdyb3Vwc1tpdGVtLmRhdGEuc3ViZ3JvdXBdLmhlaWdodCwgaXRlbS5oZWlnaHQgKyBtYXJnaW4uaXRlbS52ZXJ0aWNhbCk7XG4gICAgICAgICAgbWUuc3ViZ3JvdXBzW2l0ZW0uZGF0YS5zdWJncm91cF0udmlzaWJsZSA9IHR5cGVvZiB0aGlzLnN1Ymdyb3VwVmlzaWJpbGl0eVtpdGVtLmRhdGEuc3ViZ3JvdXBdID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBCb29sZWFuKHRoaXMuc3ViZ3JvdXBWaXNpYmlsaXR5W2l0ZW0uZGF0YS5zdWJncm91cF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY2hlY2sgaWYgZ3JvdXAgaXMgdmlzaWJsZVxuICAgKlxuICAgKiBAcGFyYW0ge3RpbWVsaW5lLlJhbmdlfSByYW5nZVxuICAgKiBAcGFyYW0ge3theGlzOiB0aW1lbGluZS5EYXRhQXhpc319IG1hcmdpblxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gaXMgdmlzaWJsZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzR3JvdXBWaXNpYmxlKHJhbmdlLCBtYXJnaW4pIHtcbiAgICByZXR1cm4gKHRoaXMudG9wIDw9IHJhbmdlLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCAtIHJhbmdlLmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wICsgbWFyZ2luLmF4aXMpXG4gICAgJiYgKHRoaXMudG9wICsgdGhpcy5oZWlnaHQgKyBtYXJnaW4uYXhpcyA+PSAtIHJhbmdlLmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZWNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBncm91cFxuICAgKiBAcGFyYW0ge3tpdGVtOiB7aG9yaXpvbnRhbDogbnVtYmVyLCB2ZXJ0aWNhbDogbnVtYmVyfSwgYXhpczogbnVtYmVyfX0gbWFyZ2luXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGhlaWdodFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NhbGN1bGF0ZUhlaWdodChtYXJnaW4pIHtcbiAgICAvLyByZWNhbGN1bGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBncm91cFxuICAgIGxldCBoZWlnaHQ7XG5cbiAgICBsZXQgaXRlbXM7XG5cbiAgICBpZiAodGhpcy5oZWlnaHRNb2RlID09PSAnZml4ZWQnKSB7XG4gICAgICBpdGVtcyA9IHV0aWwudG9BcnJheSh0aGlzLml0ZW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVmYXVsdCBvciAnYXV0bydcbiAgICAgIGl0ZW1zID0gdGhpcy52aXNpYmxlSXRlbXM7XG4gICAgfVxuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBtaW4gPSBpdGVtc1swXS50b3A7XG4gICAgICBsZXQgbWF4ID0gaXRlbXNbMF0udG9wICsgaXRlbXNbMF0uaGVpZ2h0O1xuICAgICAgdXRpbC5mb3JFYWNoKGl0ZW1zLCBpdGVtID0+IHtcbiAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBpdGVtLnRvcCk7XG4gICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgKGl0ZW0udG9wICsgaXRlbS5oZWlnaHQpKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKG1pbiA+IG1hcmdpbi5heGlzKSB7XG4gICAgICAgIC8vIHRoZXJlIGlzIGFuIGVtcHR5IGdhcCBiZXR3ZWVuIHRoZSBsb3dlc3QgaXRlbSBhbmQgdGhlIGF4aXNcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gbWluIC0gbWFyZ2luLmF4aXM7XG4gICAgICAgIG1heCAtPSBvZmZzZXQ7XG4gICAgICAgIHV0aWwuZm9yRWFjaChpdGVtcywgaXRlbSA9PiB7XG4gICAgICAgICAgaXRlbS50b3AgLT0gb2Zmc2V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGhlaWdodCA9IE1hdGguY2VpbChtYXggKyBtYXJnaW4uaXRlbS52ZXJ0aWNhbCAvIDIpO1xuICAgICAgaWYgKHRoaXMuaGVpZ2h0TW9kZSAhPT0gXCJmaXRJdGVtc1wiKSB7XG4gICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgdGhpcy5wcm9wcy5sYWJlbC5oZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGhlaWdodCA9ICB0aGlzLnByb3BzLmxhYmVsLmhlaWdodDtcbiAgICB9XG4gICAgcmV0dXJuIGhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoaXMgZ3JvdXA6IGF0dGFjaCB0byB0aGUgRE9NXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICghdGhpcy5kb20ubGFiZWwucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5pdGVtU2V0LmRvbS5sYWJlbFNldC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuaXRlbVNldC5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5pdGVtU2V0LmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLml0ZW1TZXQuZG9tLmF4aXMuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhpcyBncm91cDogcmVtb3ZlIGZyb20gdGhlIERPTVxuICAgKi9cbiAgaGlkZSgpIHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuZG9tLmxhYmVsO1xuICAgIGlmIChsYWJlbC5wYXJlbnROb2RlKSB7XG4gICAgICBsYWJlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxhYmVsKTtcbiAgICB9XG5cbiAgICBjb25zdCBmb3JlZ3JvdW5kID0gdGhpcy5kb20uZm9yZWdyb3VuZDtcbiAgICBpZiAoZm9yZWdyb3VuZC5wYXJlbnROb2RlKSB7XG4gICAgICBmb3JlZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZm9yZWdyb3VuZCk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMuZG9tLmJhY2tncm91bmQ7XG4gICAgaWYgKGJhY2tncm91bmQucGFyZW50Tm9kZSkge1xuICAgICAgYmFja2dyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4aXMgPSB0aGlzLmRvbS5heGlzO1xuICAgIGlmIChheGlzLnBhcmVudE5vZGUpIHtcbiAgICAgIGF4aXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChheGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGl0ZW0gdG8gdGhlIGdyb3VwXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgYWRkKGl0ZW0pIHtcbiAgICB0aGlzLml0ZW1zW2l0ZW0uaWRdID0gaXRlbTtcbiAgICBpdGVtLnNldFBhcmVudCh0aGlzKTtcbiAgICB0aGlzLnN0YWNrRGlydHkgPSB0cnVlO1xuICAgIC8vIGFkZCB0b1xuICAgIGlmIChpdGVtLmRhdGEuc3ViZ3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fYWRkVG9TdWJncm91cChpdGVtKTtcbiAgICAgIHRoaXMub3JkZXJTdWJncm91cHMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudmlzaWJsZUl0ZW1zLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICBjb25zdCByYW5nZSA9IHRoaXMuaXRlbVNldC5ib2R5LnJhbmdlOyAvLyBUT0RPOiBub3QgbmljZSBhY2Nlc3NpbmcgdGhlIHJhbmdlIGxpa2UgdGhpc1xuICAgICAgdGhpcy5fY2hlY2tJZlZpc2libGUoaXRlbSwgdGhpcy52aXNpYmxlSXRlbXMsIHJhbmdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYWRkIGl0ZW0gdG8gc3ViZ3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Ymdyb3VwSWRcbiAgICovXG4gIF9hZGRUb1N1Ymdyb3VwKGl0ZW0sIHN1Ymdyb3VwSWQ9aXRlbS5kYXRhLnN1Ymdyb3VwKSB7XG4gICAgaWYgKHN1Ymdyb3VwSWQgIT0gdW5kZWZpbmVkICYmIHRoaXMuc3ViZ3JvdXBzW3N1Ymdyb3VwSWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3ViZ3JvdXBzW3N1Ymdyb3VwSWRdID0ge1xuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgc3RhcnQ6IGl0ZW0uZGF0YS5zdGFydCxcbiAgICAgICAgZW5kOiBpdGVtLmRhdGEuZW5kIHx8IGl0ZW0uZGF0YS5zdGFydCxcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGluZGV4OiB0aGlzLnN1Ymdyb3VwSW5kZXgsXG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgc3RhY2s6IHRoaXMuc3ViZ3JvdXBTdGFja0FsbCB8fCB0aGlzLnN1Ymdyb3VwU3RhY2tbc3ViZ3JvdXBJZF0gfHwgZmFsc2VcbiAgICAgIH07XG4gICAgICB0aGlzLnN1Ymdyb3VwSW5kZXgrKztcbiAgICB9XG5cblxuICAgIGlmIChuZXcgRGF0ZShpdGVtLmRhdGEuc3RhcnQpIDwgbmV3IERhdGUodGhpcy5zdWJncm91cHNbc3ViZ3JvdXBJZF0uc3RhcnQpKSB7XG4gICAgICB0aGlzLnN1Ymdyb3Vwc1tzdWJncm91cElkXS5zdGFydCA9IGl0ZW0uZGF0YS5zdGFydDtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtRW5kID0gaXRlbS5kYXRhLmVuZCB8fCBpdGVtLmRhdGEuc3RhcnQ7XG4gICAgaWYgKG5ldyBEYXRlKGl0ZW1FbmQpID4gbmV3IERhdGUodGhpcy5zdWJncm91cHNbc3ViZ3JvdXBJZF0uZW5kKSkge1xuICAgICAgdGhpcy5zdWJncm91cHNbc3ViZ3JvdXBJZF0uZW5kID0gaXRlbUVuZDtcbiAgICB9XG5cbiAgICB0aGlzLnN1Ymdyb3Vwc1tzdWJncm91cElkXS5pdGVtcy5wdXNoKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBzdWJncm91cCBzaXplc1xuICAgKi9cbiAgX3VwZGF0ZVN1Ymdyb3Vwc1NpemVzKCkge1xuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICBpZiAobWUuc3ViZ3JvdXBzKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1Ymdyb3VwIGluIG1lLnN1Ymdyb3Vwcykge1xuICAgICAgICBjb25zdCBpbml0aWFsRW5kID0gbWUuc3ViZ3JvdXBzW3N1Ymdyb3VwXS5pdGVtc1swXS5kYXRhLmVuZCB8fCBtZS5zdWJncm91cHNbc3ViZ3JvdXBdLml0ZW1zWzBdLmRhdGEuc3RhcnQ7XG4gICAgICAgIGxldCBuZXdTdGFydCA9IG1lLnN1Ymdyb3Vwc1tzdWJncm91cF0uaXRlbXNbMF0uZGF0YS5zdGFydDtcbiAgICAgICAgbGV0IG5ld0VuZCA9IGluaXRpYWxFbmQgLSAxO1xuXG4gICAgICAgIG1lLnN1Ymdyb3Vwc1tzdWJncm91cF0uaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBpZiAobmV3IERhdGUoaXRlbS5kYXRhLnN0YXJ0KSA8IG5ldyBEYXRlKG5ld1N0YXJ0KSkge1xuICAgICAgICAgICAgbmV3U3RhcnQgPSBpdGVtLmRhdGEuc3RhcnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXRlbUVuZCA9IGl0ZW0uZGF0YS5lbmQgfHwgaXRlbS5kYXRhLnN0YXJ0O1xuICAgICAgICAgIGlmIChuZXcgRGF0ZShpdGVtRW5kKSA+IG5ldyBEYXRlKG5ld0VuZCkpIHtcbiAgICAgICAgICAgIG5ld0VuZCA9IGl0ZW1FbmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBtZS5zdWJncm91cHNbc3ViZ3JvdXBdLnN0YXJ0ID0gbmV3U3RhcnQ7XG4gICAgICAgIG1lLnN1Ymdyb3Vwc1tzdWJncm91cF0uZW5kID0gbmV3IERhdGUobmV3RW5kIC0gMSk7IC8vIC0xIHRvIGNvbXBlbnNhdGUgZm9yIGNvbGxpZGluZyBlbmQgdG8gc3RhcnQgc3ViZ3JvdXBzO1xuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG9yZGVyIHN1Ymdyb3Vwc1xuICAgKi9cbiAgb3JkZXJTdWJncm91cHMoKSB7XG4gICAgaWYgKHRoaXMuc3ViZ3JvdXBPcmRlcmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNvcnRBcnJheSA9IFtdO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlciA9PSAnc3RyaW5nJykge1xuICAgICAgICBmb3IgKGNvbnN0IHN1Ymdyb3VwIGluIHRoaXMuc3ViZ3JvdXBzKSB7XG4gICAgICAgICAgc29ydEFycmF5LnB1c2goe3N1Ymdyb3VwLCBzb3J0RmllbGQ6IHRoaXMuc3ViZ3JvdXBzW3N1Ymdyb3VwXS5pdGVtc1swXS5kYXRhW3RoaXMuc3ViZ3JvdXBPcmRlcmVyXX0pO1xuICAgICAgICB9XG4gICAgICAgIHNvcnRBcnJheS5zb3J0KChhLCBiKSA9PiBhLnNvcnRGaWVsZCAtIGIuc29ydEZpZWxkKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiB0aGlzLnN1Ymdyb3VwT3JkZXJlciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZvciAoY29uc3Qgc3ViZ3JvdXAgaW4gdGhpcy5zdWJncm91cHMpIHtcbiAgICAgICAgICBzb3J0QXJyYXkucHVzaCh0aGlzLnN1Ymdyb3Vwc1tzdWJncm91cF0uaXRlbXNbMF0uZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgc29ydEFycmF5LnNvcnQodGhpcy5zdWJncm91cE9yZGVyZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc29ydEFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0QXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnN1Ymdyb3Vwc1tzb3J0QXJyYXlbaV0uc3ViZ3JvdXBdLmluZGV4ID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhZGQgaXRlbSB0byBzdWJncm91cFxuICAgKi9cbiAgX3Jlc2V0U3ViZ3JvdXBzKCkge1xuICAgIGZvciAoY29uc3Qgc3ViZ3JvdXAgaW4gdGhpcy5zdWJncm91cHMpIHtcbiAgICAgIGlmICh0aGlzLnN1Ymdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShzdWJncm91cCkpIHtcbiAgICAgICAgdGhpcy5zdWJncm91cHNbc3ViZ3JvdXBdLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdWJncm91cHNbc3ViZ3JvdXBdLmhlaWdodCA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBpdGVtIGZyb20gdGhlIGdyb3VwXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKi9cbiAgcmVtb3ZlKGl0ZW0pIHtcbiAgICBkZWxldGUgdGhpcy5pdGVtc1tpdGVtLmlkXTtcbiAgICBpdGVtLnNldFBhcmVudChudWxsKTtcbiAgICB0aGlzLnN0YWNrRGlydHkgPSB0cnVlO1xuXG4gICAgLy8gcmVtb3ZlIGZyb20gdmlzaWJsZSBpdGVtc1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy52aXNpYmxlSXRlbXMuaW5kZXhPZihpdGVtKTtcbiAgICBpZiAoaW5kZXggIT0gLTEpIHRoaXMudmlzaWJsZUl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICBpZihpdGVtLmRhdGEuc3ViZ3JvdXAgIT09IHVuZGVmaW5lZCl7XG4gICAgICB0aGlzLl9yZW1vdmVGcm9tU3ViZ3JvdXAoaXRlbSk7XG4gICAgICB0aGlzLm9yZGVyU3ViZ3JvdXBzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZSBpdGVtIGZyb20gc3ViZ3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1Ymdyb3VwSWRcbiAgICovXG4gIF9yZW1vdmVGcm9tU3ViZ3JvdXAoaXRlbSwgc3ViZ3JvdXBJZD1pdGVtLmRhdGEuc3ViZ3JvdXApIHtcbiAgICBpZiAoc3ViZ3JvdXBJZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN1Ymdyb3VwID0gdGhpcy5zdWJncm91cHNbc3ViZ3JvdXBJZF07XG4gICAgICBpZiAoc3ViZ3JvdXApe1xuICAgICAgICBjb25zdCBpdGVtSW5kZXggPSBzdWJncm91cC5pdGVtcy5pbmRleE9mKGl0ZW0pO1xuICAgICAgICAvLyAgQ2hlY2sgdGhlIGl0ZW0gaXMgYWN0dWFsbHkgaW4gdGhpcyBzdWJncm91cC4gSG93IHNob3VsZCBpdGVtcyBub3QgaW4gdGhlIGdyb3VwIGJlIGhhbmRsZWQ/XG4gICAgICAgIGlmIChpdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgIHN1Ymdyb3VwLml0ZW1zLnNwbGljZShpdGVtSW5kZXgsMSk7XG4gICAgICAgICAgaWYgKCFzdWJncm91cC5pdGVtcy5sZW5ndGgpe1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuc3ViZ3JvdXBzW3N1Ymdyb3VwSWRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVTdWJncm91cHNTaXplcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaXRlbSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIERhdGFTZXRcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqL1xuICByZW1vdmVGcm9tRGF0YVNldChpdGVtKSB7XG4gICAgdGhpcy5pdGVtU2V0LnJlbW92ZUl0ZW0oaXRlbS5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmVvcmRlciB0aGUgaXRlbXNcbiAgICovXG4gIG9yZGVyKCkge1xuICAgIGNvbnN0IGFycmF5ID0gdXRpbC50b0FycmF5KHRoaXMuaXRlbXMpO1xuICAgIGNvbnN0IHN0YXJ0QXJyYXkgPSBbXTtcbiAgICBjb25zdCBlbmRBcnJheSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGFycmF5W2ldLmRhdGEuZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kQXJyYXkucHVzaChhcnJheVtpXSk7XG4gICAgICB9XG4gICAgICBzdGFydEFycmF5LnB1c2goYXJyYXlbaV0pO1xuICAgIH1cbiAgICB0aGlzLm9yZGVyZWRJdGVtcyA9IHtcbiAgICAgIGJ5U3RhcnQ6IHN0YXJ0QXJyYXksXG4gICAgICBieUVuZDogZW5kQXJyYXlcbiAgICB9O1xuXG4gICAgb3JkZXJCeVN0YXJ0KHRoaXMub3JkZXJlZEl0ZW1zLmJ5U3RhcnQpO1xuICAgIG9yZGVyQnlFbmQodGhpcy5vcmRlcmVkSXRlbXMuYnlFbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmlzaWJsZSBpdGVtc1xuICAgKiBAcGFyYW0ge3tieVN0YXJ0OiBJdGVtW10sIGJ5RW5kOiBJdGVtW119fSBvcmRlcmVkSXRlbXMgICBBbGwgaXRlbXMgb3JkZXJlZCBieSBzdGFydCBkYXRlIGFuZCBieSBlbmQgZGF0ZVxuICAgKiBAcGFyYW0ge0l0ZW1bXX0gb2xkVmlzaWJsZUl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcHJldmlvdXNseSB2aXNpYmxlIGl0ZW1zLlxuICAgKiBAcGFyYW0ge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IHJhbmdlICAgICAgICAgICAgICBWaXNpYmxlIHJhbmdlXG4gICAqIEByZXR1cm4ge0l0ZW1bXX0gdmlzaWJsZUl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuZXcgdmlzaWJsZSBpdGVtcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVJdGVtc0luUmFuZ2Uob3JkZXJlZEl0ZW1zLCBvbGRWaXNpYmxlSXRlbXMsIHJhbmdlKSB7XG4gICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gW107XG4gICAgY29uc3QgdmlzaWJsZUl0ZW1zTG9va3VwID0ge307IC8vIHdlIGtlZXAgdGhpcyB0byBxdWlja2x5IGxvb2sgdXAgaWYgYW4gaXRlbSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCB3aXRob3V0IHVzaW5nIGluZGV4T2Ygb24gdmlzaWJsZUl0ZW1zXG5cbiAgICBpZiAoIXRoaXMuaXNWaXNpYmxlICYmIHRoaXMuZ3JvdXBJZCAhPSBSZXNlcnZlZEdyb3VwSWRzLkJBQ0tHUk9VTkQpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkVmlzaWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBpdGVtID0gb2xkVmlzaWJsZUl0ZW1zW2ldO1xuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ZWQpIGl0ZW0uaGlkZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZpc2libGVJdGVtcztcbiAgICB9IFxuXG4gICAgY29uc3QgaW50ZXJ2YWwgPSAocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQpIC8gNDtcbiAgICBjb25zdCBsb3dlckJvdW5kID0gcmFuZ2Uuc3RhcnQgLSBpbnRlcnZhbDtcbiAgICBjb25zdCB1cHBlckJvdW5kID0gcmFuZ2UuZW5kICsgaW50ZXJ2YWw7XG5cbiAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZG8gdGhlIGJpbmFyeSBzZWFyY2ggZm9yIGl0ZW1zIGhhdmluZyBzdGFydCBkYXRlIG9ubHkuXG4gICAgY29uc3Qgc3RhcnRTZWFyY2hGdW5jdGlvbiA9IHZhbHVlID0+IHtcbiAgICAgIGlmICAgICAgKHZhbHVlIDwgbG93ZXJCb3VuZCkgIHtyZXR1cm4gLTE7fVxuICAgICAgZWxzZSBpZiAodmFsdWUgPD0gdXBwZXJCb3VuZCkge3JldHVybiAgMDt9XG4gICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuICAxO31cbiAgICB9O1xuXG4gICAgLy8gdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRvIHRoZSBiaW5hcnkgc2VhcmNoIGZvciBpdGVtcyBoYXZpbmcgc3RhcnQgYW5kIGVuZCBkYXRlcyAocmFuZ2UpLlxuICAgIGNvbnN0IGVuZFNlYXJjaEZ1bmN0aW9uID0gZGF0YSA9PiB7XG4gICAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBkYXRhO1xuICAgICAgaWYgICAgICAoZW5kIDwgbG93ZXJCb3VuZCkgICAge3JldHVybiAtMTt9XG4gICAgICBlbHNlIGlmIChzdGFydCA8PSB1cHBlckJvdW5kKSB7cmV0dXJuICAwO31cbiAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gIDE7fVxuICAgIH07XG5cbiAgICAvLyBmaXJzdCBjaGVjayBpZiB0aGUgaXRlbXMgdGhhdCB3ZXJlIGluIHZpZXcgcHJldmlvdXNseSBhcmUgc3RpbGwgaW4gdmlldy5cbiAgICAvLyBJTVBPUlRBTlQ6IHRoaXMgaGFuZGxlcyB0aGUgY2FzZSBmb3IgdGhlIGl0ZW1zIHdpdGggc3RhcnRkYXRlIGJlZm9yZSB0aGUgd2luZG93IGFuZCBlbmRkYXRlIGFmdGVyIHRoZSB3aW5kb3chXG4gICAgLy8gYWxzbyBjbGVhbnMgdXAgaW52aXNpYmxlIGl0ZW1zLlxuICAgIGlmIChvbGRWaXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRWaXNpYmxlSXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKG9sZFZpc2libGVJdGVtc1tpXSwgdmlzaWJsZUl0ZW1zLCB2aXNpYmxlSXRlbXNMb29rdXAsIHJhbmdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB3ZSBkbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpdGVtcyB0aGF0IGhhdmUgb25seSBzdGFydCB2YWx1ZXMuXG4gICAgY29uc3QgaW5pdGlhbFBvc0J5U3RhcnQgPSB1dGlsLmJpbmFyeVNlYXJjaEN1c3RvbShvcmRlcmVkSXRlbXMuYnlTdGFydCwgc3RhcnRTZWFyY2hGdW5jdGlvbiwgJ2RhdGEnLCdzdGFydCcpO1xuXG4gICAgLy8gdHJhY2UgdGhlIHZpc2libGUgaXRlbXMgZnJvbSB0aGUgaW5pdGFsIHN0YXJ0IHBvcyBib3RoIHdheXMgdW50aWwgYW4gaW52aXNpYmxlIGl0ZW0gaXMgZm91bmQsIHdlIG9ubHkgbG9vayBhdCB0aGUgc3RhcnQgdmFsdWVzLlxuICAgIHRoaXMuX3RyYWNlVmlzaWJsZShpbml0aWFsUG9zQnlTdGFydCwgb3JkZXJlZEl0ZW1zLmJ5U3RhcnQsIHZpc2libGVJdGVtcywgdmlzaWJsZUl0ZW1zTG9va3VwLCBpdGVtID0+IGl0ZW0uZGF0YS5zdGFydCA8IGxvd2VyQm91bmQgfHwgaXRlbS5kYXRhLnN0YXJ0ID4gdXBwZXJCb3VuZCk7XG5cbiAgICAvLyBpZiB0aGUgd2luZG93IGhhcyBjaGFuZ2VkIHByb2dyYW1tYXRpY2FsbHkgd2l0aG91dCBvdmVybGFwcGluZyB0aGUgb2xkIHdpbmRvdywgdGhlIHJhbmdlZCBpdGVtcyB3aXRoIHN0YXJ0IDwgbG93ZXJCb3VuZCBhbmQgZW5kID4gdXBwZXJib3VuZCBhcmUgbm90IHNob3duLlxuICAgIC8vIFdlIHRoZXJlZm9yZSBoYXZlIHRvIGJydXRlIGZvcmNlIGNoZWNrIGFsbCBpdGVtcyBpbiB0aGUgYnlFbmQgbGlzdFxuICAgIGlmICh0aGlzLmNoZWNrUmFuZ2VkSXRlbXMgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGVja1JhbmdlZEl0ZW1zID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyZWRJdGVtcy5ieUVuZC5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9jaGVja0lmVmlzaWJsZVdpdGhSZWZlcmVuY2Uob3JkZXJlZEl0ZW1zLmJ5RW5kW2ldLCB2aXNpYmxlSXRlbXMsIHZpc2libGVJdGVtc0xvb2t1cCwgcmFuZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIHdlIGRvIGEgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGl0ZW1zIHRoYXQgaGF2ZSBkZWZpbmVkIGVuZCB0aW1lcy5cbiAgICAgIGNvbnN0IGluaXRpYWxQb3NCeUVuZCA9IHV0aWwuYmluYXJ5U2VhcmNoQ3VzdG9tKG9yZGVyZWRJdGVtcy5ieUVuZCwgZW5kU2VhcmNoRnVuY3Rpb24sICdkYXRhJyk7XG5cbiAgICAgIC8vIHRyYWNlIHRoZSB2aXNpYmxlIGl0ZW1zIGZyb20gdGhlIGluaXRhbCBzdGFydCBwb3MgYm90aCB3YXlzIHVudGlsIGFuIGludmlzaWJsZSBpdGVtIGlzIGZvdW5kLCB3ZSBvbmx5IGxvb2sgYXQgdGhlIGVuZCB2YWx1ZXMuXG4gICAgICB0aGlzLl90cmFjZVZpc2libGUoaW5pdGlhbFBvc0J5RW5kLCBvcmRlcmVkSXRlbXMuYnlFbmQsIHZpc2libGVJdGVtcywgdmlzaWJsZUl0ZW1zTG9va3VwLCBpdGVtID0+IGl0ZW0uZGF0YS5lbmQgPCBsb3dlckJvdW5kIHx8IGl0ZW0uZGF0YS5zdGFydCA+IHVwcGVyQm91bmQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZHJhd1F1ZXVlID0ge307XG4gICAgbGV0IHJlZHJhd1F1ZXVlTGVuZ3RoID0gMDtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpdGVtID0gdmlzaWJsZUl0ZW1zW2ldO1xuICAgICAgaWYgKCFpdGVtLmRpc3BsYXllZCkge1xuICAgICAgICBjb25zdCByZXR1cm5RdWV1ZSA9IHRydWU7XG4gICAgICAgIHJlZHJhd1F1ZXVlW2ldID0gaXRlbS5yZWRyYXcocmV0dXJuUXVldWUpO1xuICAgICAgICByZWRyYXdRdWV1ZUxlbmd0aCA9IHJlZHJhd1F1ZXVlW2ldLmxlbmd0aDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZWVkUmVkcmF3ID0gcmVkcmF3UXVldWVMZW5ndGggPiAwO1xuICAgIGlmIChuZWVkUmVkcmF3KSB7XG4gICAgICAvLyByZWRyYXcgYWxsIHJlZ3VsYXIgaXRlbXNcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkcmF3UXVldWVMZW5ndGg7IGorKykge1xuICAgICAgICB1dGlsLmZvckVhY2gocmVkcmF3UXVldWUsIGZucyA9PiB7XG4gICAgICAgICAgZm5zW2pdKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZUl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2aXNpYmxlSXRlbXNbaV0ucmVwb3NpdGlvblgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmlzaWJsZUl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIHRyYWNlIHZpc2libGUgaXRlbXMgaW4gZ3JvdXBcbiAgICogQHBhcmFtIHtudW1iZXJ9IGluaXRpYWxQb3NcbiAgICogQHBhcmFtIHthcnJheX0gaXRlbXNcbiAgICogQHBhcmFtIHthcmF5fSB2aXNpYmxlSXRlbXNcbiAgICogQHBhcmFtIHtvYmplY3R9IHZpc2libGVJdGVtc0xvb2t1cFxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBicmVha0NvbmRpdGlvblxuICAgKi9cbiAgX3RyYWNlVmlzaWJsZShpbml0aWFsUG9zLCBpdGVtcywgdmlzaWJsZUl0ZW1zLCB2aXNpYmxlSXRlbXNMb29rdXAsIGJyZWFrQ29uZGl0aW9uKSB7XG4gICAgaWYgKGluaXRpYWxQb3MgIT0gLTEpIHtcbiAgICAgIGZvciAobGV0IGkgPSBpbml0aWFsUG9zOyBpID49IDA7IGktLSkge1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoYnJlYWtDb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoIShpdGVtLmlzQ2x1c3RlciAgJiYgIWl0ZW0uaGFzSXRlbXMoKSkgJiYgIWl0ZW0uY2x1c3Rlcikge1xuICAgICAgICAgICAgaWYgKHZpc2libGVJdGVtc0xvb2t1cFtpdGVtLmlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHZpc2libGVJdGVtc0xvb2t1cFtpdGVtLmlkXSA9IHRydWU7XG4gICAgICAgICAgICAgIHZpc2libGVJdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBpID0gaW5pdGlhbFBvcyArIDE7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoYnJlYWtDb25kaXRpb24oaXRlbSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBpZiAoIShpdGVtLmlzQ2x1c3RlciAmJiAhaXRlbS5oYXNJdGVtcygpKSAmJiAhaXRlbS5jbHVzdGVyKSB7XG4gICAgICAgICAgICBpZiAodmlzaWJsZUl0ZW1zTG9va3VwW2l0ZW0uaWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgdmlzaWJsZUl0ZW1zTG9va3VwW2l0ZW0uaWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgdmlzaWJsZUl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBfY2hlY2tJZkludmlzaWJsZSgpIGJ1dCBpdCBkb2VzIG5vdFxuICAgKiByZXR1cm4gYm9vbGVhbnMsIGhpZGVzIHRoZSBpdGVtIGlmIGl0IHNob3VsZCBub3QgYmUgc2VlbiBhbmQgYWx3YXlzIGFkZHMgdG9cbiAgICogdGhlIHZpc2libGVJdGVtcy5cbiAgICogdGhpcyBvbmUgaXMgZm9yIGJydXRlIGZvcmNpbmcgYW5kIGhpZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7QXJyYXl9IHZpc2libGVJdGVtc1xuICAgKiBAcGFyYW0ge3tzdGFydDpudW1iZXIsIGVuZDpudW1iZXJ9fSByYW5nZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrSWZWaXNpYmxlKGl0ZW0sIHZpc2libGVJdGVtcywgcmFuZ2UpIHtcbiAgICAgIGlmIChpdGVtLmlzVmlzaWJsZShyYW5nZSkpIHtcbiAgICAgICAgaWYgKCFpdGVtLmRpc3BsYXllZCkgaXRlbS5zaG93KCk7XG4gICAgICAgIC8vIHJlcG9zaXRpb24gaXRlbSBob3Jpem9udGFsbHlcbiAgICAgICAgaXRlbS5yZXBvc2l0aW9uWCgpO1xuICAgICAgICB2aXNpYmxlSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ZWQpIGl0ZW0uaGlkZSgpO1xuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRoaXMgZnVuY3Rpb24gaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBfY2hlY2tJZkludmlzaWJsZSgpIGJ1dCBpdCBkb2VzIG5vdFxuICAgKiByZXR1cm4gYm9vbGVhbnMsIGhpZGVzIHRoZSBpdGVtIGlmIGl0IHNob3VsZCBub3QgYmUgc2VlbiBhbmQgYWx3YXlzIGFkZHMgdG9cbiAgICogdGhlIHZpc2libGVJdGVtcy5cbiAgICogdGhpcyBvbmUgaXMgZm9yIGJydXRlIGZvcmNpbmcgYW5kIGhpZGluZy5cbiAgICpcbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwYXJhbSB7QXJyYXkuPHRpbWVsaW5lLkl0ZW0+fSB2aXNpYmxlSXRlbXNcbiAgICogQHBhcmFtIHtPYmplY3Q8bnVtYmVyLCBib29sZWFuPn0gdmlzaWJsZUl0ZW1zTG9va3VwXG4gICAqIEBwYXJhbSB7e3N0YXJ0Om51bWJlciwgZW5kOm51bWJlcn19IHJhbmdlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKGl0ZW0sIHZpc2libGVJdGVtcywgdmlzaWJsZUl0ZW1zTG9va3VwLCByYW5nZSkge1xuICAgIGlmIChpdGVtLmlzVmlzaWJsZShyYW5nZSkpIHtcbiAgICAgIGlmICh2aXNpYmxlSXRlbXNMb29rdXBbaXRlbS5pZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2aXNpYmxlSXRlbXNMb29rdXBbaXRlbS5pZF0gPSB0cnVlO1xuICAgICAgICB2aXNpYmxlSXRlbXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoaXRlbS5kaXNwbGF5ZWQpIGl0ZW0uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZpc2libGUgaXRlbXNcbiAgICogQHBhcmFtIHthcnJheX0gb3JkZXJlZENsdXN0ZXJzIFxuICAgKiBAcGFyYW0ge2FycmF5fSBvbGRWaXNpYmxlQ2x1c3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAqIEBwYXJhbSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gcmFuZ2UgICAgICAgICAgICAgXG4gICAqIEByZXR1cm4ge0l0ZW1bXX0gdmlzaWJsZUl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZUNsdXN0ZXJzSW5SYW5nZShvcmRlcmVkQ2x1c3RlcnMsIG9sZFZpc2libGVDbHVzdGVycywgcmFuZ2UpIHtcbiAgICAvLyBDbHVzdGVycyBjYW4gb3ZlcmxhcCBlYWNoIG90aGVyIHNvIHdlIGNhbm5vdCB1c2UgYmluYXJ5IHNlYXJjaCBoZXJlXG4gICAgY29uc3QgdmlzaWJsZUNsdXN0ZXJzID0gW107XG4gICAgY29uc3QgdmlzaWJsZUNsdXN0ZXJzTG9va3VwID0ge307IC8vIHdlIGtlZXAgdGhpcyB0byBxdWlja2x5IGxvb2sgdXAgaWYgYW4gaXRlbSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdCB3aXRob3V0IHVzaW5nIGluZGV4T2Ygb24gdmlzaWJsZUl0ZW1zXG4gIFxuICAgIGlmIChvbGRWaXNpYmxlQ2x1c3RlcnMubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGRWaXNpYmxlQ2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKG9sZFZpc2libGVDbHVzdGVyc1tpXSwgdmlzaWJsZUNsdXN0ZXJzLCB2aXNpYmxlQ2x1c3RlcnNMb29rdXAsIHJhbmdlKTtcbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJlZENsdXN0ZXJzLmJ5U3RhcnQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2NoZWNrSWZWaXNpYmxlV2l0aFJlZmVyZW5jZShvcmRlcmVkQ2x1c3RlcnMuYnlTdGFydFtpXSwgdmlzaWJsZUNsdXN0ZXJzLCB2aXNpYmxlQ2x1c3RlcnNMb29rdXAsIHJhbmdlKTtcbiAgICB9XG4gIFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJlZENsdXN0ZXJzLmJ5RW5kLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9jaGVja0lmVmlzaWJsZVdpdGhSZWZlcmVuY2Uob3JkZXJlZENsdXN0ZXJzLmJ5RW5kW2ldLCB2aXNpYmxlQ2x1c3RlcnMsIHZpc2libGVDbHVzdGVyc0xvb2t1cCwgcmFuZ2UpO1xuICAgIH1cbiAgXG4gICAgY29uc3QgcmVkcmF3UXVldWUgPSB7fTtcbiAgICBsZXQgcmVkcmF3UXVldWVMZW5ndGggPSAwO1xuICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVDbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaXRlbSA9IHZpc2libGVDbHVzdGVyc1tpXTtcbiAgICAgIGlmICghaXRlbS5kaXNwbGF5ZWQpIHtcbiAgICAgICAgY29uc3QgcmV0dXJuUXVldWUgPSB0cnVlO1xuICAgICAgICByZWRyYXdRdWV1ZVtpXSA9IGl0ZW0ucmVkcmF3KHJldHVyblF1ZXVlKTtcbiAgICAgICAgcmVkcmF3UXVldWVMZW5ndGggPSByZWRyYXdRdWV1ZVtpXS5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBjb25zdCBuZWVkUmVkcmF3ID0gcmVkcmF3UXVldWVMZW5ndGggPiAwO1xuICAgIGlmIChuZWVkUmVkcmF3KSB7XG4gICAgICAvLyByZWRyYXcgYWxsIHJlZ3VsYXIgaXRlbXNcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVkcmF3UXVldWVMZW5ndGg7IGorKykge1xuICAgICAgICB1dGlsLmZvckVhY2gocmVkcmF3UXVldWUsIGZ1bmN0aW9uIChmbnMpIHtcbiAgICAgICAgICBmbnNbal0oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpc2libGVDbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmlzaWJsZUNsdXN0ZXJzW2ldLnJlcG9zaXRpb25YKCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB2aXNpYmxlQ2x1c3RlcnM7XG4gIH1cblxuICAvKipcbiAgICogY2hhbmdlIGl0ZW0gc3ViZ3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IGl0ZW1cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9sZFN1Ymdyb3VwXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdTdWJncm91cFxuICAgKi9cbiAgY2hhbmdlU3ViZ3JvdXAoaXRlbSwgb2xkU3ViZ3JvdXAsIG5ld1N1Ymdyb3VwKSB7XG4gICAgdGhpcy5fcmVtb3ZlRnJvbVN1Ymdyb3VwKGl0ZW0sIG9sZFN1Ymdyb3VwKTtcbiAgICB0aGlzLl9hZGRUb1N1Ymdyb3VwKGl0ZW0sIG5ld1N1Ymdyb3VwKTtcbiAgICB0aGlzLm9yZGVyU3ViZ3JvdXBzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgeW91IGxvc2UgdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMuXG4gICAqIEl0IHdpbGwgcmVtb3ZlIGxpc3RlbmVycyBldGMuXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuaGlkZSgpO1xuXG4gICAgbGV0IGRpc3Bvc2VDYWxsYmFjaztcbiAgICB3aGlsZSAoKGRpc3Bvc2VDYWxsYmFjayA9IHRoaXMuX2Rpc3Bvc2VDYWxsYmFja3MucG9wKCkpKSB7XG4gICAgICBkaXNwb3NlQ2FsbGJhY2soKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3IgQmFja2dyb3VuZEdyb3VwXG4gKiBAZXh0ZW5kcyBHcm91cFxuICovXG5jbGFzcyBCYWNrZ3JvdW5kR3JvdXAgZXh0ZW5kcyBHcm91cCB7XG4gIC8qKlxuICogQHBhcmFtIHtudW1iZXIgfCBzdHJpbmd9IGdyb3VwSWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKiBAcGFyYW0ge0l0ZW1TZXR9IGl0ZW1TZXRcbiAqL1xuICBjb25zdHJ1Y3Rvcihncm91cElkLCBkYXRhLCBpdGVtU2V0KSB7XG4gICAgc3VwZXIoZ3JvdXBJZCwgZGF0YSwgaXRlbVNldCk7XG4gICAgLy8gR3JvdXAuY2FsbCh0aGlzLCBncm91cElkLCBkYXRhLCBpdGVtU2V0KTtcblxuICAgIHRoaXMud2lkdGggPSAwO1xuICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICB0aGlzLnRvcCA9IDA7XG4gICAgdGhpcy5sZWZ0ID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaW50IHRoaXMgZ3JvdXBcbiAgICogQHBhcmFtIHt7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9fSByYW5nZVxuICAgKiBAcGFyYW0ge3tpdGVtOiB7aG9yaXpvbnRhbDogbnVtYmVyLCB2ZXJ0aWNhbDogbnVtYmVyfSwgYXhpczogbnVtYmVyfX0gbWFyZ2luXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlUmVzdGFjaz1mYWxzZV0gIEZvcmNlIHJlc3RhY2tpbmcgb2YgYWxsIGl0ZW1zXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JvdXAgaXMgcmVzaXplZFxuICAgKi9cbiAgcmVkcmF3KHJhbmdlLCBtYXJnaW4sIGZvcmNlUmVzdGFjaykgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHJlc2l6ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMudmlzaWJsZUl0ZW1zID0gdGhpcy5fdXBkYXRlSXRlbXNJblJhbmdlKHRoaXMub3JkZXJlZEl0ZW1zLCB0aGlzLnZpc2libGVJdGVtcywgcmFuZ2UpO1xuXG4gICAgLy8gY2FsY3VsYXRlIGFjdHVhbCBzaXplXG4gICAgdGhpcy53aWR0aCA9IHRoaXMuZG9tLmJhY2tncm91bmQub2Zmc2V0V2lkdGg7XG5cbiAgICAvLyBhcHBseSBuZXcgaGVpZ2h0IChqdXN0IGFsd2F5cyB6ZXJvIGZvciBCYWNrZ3JvdW5kR3JvdXBcbiAgICB0aGlzLmRvbS5iYWNrZ3JvdW5kLnN0eWxlLmhlaWdodCAgPSAnMCc7XG5cbiAgICAvLyB1cGRhdGUgdmVydGljYWwgcG9zaXRpb24gb2YgaXRlbXMgYWZ0ZXIgdGhleSBhcmUgcmUtc3RhY2tlZCBhbmQgdGhlIGhlaWdodCBvZiB0aGUgZ3JvdXAgaXMgY2FsY3VsYXRlZFxuICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IHRoaXMudmlzaWJsZUl0ZW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnZpc2libGVJdGVtc1tpXTtcbiAgICAgIGl0ZW0ucmVwb3NpdGlvblkobWFyZ2luKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzaXplZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoaXMgZ3JvdXA6IGF0dGFjaCB0byB0aGUgRE9NXG4gICAqL1xuICBzaG93KCkge1xuICAgIGlmICghdGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLml0ZW1TZXQuZG9tLmJhY2tncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYmFja2dyb3VuZCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogSXRlbVxuICovXG5jbGFzcyBJdGVtIHtcbiAgLyoqXG4gKiBAY29uc3RydWN0b3IgSXRlbVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgICAgICAgICAgICAgT2JqZWN0IGNvbnRhaW5pbmcgKG9wdGlvbmFsKSBwYXJhbWV0ZXJzIHR5cGUsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBjb250ZW50LCBncm91cCwgY2xhc3NOYW1lLlxuICogQHBhcmFtIHt7dG9TY3JlZW46IGZ1bmN0aW9uLCB0b1RpbWU6IGZ1bmN0aW9ufX0gY29udmVyc2lvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSB0aW1lIHRvIHNjcmVlbiBhbmQgdmljZSB2ZXJzYVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAgICAgICAgQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkZXNjcmliZSBhdmFpbGFibGUgb3B0aW9uc1xuICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIGNvbnZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICB0aGlzLmlkID0gbnVsbDtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLmRvbSA9IG51bGw7XG4gICAgdGhpcy5jb252ZXJzaW9uID0gY29udmVyc2lvbiB8fCB7fTtcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgbG9jYWxlcyxcbiAgICAgIGxvY2FsZTogJ2VuJ1xuICAgIH07XG4gICAgdGhpcy5vcHRpb25zID0gdXRpbC5leHRlbmQoe30sIHRoaXMuZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIHRoaXMub3B0aW9ucy5sb2NhbGVzID0gdXRpbC5leHRlbmQoe30sIGxvY2FsZXMsIHRoaXMub3B0aW9ucy5sb2NhbGVzKTtcbiAgICBjb25zdCBkZWZhdWx0TG9jYWxlcyA9IHRoaXMuZGVmYXVsdE9wdGlvbnMubG9jYWxlc1t0aGlzLmRlZmF1bHRPcHRpb25zLmxvY2FsZV07XG4gICAgT2JqZWN0LmtleXModGhpcy5vcHRpb25zLmxvY2FsZXMpLmZvckVhY2gobG9jYWxlID0+IHtcbiAgICAgIHRoaXMub3B0aW9ucy5sb2NhbGVzW2xvY2FsZV0gPSB1dGlsLmV4dGVuZChcbiAgICAgICAge30sXG4gICAgICAgIGRlZmF1bHRMb2NhbGVzLFxuICAgICAgICB0aGlzLm9wdGlvbnMubG9jYWxlc1tsb2NhbGVdXG4gICAgICApO1xuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpc3BsYXllZCA9IGZhbHNlO1xuICAgIHRoaXMuZ3JvdXBTaG93aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGFibGUgPSAob3B0aW9ucyAmJiBvcHRpb25zLnNlbGVjdGFibGUpIHx8IGZhbHNlO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuXG4gICAgdGhpcy50b3AgPSBudWxsO1xuICAgIHRoaXMucmlnaHQgPSBudWxsO1xuICAgIHRoaXMubGVmdCA9IG51bGw7XG4gICAgdGhpcy53aWR0aCA9IG51bGw7XG4gICAgdGhpcy5oZWlnaHQgPSBudWxsO1xuXG4gICAgdGhpcy5zZXRTZWxlY3RhYmlsaXR5KGRhdGEpO1xuXG4gICAgdGhpcy5lZGl0YWJsZSA9IG51bGw7XG4gICAgdGhpcy5fdXBkYXRlRWRpdFN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBjdXJyZW50IGl0ZW1cbiAgICovXG4gIHNlbGVjdCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuZGlzcGxheWVkKSB0aGlzLnJlZHJhdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnNlbGVjdCBjdXJyZW50IGl0ZW1cbiAgICovXG4gIHVuc2VsZWN0KCkge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWQpIHRoaXMucmVkcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGRhdGEgZm9yIHRoZSBpdGVtLiBFeGlzdGluZyBkYXRhIHdpbGwgYmUgdXBkYXRlZC4gVGhlIGlkIHNob3VsZCBub3RcbiAgICogYmUgY2hhbmdlZC4gV2hlbiB0aGUgaXRlbSBpcyBkaXNwbGF5ZWQsIGl0IHdpbGwgYmUgcmVkcmF3biBpbW1lZGlhdGVseS5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICovXG4gIHNldERhdGEoZGF0YSkge1xuICAgIGNvbnN0IGdyb3VwQ2hhbmdlZCA9IGRhdGEuZ3JvdXAgIT0gdW5kZWZpbmVkICYmIHRoaXMuZGF0YS5ncm91cCAhPSBkYXRhLmdyb3VwO1xuICAgIGlmIChncm91cENoYW5nZWQgJiYgdGhpcy5wYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5wYXJlbnQuaXRlbVNldC5fbW92ZVRvR3JvdXAodGhpcywgZGF0YS5ncm91cCk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZWxlY3RhYmlsaXR5KGRhdGEpO1xuXG4gICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICB0aGlzLnBhcmVudC5zdGFja0RpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gICAgXG4gICAgY29uc3Qgc3ViR3JvdXBDaGFuZ2VkID0gZGF0YS5zdWJncm91cCAhPSB1bmRlZmluZWQgJiYgdGhpcy5kYXRhLnN1Ymdyb3VwICE9IGRhdGEuc3ViZ3JvdXA7XG4gICAgaWYgKHN1Ykdyb3VwQ2hhbmdlZCAmJiB0aGlzLnBhcmVudCAhPSBudWxsKSB7XG4gICAgICB0aGlzLnBhcmVudC5jaGFuZ2VTdWJncm91cCh0aGlzLCB0aGlzLmRhdGEuc3ViZ3JvdXAsIGRhdGEuc3ViZ3JvdXApO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5fdXBkYXRlRWRpdFN0YXR1cygpO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIGlmICh0aGlzLmRpc3BsYXllZCkgdGhpcy5yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgd2hldGhlciB0aGUgaXRlbSBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIENhbiBvbmx5IGJlIHNldC91bnNldCBpZiB0aGUgdGltZWxpbmUncyBgc2VsZWN0YWJsZWAgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgYHRydWVgLlxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSBgZGF0YWAgZnJvbSBgY29uc3RydWN0b3JgIGFuZCBgc2V0RGF0YWBcbiAgICovXG4gIHNldFNlbGVjdGFiaWxpdHkoZGF0YSkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLnNlbGVjdGFibGUgPSB0eXBlb2YgZGF0YS5zZWxlY3RhYmxlID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBCb29sZWFuKGRhdGEuc2VsZWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIHBhcmVudCBmb3IgdGhlIGl0ZW1cbiAgICogQHBhcmFtIHtHcm91cH0gcGFyZW50XG4gICAqL1xuICBzZXRQYXJlbnQocGFyZW50KSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWVkKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXRlbSBpcyB2aXNpYmxlIGluc2lkZSBnaXZlbiByYW5nZVxuICAgKiBAcGFyYW0ge3RpbWVsaW5lLlJhbmdlfSByYW5nZSB3aXRoIGEgdGltZXN0YW1wIGZvciBzdGFydCBhbmQgZW5kXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZpc2libGVcbiAgICovXG4gIGlzVmlzaWJsZShyYW5nZSkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBJdGVtIGluIHRoZSBET00gKHdoZW4gbm90IGFscmVhZHkgdmlzaWJsZSlcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gY2hhbmdlZFxuICAgKi9cbiAgc2hvdygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgSXRlbSBmcm9tIHRoZSBET00gKHdoZW4gdmlzaWJsZSlcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gY2hhbmdlZFxuICAgKi9cbiAgaGlkZSgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVwYWludCB0aGUgaXRlbVxuICAgKi9cbiAgcmVkcmF3KCkge1xuICAgIC8vIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgaXRlbVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9zaXRpb24gdGhlIEl0ZW0gaG9yaXpvbnRhbGx5XG4gICAqL1xuICByZXBvc2l0aW9uWCgpIHtcbiAgICAvLyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGl0ZW1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvc2l0aW9uIHRoZSBJdGVtIHZlcnRpY2FsbHlcbiAgICovXG4gIHJlcG9zaXRpb25ZKCkge1xuICAgIC8vIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgaXRlbVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgYSBkcmFnIGFyZWEgb24gdGhlIGNlbnRlciBvZiB0aGUgaXRlbSB3aGVuIHRoZSBpdGVtIGlzIHNlbGVjdGVkXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBhaW50RHJhZ0NlbnRlcigpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCAmJiB0aGlzLmVkaXRhYmxlLnVwZGF0ZVRpbWUgJiYgIXRoaXMuZG9tLmRyYWdDZW50ZXIpIHtcbiAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgIC8vIGNyZWF0ZSBhbmQgc2hvdyBkcmFnIGFyZWFcbiAgICAgIGNvbnN0IGRyYWdDZW50ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRyYWdDZW50ZXIuY2xhc3NOYW1lID0gJ3Zpcy1kcmFnLWNlbnRlcic7XG4gICAgICBkcmFnQ2VudGVyLmRyYWdDZW50ZXJJdGVtID0gdGhpcztcbiAgICAgIHRoaXMuaGFtbWVyRHJhZ0NlbnRlciA9IG5ldyBIYW1tZXIoZHJhZ0NlbnRlcik7XG5cbiAgICAgIHRoaXMuaGFtbWVyRHJhZ0NlbnRlci5vbigndGFwJywgZXZlbnQgPT4ge1xuICAgICAgICBtZS5wYXJlbnQuaXRlbVNldC5ib2R5LmVtaXR0ZXIuZW1pdCgnY2xpY2snLCAge1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIGl0ZW06IG1lLmlkXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmhhbW1lckRyYWdDZW50ZXIub24oJ2RvdWJsZXRhcCcsIGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG1lLnBhcmVudC5pdGVtU2V0Ll9vblVwZGF0ZUl0ZW0obWUpO1xuICAgICAgICBtZS5wYXJlbnQuaXRlbVNldC5ib2R5LmVtaXR0ZXIuZW1pdCgnZG91YmxlQ2xpY2snLCB7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgaXRlbTogbWUuaWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGFtbWVyRHJhZ0NlbnRlci5vbigncGFuc3RhcnQnLCBldmVudCA9PiB7XG4gICAgICAgIC8vIGRvIG5vdCBhbGxvdyB0aGlzIGV2ZW50IHRvIHByb3BhZ2F0ZSB0byB0aGUgUmFuZ2VcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIG1lLnBhcmVudC5pdGVtU2V0Ll9vbkRyYWdTdGFydChldmVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaGFtbWVyRHJhZ0NlbnRlci5vbigncGFubW92ZScsICBtZS5wYXJlbnQuaXRlbVNldC5fb25EcmFnLmJpbmQobWUucGFyZW50Lml0ZW1TZXQpKTtcbiAgICAgIHRoaXMuaGFtbWVyRHJhZ0NlbnRlci5vbigncGFuZW5kJywgICBtZS5wYXJlbnQuaXRlbVNldC5fb25EcmFnRW5kLmJpbmQobWUucGFyZW50Lml0ZW1TZXQpKTtcblxuICAgICAgaWYgKHRoaXMuZG9tLmJveCkge1xuICAgICAgICBpZiAodGhpcy5kb20uZHJhZ0xlZnQpIHtcbiAgICAgICAgICB0aGlzLmRvbS5ib3guaW5zZXJ0QmVmb3JlKGRyYWdDZW50ZXIsIHRoaXMuZG9tLmRyYWdMZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQoZHJhZ0NlbnRlcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRoaXMuZG9tLnBvaW50KSB7XG4gICAgICAgIHRoaXMuZG9tLnBvaW50LmFwcGVuZENoaWxkKGRyYWdDZW50ZXIpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmRvbS5kcmFnQ2VudGVyID0gZHJhZ0NlbnRlcjtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5kb20uZHJhZ0NlbnRlcikge1xuICAgICAgLy8gZGVsZXRlIGRyYWcgYXJlYVxuICAgICAgaWYgKHRoaXMuZG9tLmRyYWdDZW50ZXIucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmRvbS5kcmFnQ2VudGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZHJhZ0NlbnRlcik7XG4gICAgICB9XG4gICAgICB0aGlzLmRvbS5kcmFnQ2VudGVyID0gbnVsbDtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuaGFtbWVyRHJhZ0NlbnRlcikge1xuICAgICAgICB0aGlzLmhhbW1lckRyYWdDZW50ZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmhhbW1lckRyYWdDZW50ZXIgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaW50IGEgZGVsZXRlIGJ1dHRvbiBvbiB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBpdGVtIHdoZW4gdGhlIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYW5jaG9yXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBhaW50RGVsZXRlQnV0dG9uKGFuY2hvcikge1xuICAgIGNvbnN0IGVkaXRhYmxlID0gKCh0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyB8fCB0aGlzLmVkaXRhYmxlID09IG51bGwpICYmIHRoaXMub3B0aW9ucy5lZGl0YWJsZS5yZW1vdmUpIHx8XG4gICAgICAgICAgICAgICAgICAgKCF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyAmJiB0aGlzLmVkaXRhYmxlICE9IG51bGwgJiYgdGhpcy5lZGl0YWJsZS5yZW1vdmUpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWQgJiYgZWRpdGFibGUgJiYgIXRoaXMuZG9tLmRlbGV0ZUJ1dHRvbikge1xuICAgICAgLy8gY3JlYXRlIGFuZCBzaG93IGJ1dHRvblxuICAgICAgY29uc3QgbWUgPSB0aGlzO1xuXG4gICAgICBjb25zdCBkZWxldGVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgZGVsZXRlQnV0dG9uLmNsYXNzTmFtZSA9ICd2aXMtZGVsZXRlLXJ0bCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGVCdXR0b24uY2xhc3NOYW1lID0gJ3Zpcy1kZWxldGUnO1xuICAgICAgfVxuICAgICAgbGV0IG9wdGlvbnNMb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXTtcbiAgICAgIGlmICghb3B0aW9uc0xvY2FsZSkge1xuICAgICAgICBpZiAoIXRoaXMud2FybmVkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJyR7dGhpcy5vcHRpb25zLmxvY2FsZX0nXSBub3QgZm91bmQuIFNlZSBodHRwczovL3Zpc2pzLmdpdGh1Yi5pby92aXMtdGltZWxpbmUvZG9jcy90aW1lbGluZS8jTG9jYWxpemF0aW9uYCk7XG4gICAgICAgICAgdGhpcy53YXJuZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnNMb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlc1snZW4nXTsgLy8gZmFsbCBiYWNrIG9uIGVuZ2xpc2ggd2hlbiBub3QgYXZhaWxhYmxlXG4gICAgICB9XG4gICAgICBkZWxldGVCdXR0b24udGl0bGUgPSBvcHRpb25zTG9jYWxlLmRlbGV0ZVNlbGVjdGVkO1xuXG4gICAgICAvLyBUT0RPOiBiZSBhYmxlIHRvIGRlc3Ryb3kgdGhlIGRlbGV0ZSBidXR0b25cbiAgICAgIHRoaXMuaGFtbWVyRGVsZXRlQnV0dG9uID0gbmV3IEhhbW1lcihkZWxldGVCdXR0b24pLm9uKCd0YXAnLCBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBtZS5wYXJlbnQucmVtb3ZlRnJvbURhdGFTZXQobWUpO1xuICAgICAgfSk7XG5cbiAgICAgIGFuY2hvci5hcHBlbmRDaGlsZChkZWxldGVCdXR0b24pO1xuICAgICAgdGhpcy5kb20uZGVsZXRlQnV0dG9uID0gZGVsZXRlQnV0dG9uO1xuICAgIH1cbiAgICBlbHNlIGlmICghdGhpcy5zZWxlY3RlZCAmJiB0aGlzLmRvbS5kZWxldGVCdXR0b24pIHtcbiAgICAgIC8vIHJlbW92ZSBidXR0b25cbiAgICAgIGlmICh0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kZWxldGVCdXR0b24pO1xuICAgICAgfVxuICAgICAgdGhpcy5kb20uZGVsZXRlQnV0dG9uID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuaGFtbWVyRGVsZXRlQnV0dG9uKSB7XG4gICAgICAgIHRoaXMuaGFtbWVyRGVsZXRlQnV0dG9uLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5oYW1tZXJEZWxldGVCdXR0b24gPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaW50IGEgb25DaGFuZ2UgdG9vbHRpcCBvbiB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBpdGVtIHdoZW4gdGhlIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gYW5jaG9yXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBhaW50T25JdGVtVXBkYXRlVGltZVRvb2x0aXAoYW5jaG9yKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUpIHJldHVybjtcblxuICAgIGNvbnN0IGVkaXRhYmxlID0gKHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lIHx8IFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZWRpdGFibGUgPT09IHRydWUpICYmXG4gICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVkaXRhYmxlICE9PSBmYWxzZTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkICYmIGVkaXRhYmxlICYmICF0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCkge1xuICAgICAgY29uc3Qgb25JdGVtVXBkYXRlVGltZVRvb2x0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgb25JdGVtVXBkYXRlVGltZVRvb2x0aXAuY2xhc3NOYW1lID0gJ3Zpcy1vblVwZGF0ZVRpbWUtdG9vbHRpcCc7XG4gICAgICBhbmNob3IuYXBwZW5kQ2hpbGQob25JdGVtVXBkYXRlVGltZVRvb2x0aXApO1xuICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAgPSBvbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcDtcblxuICAgIH0gZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApIHtcbiAgICAgIC8vIHJlbW92ZSBidXR0b25cbiAgICAgIGlmICh0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5wYXJlbnROb2RlKSB7XG4gICAgICAgIHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApO1xuICAgICAgfVxuICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIHBvc2l0aW9uIG9uQ2hhbmdlIHRvb2x0aXBcbiAgICBpZiAodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXApIHtcblxuICAgICAgLy8gb25seSBzaG93IHdoZW4gZWRpdGluZ1xuICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudmlzaWJpbGl0eSA9IHRoaXMucGFyZW50Lml0ZW1TZXQudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcgPyAndmlzaWJsZScgOiAnaGlkZGVuJztcbiAgICAgIFxuICAgICAgLy8gcG9zaXRpb24gcmVsYXRpdmUgdG8gaXRlbSdzIGNvbnRlbnRcbiAgICAgIHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICAgIHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmxlZnQgPSAnNTAlJztcblxuICAgICAgLy8gcG9zaXRpb24gYWJvdmUgb3IgYmVsb3cgdGhlIGl0ZW0gZGVwZW5kaW5nIG9uIHRoZSBpdGVtJ3MgcG9zaXRpb24gaW4gdGhlIHdpbmRvd1xuICAgICAgY29uc3QgdG9vbHRpcE9mZnNldCA9IDUwOyAvLyBUT0RPOiBzaG91bGQgYmUgdG9vbHRpcCBoZWlnaHQgKGRlcGVuZHMgb24gdGVtcGxhdGUpXG4gICAgICBjb25zdCBzY3JvbGxUb3AgPSB0aGlzLnBhcmVudC5pdGVtU2V0LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wO1xuXG4gICAgICAgIC8vIFRPRE86IHRoaXMudG9wIGZvciBvcmllbnRhdGlvbjp0cnVlIGlzIGFjdHVhbGx5IHRoZSBpdGVtcyBkaXN0YW5jZSBmcm9tIHRoZSBib3R0b20uLi4gXG4gICAgICAgIC8vIChzaG91bGQgYmUgdGhpcy5ib3R0b20pXG4gICAgICBsZXQgaXRlbURpc3RhbmNlRnJvbVRvcDsgXG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0gPT0gJ3RvcCcpIHtcbiAgICAgICAgaXRlbURpc3RhbmNlRnJvbVRvcCA9IHRoaXMudG9wO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXRlbURpc3RhbmNlRnJvbVRvcCA9ICh0aGlzLnBhcmVudC5oZWlnaHQgLSB0aGlzLnRvcCAtIHRoaXMuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzQ2xvc2VUb1RvcCA9IGl0ZW1EaXN0YW5jZUZyb21Ub3AgKyB0aGlzLnBhcmVudC50b3AgLSB0b29sdGlwT2Zmc2V0IDwgLXNjcm9sbFRvcDtcblxuICAgICAgaWYgKGlzQ2xvc2VUb1RvcCkge1xuICAgICAgICB0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS5ib3R0b20gPSBcIlwiO1xuICAgICAgICB0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS50b3AgPSBgJHt0aGlzLmhlaWdodCArIDJ9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wID0gXCJcIjtcbiAgICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUuYm90dG9tID0gYCR7dGhpcy5oZWlnaHQgKyAyfXB4YDtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gaGFuZGxlIHRvb2x0aXAgY29udGVudFxuICAgICAgbGV0IGNvbnRlbnQ7XG4gICAgICBsZXQgdGVtcGxhdGVGdW5jdGlvbjtcblxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZSAmJiB0aGlzLm9wdGlvbnMudG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUudGVtcGxhdGUpIHtcbiAgICAgICAgdGVtcGxhdGVGdW5jdGlvbiA9IHRoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZS50ZW1wbGF0ZS5iaW5kKHRoaXMpO1xuICAgICAgICBjb250ZW50ID0gdGVtcGxhdGVGdW5jdGlvbih0aGlzLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudCA9IGBzdGFydDogJHttb21lbnQodGhpcy5kYXRhLnN0YXJ0KS5mb3JtYXQoJ01NL0REL1lZWVkgaGg6bW0nKX1gO1xuICAgICAgICBpZiAodGhpcy5kYXRhLmVuZCkgeyBcbiAgICAgICAgICBjb250ZW50ICs9IGA8YnI+IGVuZDogJHttb21lbnQodGhpcy5kYXRhLmVuZCkuZm9ybWF0KCdNTS9ERC9ZWVlZIGhoOm1tJyl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuaW5uZXJIVE1MID0gdXRpbC54c3MoY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgKiBnZXQgaXRlbSBkYXRhXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRJdGVtRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQuaXRlbVNldC5pdGVtc0RhdGEuZ2V0KHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRzIGZvciB0aGUgaXRlbVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgICBIVE1MIGVsZW1lbnQgdG8gZmlsbCB3aXRoIHRoZSBjb250ZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZUNvbnRlbnRzKGVsZW1lbnQpIHtcbiAgICBsZXQgY29udGVudDtcbiAgICBsZXQgY2hhbmdlZDtcbiAgICBsZXQgdGVtcGxhdGVGdW5jdGlvbjtcbiAgICBsZXQgaXRlbVZpc2libGVGcmFtZUNvbnRlbnQ7XG4gICAgbGV0IHZpc2libGVGcmFtZVRlbXBsYXRlRnVuY3Rpb247IFxuICAgIGNvbnN0IGl0ZW1EYXRhID0gdGhpcy5fZ2V0SXRlbURhdGEoKTsgLy8gZ2V0IGEgY2xvbmUgb2YgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXNldFxuXG4gICAgY29uc3QgZnJhbWVFbGVtZW50ID0gdGhpcy5kb20uYm94IHx8IHRoaXMuZG9tLnBvaW50O1xuICAgIGNvbnN0IGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50RWxlbWVudCA9IGZyYW1lRWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd2aXMtaXRlbS12aXNpYmxlLWZyYW1lJylbMF07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnZpc2libGVGcmFtZVRlbXBsYXRlKSB7XG4gICAgICB2aXNpYmxlRnJhbWVUZW1wbGF0ZUZ1bmN0aW9uID0gdGhpcy5vcHRpb25zLnZpc2libGVGcmFtZVRlbXBsYXRlLmJpbmQodGhpcyk7XG4gICAgICBpdGVtVmlzaWJsZUZyYW1lQ29udGVudCA9IHV0aWwueHNzKHZpc2libGVGcmFtZVRlbXBsYXRlRnVuY3Rpb24oaXRlbURhdGEsIGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50RWxlbWVudCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtVmlzaWJsZUZyYW1lQ29udGVudCA9ICcnO1xuICAgIH1cbiAgICBcbiAgICBpZiAoaXRlbVZpc2libGVGcmFtZUNvbnRlbnRFbGVtZW50KSB7XG4gICAgICBpZiAoKGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50IGluc3RhbmNlb2YgT2JqZWN0KSAmJiAhKGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHtcbiAgICAgICAgdmlzaWJsZUZyYW1lVGVtcGxhdGVGdW5jdGlvbihpdGVtRGF0YSwgaXRlbVZpc2libGVGcmFtZUNvbnRlbnRFbGVtZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICBjaGFuZ2VkID0gdGhpcy5fY29udGVudFRvU3RyaW5nKHRoaXMuaXRlbVZpc2libGVGcmFtZUNvbnRlbnQpICE9PSB0aGlzLl9jb250ZW50VG9TdHJpbmcoaXRlbVZpc2libGVGcmFtZUNvbnRlbnQpO1xuICAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICAvLyBvbmx5IHJlcGxhY2UgdGhlIGNvbnRlbnQgd2hlbiBjaGFuZ2VkXG4gICAgICAgICAgaWYgKGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICAgICAgaXRlbVZpc2libGVGcmFtZUNvbnRlbnRFbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgaXRlbVZpc2libGVGcmFtZUNvbnRlbnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXRlbVZpc2libGVGcmFtZUNvbnRlbnQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpdGVtVmlzaWJsZUZyYW1lQ29udGVudEVsZW1lbnQuaW5uZXJIVE1MID0gdXRpbC54c3MoaXRlbVZpc2libGVGcmFtZUNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghKHRoaXMuZGF0YS50eXBlID09ICdiYWNrZ3JvdW5kJyAmJiB0aGlzLmRhdGEuY29udGVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwiY29udGVudFwiIG1pc3NpbmcgaW4gaXRlbSAke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5pdGVtVmlzaWJsZUZyYW1lQ29udGVudCA9IGl0ZW1WaXNpYmxlRnJhbWVDb250ZW50O1xuICAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICAgIHRlbXBsYXRlRnVuY3Rpb24gPSB0aGlzLm9wdGlvbnMudGVtcGxhdGUuYmluZCh0aGlzKTtcbiAgICAgIGNvbnRlbnQgPSB0ZW1wbGF0ZUZ1bmN0aW9uKGl0ZW1EYXRhLCBlbGVtZW50LCB0aGlzLmRhdGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250ZW50ID0gdGhpcy5kYXRhLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKChjb250ZW50IGluc3RhbmNlb2YgT2JqZWN0KSAmJiAhKGNvbnRlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgdGVtcGxhdGVGdW5jdGlvbihpdGVtRGF0YSwgZWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWQgPSB0aGlzLl9jb250ZW50VG9TdHJpbmcodGhpcy5jb250ZW50KSAhPT0gdGhpcy5fY29udGVudFRvU3RyaW5nKGNvbnRlbnQpO1xuICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgLy8gb25seSByZXBsYWNlIHRoZSBjb250ZW50IHdoZW4gY2hhbmdlZFxuICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29udGVudCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHV0aWwueHNzKGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmICghKHRoaXMuZGF0YS50eXBlID09ICdiYWNrZ3JvdW5kJyAmJiB0aGlzLmRhdGEuY29udGVudCA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSBcImNvbnRlbnRcIiBtaXNzaW5nIGluIGl0ZW0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGRhdGFBdHRyaWJ1dGVzIHRpbWVsaW5lIG9wdGlvbiBhbmQgc2V0IGFzIGRhdGEtIGF0dHJpYnV0ZXMgb24gZG9tLmNvbnRlbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50ICAgSFRNTCBlbGVtZW50IHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgYXR0YWNoZWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVEYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICBpZiAodGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzICYmIHRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgIGxldCBhdHRyaWJ1dGVzID0gW107XG5cbiAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzKSkge1xuICAgICAgIGF0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXM7XG4gICAgIH1cbiAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzID09ICdhbGwnKSB7XG4gICAgICAgYXR0cmlidXRlcyA9IE9iamVjdC5rZXlzKHRoaXMuZGF0YSk7XG4gICAgIH1cbiAgICAgZWxzZSB7XG4gICAgICAgcmV0dXJuO1xuICAgICB9XG5cbiAgICAgZm9yIChjb25zdCBuYW1lIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGF0YVtuYW1lXTtcblxuICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShgZGF0YS0ke25hbWV9YCwgdmFsdWUpO1xuICAgICAgIH1cbiAgICAgICBlbHNlIHtcbiAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGBkYXRhLSR7bmFtZX1gKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cbiB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjdXN0b20gc3R5bGVzIG9mIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVN0eWxlKGVsZW1lbnQpIHtcbiAgICAvLyByZW1vdmUgb2xkIHN0eWxlc1xuICAgIGlmICh0aGlzLnN0eWxlKSB7XG4gICAgICB1dGlsLnJlbW92ZUNzc1RleHQoZWxlbWVudCwgdGhpcy5zdHlsZSk7XG4gICAgICB0aGlzLnN0eWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBhcHBlbmQgbmV3IHN0eWxlc1xuICAgIGlmICh0aGlzLmRhdGEuc3R5bGUpIHtcbiAgICAgIHV0aWwuYWRkQ3NzVGV4dChlbGVtZW50LCB0aGlzLmRhdGEuc3R5bGUpO1xuICAgICAgdGhpcy5zdHlsZSA9IHRoaXMuZGF0YS5zdHlsZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RyaW5naWZ5IHRoZSBpdGVtcyBjb250ZW50c1xuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnQgfCB1bmRlZmluZWR9IGNvbnRlbnRcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jb250ZW50VG9TdHJpbmcoY29udGVudCkge1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHJldHVybiBjb250ZW50O1xuICAgIGlmIChjb250ZW50ICYmICdvdXRlckhUTUwnIGluIGNvbnRlbnQpIHJldHVybiBjb250ZW50Lm91dGVySFRNTDtcbiAgICByZXR1cm4gY29udGVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGVkaXRhYmlsaXR5IG9mIHRoaXMgaXRlbS5cbiAgICovXG4gIF91cGRhdGVFZGl0U3RhdHVzKCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMpIHtcbiAgICAgIGlmKHR5cGVvZiB0aGlzLm9wdGlvbnMuZWRpdGFibGUgPT09ICdib29sZWFuJykge1xuICAgICAgICB0aGlzLmVkaXRhYmxlID0ge1xuICAgICAgICAgIHVwZGF0ZVRpbWU6IHRoaXMub3B0aW9ucy5lZGl0YWJsZSxcbiAgICAgICAgICB1cGRhdGVHcm91cDogdGhpcy5vcHRpb25zLmVkaXRhYmxlLFxuICAgICAgICAgIHJlbW92ZTogdGhpcy5vcHRpb25zLmVkaXRhYmxlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYodHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aGlzLmVkaXRhYmxlID0ge307XG4gICAgICAgICAgdXRpbC5zZWxlY3RpdmVFeHRlbmQoWyd1cGRhdGVUaW1lJywgJ3VwZGF0ZUdyb3VwJywgJ3JlbW92ZSddLCB0aGlzLmVkaXRhYmxlLCB0aGlzLm9wdGlvbnMuZWRpdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJdGVtIGRhdGEgb3ZlcnJpZGVzLCBleGNlcHQgaWYgb3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zIGlzIHNldC5cbiAgICBpZiAoIXRoaXMub3B0aW9ucyB8fCAhKHRoaXMub3B0aW9ucy5lZGl0YWJsZSkgfHwgKHRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zICE9PSB0cnVlKSkge1xuICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGF0YS5lZGl0YWJsZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhpcy5lZGl0YWJsZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZVRpbWU6IHRoaXMuZGF0YS5lZGl0YWJsZSxcbiAgICAgICAgICAgIHVwZGF0ZUdyb3VwOiB0aGlzLmRhdGEuZWRpdGFibGUsXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGF0YS5lZGl0YWJsZVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZGF0YS5lZGl0YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvLyBUT0RPOiBpbiB0aW1lbGluZS5qcyA1LjAsIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyB0byBub3QgcmVzZXQgb3B0aW9ucyBmcm9tIHRoZSB0aW1lbGluZSBjb25maWd1cmF0aW9uLlxuICAgICAgICAgIC8vIEJhc2ljYWxseSBqdXN0IHJlbW92ZSB0aGUgbmV4dCBsaW5lLi4uXG4gICAgICAgICAgdGhpcy5lZGl0YWJsZSA9IHt9O1xuICAgICAgICAgIHV0aWwuc2VsZWN0aXZlRXh0ZW5kKFsndXBkYXRlVGltZScsICd1cGRhdGVHcm91cCcsICdyZW1vdmUnXSwgdGhpcy5lZGl0YWJsZSwgdGhpcy5kYXRhLmVkaXRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpdGVtIGxlZnQgZnJvbSBpdHMgc3RhcnQgZGF0ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRXaWR0aExlZnQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgaXRlbSByaWdodCBmcm9tIHRoZSBtYXggb2YgaXRzIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRXaWR0aFJpZ2h0KCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdGl0bGUgb2YgdGhlIGl0ZW1cbiAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgZ2V0VGl0bGUoKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50b29sdGlwICYmIHRoaXMub3B0aW9ucy50b29sdGlwLnRlbXBsYXRlKSB7XG4gICAgICBjb25zdCB0ZW1wbGF0ZUZ1bmN0aW9uID0gdGhpcy5vcHRpb25zLnRvb2x0aXAudGVtcGxhdGUuYmluZCh0aGlzKTtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZUZ1bmN0aW9uKHRoaXMuX2dldEl0ZW1EYXRhKCksIHRoaXMuZGF0YSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YS50aXRsZTtcbiAgfVxufVxuXG5JdGVtLnByb3RvdHlwZS5zdGFjayA9IHRydWU7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIEJveEl0ZW1cbiAqIEBleHRlbmRzIEl0ZW1cbiAqL1xuY2xhc3MgQm94SXRlbSBleHRlbmRzIEl0ZW0ge1xuICAvKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhICAgICAgICAgICAgIE9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgc3RhcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsIGNsYXNzTmFtZS5cbiAqIEBwYXJhbSB7e3RvU2NyZWVuOiBmdW5jdGlvbiwgdG9UaW1lOiBmdW5jdGlvbn19IGNvbnZlcnNpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20gdGltZSB0byBzY3JlZW4gYW5kIHZpY2UgdmVyc2FcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gICAgICAgIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZGVzY3JpYmUgYXZhaWxhYmxlIG9wdGlvbnNcbiAqL1xuICBjb25zdHJ1Y3RvcihkYXRhLCBjb252ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoZGF0YSwgY29udmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGRvdDoge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9LFxuICAgICAgbGluZToge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwXG4gICAgICB9XG4gICAgfTtcbiAgICAvLyB2YWxpZGF0ZSBkYXRhXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLnN0YXJ0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwic3RhcnRcIiBtaXNzaW5nIGluIGl0ZW0gJHtkYXRhfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoaXMgaXRlbSBpcyB2aXNpYmxlIGluc2lkZSBnaXZlbiByYW5nZVxuICAgKiBAcGFyYW0ge3tzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcn19IHJhbmdlIHdpdGggYSB0aW1lc3RhbXAgZm9yIHN0YXJ0IGFuZCBlbmRcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmlzaWJsZVxuICAgKi9cbiAgaXNWaXNpYmxlKHJhbmdlKSB7XG4gICAgaWYgKHRoaXMuY2x1c3Rlcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBkZXRlcm1pbmUgdmlzaWJpbGl0eVxuICAgIGxldCBpc1Zpc2libGU7XG4gICAgY29uc3QgYWxpZ24gPSB0aGlzLmRhdGEuYWxpZ24gfHwgdGhpcy5vcHRpb25zLmFsaWduO1xuICAgIGNvbnN0IHdpZHRoSW5NcyA9IHRoaXMud2lkdGggKiByYW5nZS5nZXRNaWxsaXNlY29uZHNQZXJQaXhlbCgpO1xuXG4gICAgaWYgKGFsaWduID09ICdyaWdodCcpIHtcbiAgICAgIGlzVmlzaWJsZSA9ICh0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpID4gcmFuZ2Uuc3RhcnQpICYmICh0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpIC0gd2lkdGhJbk1zIDwgcmFuZ2UuZW5kKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYWxpZ24gPT0gJ2xlZnQnKSB7XG4gICAgICBpc1Zpc2libGUgPSAodGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKSArIHdpZHRoSW5NcyA+IHJhbmdlLnN0YXJ0KSAmJiAodGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKSA8IHJhbmdlLmVuZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gZGVmYXVsdCBvciAnY2VudGVyJ1xuICAgICAgaXNWaXNpYmxlID0gKHRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCkgKyB3aWR0aEluTXMgLyAyID4gcmFuZ2Uuc3RhcnQgKSAmJiAodGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKSAtIHdpZHRoSW5Ncy8yIDwgcmFuZ2UuZW5kKTtcbiAgICB9XG4gICAgcmV0dXJuIGlzVmlzaWJsZTtcbiAgfVxuXG4gICAvKipcbiAgICogY3JlYXRlIERPTSBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAvLyBjcmVhdGUgRE9NXG4gICAgICB0aGlzLmRvbSA9IHt9O1xuXG4gICAgICAvLyBjcmVhdGUgbWFpbiBib3hcbiAgICAgIHRoaXMuZG9tLmJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuXG4gICAgICAvLyBjb250ZW50cyBib3ggKGluc2lkZSB0aGUgYmFja2dyb3VuZCBib3gpLiB1c2VkIGZvciBtYWtpbmcgbWFyZ2luc1xuICAgICAgdGhpcy5kb20uY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgdGhpcy5kb20uY29udGVudC5jbGFzc05hbWUgPSAndmlzLWl0ZW0tY29udGVudCc7XG4gICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCk7XG5cbiAgICAgIC8vIGxpbmUgdG8gYXhpc1xuICAgICAgdGhpcy5kb20ubGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0RJVicpO1xuICAgICAgdGhpcy5kb20ubGluZS5jbGFzc05hbWUgPSAndmlzLWxpbmUnO1xuXG4gICAgICAvLyBkb3Qgb24gYXhpc1xuICAgICAgdGhpcy5kb20uZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICB0aGlzLmRvbS5kb3QuY2xhc3NOYW1lID0gJ3Zpcy1kb3QnO1xuXG4gICAgICAvLyBhdHRhY2ggdGhpcyBpdGVtIGFzIGF0dHJpYnV0ZVxuICAgICAgdGhpcy5kb20uYm94Wyd2aXMtaXRlbSddID0gdGhpcztcblxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGFwcGVuZCBET00gZWxlbWVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FwcGVuZERvbUVsZW1lbnQoKSB7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZCcpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBmb3JlZ3JvdW5kID0gdGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7XG4gICAgICBpZiAoIWZvcmVncm91bmQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGZvcmVncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIGZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRvbS5saW5lLnBhcmVudE5vZGUpIHtcbiAgICAgIHZhciBiYWNrZ3JvdW5kID0gdGhpcy5wYXJlbnQuZG9tLmJhY2tncm91bmQ7XG4gICAgICBpZiAoIWJhY2tncm91bmQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGJhY2tncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIGJhY2tncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGluZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5kb20uZG90LnBhcmVudE5vZGUpIHtcbiAgICAgIGNvbnN0IGF4aXMgPSB0aGlzLnBhcmVudC5kb20uYXhpcztcbiAgICAgIGlmICghYmFja2dyb3VuZCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gYXhpcyBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgYXhpcy5hcHBlbmRDaGlsZCh0aGlzLmRvbS5kb3QpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIGRpcnR5IERPTSBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRGlydHlEb21Db21wb25lbnRzKCkge1xuICAgIC8vIEFuIGl0ZW0gaXMgbWFya2VkIGRpcnR5IHdoZW46XG4gICAgLy8gLSB0aGUgaXRlbSBpcyBub3QgeWV0IHJlbmRlcmVkXG4gICAgLy8gLSB0aGUgaXRlbSdzIGRhdGEgaXMgY2hhbmdlZFxuICAgIC8vIC0gdGhlIGl0ZW0gaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZFxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmJveCk7XG4gICAgICB0aGlzLl91cGRhdGVTdHlsZSh0aGlzLmRvbS5ib3gpO1xuXG4gICAgICBjb25zdCBlZGl0YWJsZSA9ICh0aGlzLmVkaXRhYmxlLnVwZGF0ZVRpbWUgfHwgdGhpcy5lZGl0YWJsZS51cGRhdGVHcm91cCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjbGFzc1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gKHRoaXMuZGF0YS5jbGFzc05hbWUgPyAnICcgKyB0aGlzLmRhdGEuY2xhc3NOYW1lIDogJycpICtcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWQgPyAnIHZpcy1zZWxlY3RlZCcgOiAnJykgK1xuICAgICAgICAoZWRpdGFibGUgPyAnIHZpcy1lZGl0YWJsZScgOiAnIHZpcy1yZWFkb25seScpO1xuICAgICAgdGhpcy5kb20uYm94LmNsYXNzTmFtZSA9IGB2aXMtaXRlbSB2aXMtYm94JHtjbGFzc05hbWV9YDtcbiAgICAgIHRoaXMuZG9tLmxpbmUuY2xhc3NOYW1lID0gYHZpcy1pdGVtIHZpcy1saW5lJHtjbGFzc05hbWV9YDtcbiAgICAgIHRoaXMuZG9tLmRvdC5jbGFzc05hbWUgPSBgdmlzLWl0ZW0gdmlzLWRvdCR7Y2xhc3NOYW1lfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCBET00gY29tcG9uZW50cyBzaXplc1xuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0RG9tQ29tcG9uZW50c1NpemVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwcmV2aW91czoge1xuICAgICAgICByaWdodDogdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0LFxuICAgICAgICBsZWZ0OiB0aGlzLmRvbS5ib3guc3R5bGUubGVmdFxuICAgICAgfSxcbiAgICAgIGRvdDoge1xuICAgICAgICBoZWlnaHQ6IHRoaXMuZG9tLmRvdC5vZmZzZXRIZWlnaHQsXG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5kb3Qub2Zmc2V0V2lkdGhcbiAgICAgIH0sXG4gICAgICBsaW5lOiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5saW5lLm9mZnNldFdpZHRoXG4gICAgICB9LFxuICAgICAgYm94OiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5ib3gub2Zmc2V0V2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5kb20uYm94Lm9mZnNldEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgRE9NIGNvbXBvbmVudHMgc2l6ZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IHNpemVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzKHNpemVzKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodCA9IFwiMHB4XCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICB9XG5cbiAgICAvLyByZWNhbGN1bGF0ZSBzaXplXG4gICAgdGhpcy5wcm9wcy5kb3QuaGVpZ2h0ID0gc2l6ZXMuZG90LmhlaWdodDtcbiAgICB0aGlzLnByb3BzLmRvdC53aWR0aCA9IHNpemVzLmRvdC53aWR0aDtcbiAgICB0aGlzLnByb3BzLmxpbmUud2lkdGggPSBzaXplcy5saW5lLndpZHRoO1xuICAgIHRoaXMud2lkdGggPSBzaXplcy5ib3gud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBzaXplcy5ib3guaGVpZ2h0O1xuXG4gICAgLy8gcmVzdG9yZSBwcmV2aW91cyBwb3NpdGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICB0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQgPSBzaXplcy5wcmV2aW91cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb20uYm94LnN0eWxlLmxlZnQgPSBzaXplcy5wcmV2aW91cy5sZWZ0O1xuICAgIH1cblxuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXBhaW50IERPTSBhZGRpdGlvbmFsc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlcGFpbnREb21BZGRpdGlvbmFscygpIHtcbiAgICB0aGlzLl9yZXBhaW50T25JdGVtVXBkYXRlVGltZVRvb2x0aXAodGhpcy5kb20uYm94KTtcbiAgICB0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpO1xuICAgIHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20uYm94KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBhaW50IHRoZSBpdGVtXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVyblF1ZXVlPWZhbHNlXSAgcmV0dXJuIHRoZSBxdWV1ZVxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVkcmF3IHF1ZXVlIGlmIHJldHVyblF1ZXVlPXRydWVcbiAgICovXG4gIHJlZHJhdyhyZXR1cm5RdWV1ZSkge1xuICAgIGxldCBzaXplcztcbiAgICBjb25zdCBxdWV1ZSA9IFtcbiAgICAgIC8vIGNyZWF0ZSBpdGVtIERPTVxuICAgICAgdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuXG4gICAgICAvLyBhcHBlbmQgRE9NIHRvIHBhcmVudCBET01cbiAgICAgIHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSxcblxuICAgICAgLy8gdXBkYXRlIGRpcnR5IERPTVxuICAgICAgdGhpcy5fdXBkYXRlRGlydHlEb21Db21wb25lbnRzLmJpbmQodGhpcyksXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICBzaXplcyA9IHRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcygpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzLmJpbmQodGhpcykoc2l6ZXMpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICAvLyByZXBhaW50IERPTSBhZGRpdGlvbmFsc1xuICAgICAgdGhpcy5fcmVwYWludERvbUFkZGl0aW9uYWxzLmJpbmQodGhpcylcbiAgICBdO1xuXG4gICAgaWYgKHJldHVyblF1ZXVlKSB7XG4gICAgICByZXR1cm4gcXVldWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICBxdWV1ZS5mb3JFYWNoKGZuID0+IHtcbiAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvdyB0aGUgaXRlbSBpbiB0aGUgRE9NICh3aGVuIG5vdCBhbHJlYWR5IHZpc2libGUpLiBUaGUgaXRlbXMgRE9NIHdpbGxcbiAgICogYmUgY3JlYXRlZCB3aGVuIG5lZWRlZC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuUXVldWU9ZmFsc2VdICB3aGV0aGVyIHRvIHJldHVybiBhIHF1ZXVlIG9mIGZ1bmN0aW9ucyB0byBleGVjdXRlIGluc3RlYWQgb2YganVzdCBleGVjdXRpbmcgdGhlbVxuICAgKiBAcmV0dXJuIHtib29sZWFufSB0aGUgcmVkcmF3IHF1ZXVlIGlmIHJldHVyblF1ZXVlPXRydWVcbiAgICovXG4gIHNob3cocmV0dXJuUXVldWUpIHtcbiAgICBpZiAoIXRoaXMuZGlzcGxheWVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWRyYXcocmV0dXJuUXVldWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpdGVtIGZyb20gdGhlIERPTSAod2hlbiB2aXNpYmxlKVxuICAgKi9cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWQpIHtcbiAgICAgIGNvbnN0IGRvbSA9IHRoaXMuZG9tO1xuXG4gICAgICBpZiAoZG9tLmJveC5yZW1vdmUpIGRvbS5ib3gucmVtb3ZlKCk7XG4gICAgICBlbHNlIGlmIChkb20uYm94LnBhcmVudE5vZGUpIGRvbS5ib3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20uYm94KTsgLy8gSUUxMVxuXG4gICAgICBpZiAoZG9tLmxpbmUucmVtb3ZlKSBkb20ubGluZS5yZW1vdmUoKTtcbiAgICAgIGVsc2UgaWYgKGRvbS5saW5lLnBhcmVudE5vZGUpIGRvbS5saW5lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tLmxpbmUpOyAvLyBJRTExXG4gICAgICBcbiAgICAgIGlmIChkb20uZG90LnJlbW92ZSkgZG9tLmRvdC5yZW1vdmUoKTtcbiAgICAgIGVsc2UgaWYgKGRvbS5kb3QucGFyZW50Tm9kZSkgZG9tLmRvdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbS5kb3QpOyAvLyBJRTExXG5cbiAgICAgIHRoaXMuZGlzcGxheWVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9zaXRpb24gdGhlIGl0ZW0gWFlcbiAgICovXG4gIHJlcG9zaXRpb25YWSgpIHtcbiAgICBjb25zdCBydGwgPSB0aGlzLm9wdGlvbnMucnRsO1xuXG4gICAgY29uc3QgcmVwb3NpdGlvblhZID0gKGVsZW1lbnQsIHgsIHksIHJ0bCA9IGZhbHNlKSA9PiB7XG4gICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkICYmIHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgLy8gSWYgcnRsIGludmVydCB0aGUgbnVtYmVyLlxuICAgICAgY29uc3QgZGlyZWN0aW9uWCA9IHJ0bCA/ICh4ICogLTEpIDogeDtcblxuICAgICAgLy9ubyB5LiB0cmFuc2xhdGUgeFxuICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7ZGlyZWN0aW9uWH1weClgO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vbm8geC4gdHJhbnNsYXRlIHlcbiAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3l9cHgpYDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkaXJlY3Rpb25YfXB4LCAke3l9cHgpYDtcbiAgICB9O1xuICAgIHJlcG9zaXRpb25YWSh0aGlzLmRvbS5ib3gsIHRoaXMuYm94WCwgdGhpcy5ib3hZLCBydGwpO1xuICAgIHJlcG9zaXRpb25YWSh0aGlzLmRvbS5kb3QsIHRoaXMuZG90WCwgdGhpcy5kb3RZLCBydGwpO1xuICAgIHJlcG9zaXRpb25YWSh0aGlzLmRvbS5saW5lLCB0aGlzLmxpbmVYLCB0aGlzLmxpbmVZLCBydGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9zaXRpb24gdGhlIGl0ZW0gaG9yaXpvbnRhbGx5XG4gICAqIEBPdmVycmlkZVxuICAgKi9cbiAgcmVwb3NpdGlvblgoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KTtcbiAgICBjb25zdCBhbGlnbiA9IHRoaXMuZGF0YS5hbGlnbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLmFsaWduIDogdGhpcy5kYXRhLmFsaWduO1xuICAgIGNvbnN0IGxpbmVXaWR0aCA9IHRoaXMucHJvcHMubGluZS53aWR0aDtcbiAgICBjb25zdCBkb3RXaWR0aCA9IHRoaXMucHJvcHMuZG90LndpZHRoO1xuICAgIFxuICAgIGlmIChhbGlnbiA9PSAncmlnaHQnKSB7XG4gICAgICAvLyBjYWxjdWxhdGUgcmlnaHQgcG9zaXRpb24gb2YgdGhlIGJveFxuICAgICAgdGhpcy5ib3hYID0gc3RhcnQgLSB0aGlzLndpZHRoO1xuICAgICAgdGhpcy5saW5lWCA9IHN0YXJ0IC0gbGluZVdpZHRoO1xuICAgICAgdGhpcy5kb3RYID0gc3RhcnQgLSBsaW5lV2lkdGggLyAyIC0gZG90V2lkdGggLyAyO1xuICAgIH1cbiAgICBlbHNlIGlmIChhbGlnbiA9PSAnbGVmdCcpIHtcbiAgICAgIC8vIGNhbGN1bGF0ZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBib3hcbiAgICAgIHRoaXMuYm94WCA9IHN0YXJ0O1xuICAgICAgdGhpcy5saW5lWCA9IHN0YXJ0O1xuICAgICAgdGhpcy5kb3RYID0gc3RhcnQgKyBsaW5lV2lkdGggLyAyIC0gZG90V2lkdGggLyAyO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIGRlZmF1bHQgb3IgJ2NlbnRlcidcbiAgICAgIHRoaXMuYm94WCA9IHN0YXJ0IC0gdGhpcy53aWR0aCAvIDI7XG4gICAgICB0aGlzLmxpbmVYID0gdGhpcy5vcHRpb25zLnJ0bCA/IHN0YXJ0IC0gbGluZVdpZHRoIDogc3RhcnQgLSBsaW5lV2lkdGggLyAyO1xuICAgICAgdGhpcy5kb3RYID0gc3RhcnQgLSBkb3RXaWR0aCAvIDI7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpXG4gICAgICB0aGlzLnJpZ2h0ID0gdGhpcy5ib3hYO1xuICAgIGVsc2VcbiAgICAgIHRoaXMubGVmdCA9IHRoaXMuYm94WDtcblxuICAgIHRoaXMucmVwb3NpdGlvblhZKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwb3NpdGlvbiB0aGUgaXRlbSB2ZXJ0aWNhbGx5XG4gICAqIEBPdmVycmlkZVxuICAgKi9cbiAgcmVwb3NpdGlvblkoKSB7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtcbiAgICBjb25zdCBsaW5lU3R5bGUgPSB0aGlzLmRvbS5saW5lLnN0eWxlO1xuXG4gICAgaWYgKG9yaWVudGF0aW9uID09ICd0b3AnKSB7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdGhpcy5wYXJlbnQudG9wICsgdGhpcy50b3AgKyAxO1xuXG4gICAgICB0aGlzLmJveFkgPSB0aGlzLnRvcCB8fCAwO1xuICAgICAgbGluZVN0eWxlLmhlaWdodCA9IGAke2xpbmVIZWlnaHR9cHhgO1xuICAgICAgbGluZVN0eWxlLmJvdHRvbSA9ICcnO1xuICAgICAgbGluZVN0eWxlLnRvcCA9ICcwJztcbiAgICB9XG4gICAgZWxzZSB7IC8vIG9yaWVudGF0aW9uICdib3R0b20nXG4gICAgICBjb25zdCBpdGVtU2V0SGVpZ2h0ID0gdGhpcy5wYXJlbnQuaXRlbVNldC5wcm9wcy5oZWlnaHQ7IC8vIFRPRE86IHRoaXMgaXMgbmFzdHlcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSBpdGVtU2V0SGVpZ2h0IC0gdGhpcy5wYXJlbnQudG9wIC0gdGhpcy5wYXJlbnQuaGVpZ2h0ICsgdGhpcy50b3A7XG5cbiAgICAgIHRoaXMuYm94WSA9IHRoaXMucGFyZW50LmhlaWdodCAtIHRoaXMudG9wIC0gKHRoaXMuaGVpZ2h0IHx8IDApO1xuICAgICAgbGluZVN0eWxlLmhlaWdodCA9IGAke2xpbmVIZWlnaHR9cHhgO1xuICAgICAgbGluZVN0eWxlLnRvcCA9ICcnO1xuICAgICAgbGluZVN0eWxlLmJvdHRvbSA9ICcwJztcbiAgICB9XG5cbiAgICB0aGlzLmRvdFkgPSAtdGhpcy5wcm9wcy5kb3QuaGVpZ2h0IC8gMjtcblxuICAgIHRoaXMucmVwb3NpdGlvblhZKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgaXRlbSBsZWZ0IGZyb20gaXRzIHN0YXJ0IGRhdGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0V2lkdGhMZWZ0KCkge1xuICAgIHJldHVybiB0aGlzLndpZHRoIC8gMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpdGVtIHJpZ2h0IGZyb20gaXRzIHN0YXJ0IGRhdGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0V2lkdGhSaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy53aWR0aCAvIDI7XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3IgUG9pbnRJdGVtXG4gKiBAZXh0ZW5kcyBJdGVtXG4gKi9cbmNsYXNzIFBvaW50SXRlbSBleHRlbmRzIEl0ZW0ge1xuICAvKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhICAgICAgICAgICAgIE9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgc3RhcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsIGNsYXNzTmFtZS5cbiAqIEBwYXJhbSB7e3RvU2NyZWVuOiBmdW5jdGlvbiwgdG9UaW1lOiBmdW5jdGlvbn19IGNvbnZlcnNpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20gdGltZSB0byBzY3JlZW4gYW5kIHZpY2UgdmVyc2FcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gICAgICAgIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZGVzY3JpYmUgYXZhaWxhYmxlIG9wdGlvbnNcbiAqL1xuICBjb25zdHJ1Y3RvcihkYXRhLCBjb252ZXJzaW9uLCBvcHRpb25zKSB7XG4gICAgc3VwZXIoZGF0YSwgY29udmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGRvdDoge1xuICAgICAgICB0b3A6IDAsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDBcbiAgICAgIH0sXG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIGhlaWdodDogMCxcbiAgICAgICAgbWFyZ2luTGVmdDogMCxcbiAgICAgICAgbWFyZ2luUmlnaHQ6IDBcbiAgICAgIH1cbiAgICB9O1xuICAgIC8vIHZhbGlkYXRlIGRhdGFcbiAgICBpZiAoZGF0YSkge1xuICAgICAgaWYgKGRhdGEuc3RhcnQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgXCJzdGFydFwiIG1pc3NpbmcgaW4gaXRlbSAke2RhdGF9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhpcyBpdGVtIGlzIHZpc2libGUgaW5zaWRlIGdpdmVuIHJhbmdlXG4gICAqIEBwYXJhbSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gcmFuZ2Ugd2l0aCBhIHRpbWVzdGFtcCBmb3Igc3RhcnQgYW5kIGVuZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2aXNpYmxlXG4gICAqL1xuICBpc1Zpc2libGUocmFuZ2UpIHtcbiAgICBpZiAodGhpcy5jbHVzdGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGRldGVybWluZSB2aXNpYmlsaXR5XG4gICAgY29uc3Qgd2lkdGhJbk1zID0gdGhpcy53aWR0aCAqIHJhbmdlLmdldE1pbGxpc2Vjb25kc1BlclBpeGVsKCk7XG4gICAgXG4gICAgcmV0dXJuICh0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpICsgd2lkdGhJbk1zID4gcmFuZ2Uuc3RhcnQgKSAmJiAodGhpcy5kYXRhLnN0YXJ0IDwgcmFuZ2UuZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGUgRE9NIGVsZW1lbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVEb21FbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgIC8vIGNyZWF0ZSBET01cbiAgICAgIHRoaXMuZG9tID0ge307XG5cbiAgICAgIC8vIGJhY2tncm91bmQgYm94XG4gICAgICB0aGlzLmRvbS5wb2ludCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgLy8gY2xhc3NOYW1lIGlzIHVwZGF0ZWQgaW4gcmVkcmF3KClcblxuICAgICAgLy8gY29udGVudHMgYm94LCByaWdodCBmcm9tIHRoZSBkb3RcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtLWNvbnRlbnQnO1xuICAgICAgdGhpcy5kb20ucG9pbnQuYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCk7XG5cbiAgICAgIC8vIGRvdCBhdCBzdGFydFxuICAgICAgdGhpcy5kb20uZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICB0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5kb3QpO1xuXG4gICAgICAvLyBhdHRhY2ggdGhpcyBpdGVtIGFzIGF0dHJpYnV0ZVxuICAgICAgdGhpcy5kb20ucG9pbnRbJ3Zpcy1pdGVtJ10gPSB0aGlzO1xuXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYXBwZW5kIERPTSBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYXBwZW5kRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWRyYXcgaXRlbTogbm8gcGFyZW50IGF0dGFjaGVkJyk7XG4gICAgfVxuICAgIGlmICghdGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZSkge1xuICAgICAgY29uc3QgZm9yZWdyb3VuZCA9IHRoaXMucGFyZW50LmRvbS5mb3JlZ3JvdW5kO1xuICAgICAgaWYgKCFmb3JlZ3JvdW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGZvcmVncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIGZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20ucG9pbnQpO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIGRpcnR5IERPTSBjb21wb25lbnRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRGlydHlEb21Db21wb25lbnRzKCkge1xuICAgIC8vIEFuIGl0ZW0gaXMgbWFya2VkIGRpcnR5IHdoZW46XG4gICAgLy8gLSB0aGUgaXRlbSBpcyBub3QgeWV0IHJlbmRlcmVkXG4gICAgLy8gLSB0aGUgaXRlbSdzIGRhdGEgaXMgY2hhbmdlZFxuICAgIC8vIC0gdGhlIGl0ZW0gaXMgc2VsZWN0ZWQvZGVzZWxlY3RlZFxuICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICB0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLnBvaW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLnBvaW50KTtcblxuICAgICAgY29uc3QgZWRpdGFibGUgPSAodGhpcy5lZGl0YWJsZS51cGRhdGVUaW1lIHx8IHRoaXMuZWRpdGFibGUudXBkYXRlR3JvdXApO1xuICAgICAgLy8gdXBkYXRlIGNsYXNzXG4gICAgICBjb25zdCBjbGFzc05hbWUgPSAodGhpcy5kYXRhLmNsYXNzTmFtZSA/ICcgJyArIHRoaXMuZGF0YS5jbGFzc05hbWUgOiAnJykgK1xuICAgICAgICAgICh0aGlzLnNlbGVjdGVkID8gJyB2aXMtc2VsZWN0ZWQnIDogJycpICtcbiAgICAgICAgICAoZWRpdGFibGUgPyAnIHZpcy1lZGl0YWJsZScgOiAnIHZpcy1yZWFkb25seScpO1xuICAgICAgdGhpcy5kb20ucG9pbnQuY2xhc3NOYW1lICA9IGB2aXMtaXRlbSB2aXMtcG9pbnQke2NsYXNzTmFtZX1gO1xuICAgICAgdGhpcy5kb20uZG90LmNsYXNzTmFtZSAgPSBgdmlzLWl0ZW0gdmlzLWRvdCR7Y2xhc3NOYW1lfWA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCBET00gY29tcG9uZW50IHNpemVzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXREb21Db21wb25lbnRzU2l6ZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvdDogIHtcbiAgICAgICAgd2lkdGg6IHRoaXMuZG9tLmRvdC5vZmZzZXRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmRvbS5kb3Qub2Zmc2V0SGVpZ2h0XG4gICAgICB9LFxuICAgICAgY29udGVudDoge1xuICAgICAgICB3aWR0aDogdGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmRvbS5jb250ZW50Lm9mZnNldEhlaWdodFxuICAgICAgfSxcbiAgICAgIHBvaW50OiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5wb2ludC5vZmZzZXRXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmRvbS5wb2ludC5vZmZzZXRIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIERPTSBjb21wb25lbnRzIHNpemVzXG4gICAqIEBwYXJhbSB7YXJyYXl9IHNpemVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzKHNpemVzKSB7XG4gICAgLy8gcmVjYWxjdWxhdGUgc2l6ZSBvZiBkb3QgYW5kIGNvbnRlbnRzXG4gICAgdGhpcy5wcm9wcy5kb3Qud2lkdGggPSBzaXplcy5kb3Qud2lkdGg7XG4gICAgdGhpcy5wcm9wcy5kb3QuaGVpZ2h0ID0gc2l6ZXMuZG90LmhlaWdodDtcbiAgICB0aGlzLnByb3BzLmNvbnRlbnQuaGVpZ2h0ID0gc2l6ZXMuY29udGVudC5oZWlnaHQ7XG5cbiAgICAvLyByZXNpemUgY29udGVudHNcbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXJnaW5SaWdodCA9IGAkezIgKiB0aGlzLnByb3BzLmRvdC53aWR0aH1weGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubWFyZ2luTGVmdCA9IGAkezIgKiB0aGlzLnByb3BzLmRvdC53aWR0aH1weGA7XG4gICAgfVxuICAgIC8vdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXJnaW5SaWdodCA9IC4uLiArICdweCc7IC8vIFRPRE86IG1hcmdpbiByaWdodFxuXG4gICAgLy8gcmVjYWxjdWxhdGUgc2l6ZVxuICAgIHRoaXMud2lkdGggPSBzaXplcy5wb2ludC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHNpemVzLnBvaW50LmhlaWdodDtcblxuICAgIC8vIHJlcG9zaXRpb24gdGhlIGRvdFxuICAgIHRoaXMuZG9tLmRvdC5zdHlsZS50b3AgPSBgJHsodGhpcy5oZWlnaHQgLSB0aGlzLnByb3BzLmRvdC5oZWlnaHQpIC8gMn1weGA7XG4gICAgXG4gICAgY29uc3QgZG90V2lkdGggPSB0aGlzLnByb3BzLmRvdC53aWR0aDtcbiAgICBjb25zdCB0cmFuc2xhdGVYID0gdGhpcy5vcHRpb25zLnJ0bCA/IChkb3RXaWR0aCAvIDIpICogLTEgOiBkb3RXaWR0aCAvIDI7XG4gICAgdGhpcy5kb20uZG90LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlWH1weGA7XG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbiBET00gYWRkaXRpb25hbHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXBhaW50RG9tQWRkaXRpb25hbHMoKSB7XG4gICAgdGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHRoaXMuZG9tLnBvaW50KTtcbiAgICB0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpO1xuICAgIHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20ucG9pbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGl0ZW1cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuUXVldWU9ZmFsc2VdICByZXR1cm4gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZWRyYXcgcXVldWUgaWYgcmV0dXJuUXVldWU9dHJ1ZVxuICAgKi9cbiAgcmVkcmF3KHJldHVyblF1ZXVlKSB7XG4gICAgbGV0IHNpemVzO1xuICAgIGNvbnN0IHF1ZXVlID0gW1xuICAgICAgLy8gY3JlYXRlIGl0ZW0gRE9NXG4gICAgICB0aGlzLl9jcmVhdGVEb21FbGVtZW50LmJpbmQodGhpcyksXG5cbiAgICAgIC8vIGFwcGVuZCBET00gdG8gcGFyZW50IERPTVxuICAgICAgdGhpcy5fYXBwZW5kRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuXG4gICAgICAvLyB1cGRhdGUgZGlydHkgRE9NXG4gICAgICB0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxcblxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHNpemVzID0gdGhpcy5fZ2V0RG9tQ29tcG9uZW50c1NpemVzKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVEb21Db21wb25lbnRzU2l6ZXMuYmluZCh0aGlzKShzaXplcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIHJlcGFpbnQgRE9NIGFkZGl0aW9uYWxzXG4gICAgICB0aGlzLl9yZXBhaW50RG9tQWRkaXRpb25hbHMuYmluZCh0aGlzKVxuICAgIF07XG5cbiAgICBpZiAocmV0dXJuUXVldWUpIHtcbiAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHF1ZXVlLmZvckVhY2goZm4gPT4ge1xuICAgICAgICByZXN1bHQgPSBmbigpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIFxuICAvKipcbiAgICogUmVwb3NpdGlvbiBYWVxuICAgKi9cbiAgcmVwb3NpdGlvblhZKCkge1xuICAgIGNvbnN0IHJ0bCA9IHRoaXMub3B0aW9ucy5ydGw7XG4gICAgXG4gICAgY29uc3QgcmVwb3NpdGlvblhZID0gKGVsZW1lbnQsIHgsIHksIHJ0bCA9IGZhbHNlKSA9PiB7XG4gICAgICBpZiAoeCA9PT0gdW5kZWZpbmVkICYmIHkgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgLy8gSWYgcnRsIGludmVydCB0aGUgbnVtYmVyLlxuICAgICAgY29uc3QgZGlyZWN0aW9uWCA9IHJ0bCA/ICh4ICogLTEpIDogeDtcblxuICAgICAgLy9ubyB5LiB0cmFuc2xhdGUgeFxuICAgICAgaWYgKHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7ZGlyZWN0aW9uWH1weClgO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vbm8geC4gdHJhbnNsYXRlIHlcbiAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3l9cHgpYDtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUoJHtkaXJlY3Rpb25YfXB4LCAke3l9cHgpYDtcbiAgICB9O1xuICAgIHJlcG9zaXRpb25YWSh0aGlzLmRvbS5wb2ludCwgdGhpcy5wb2ludFgsIHRoaXMucG9pbnRZLCBydGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGl0ZW0gaW4gdGhlIERPTSAod2hlbiBub3QgYWxyZWFkeSB2aXNpYmxlKS4gVGhlIGl0ZW1zIERPTSB3aWxsXG4gICAqIGJlIGNyZWF0ZWQgd2hlbiBuZWVkZWQuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldHVyblF1ZXVlPWZhbHNlXSAgd2hldGhlciB0byByZXR1cm4gYSBxdWV1ZSBvZiBmdW5jdGlvbnMgdG8gZXhlY3V0ZSBpbnN0ZWFkIG9mIGp1c3QgZXhlY3V0aW5nIHRoZW1cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gdGhlIHJlZHJhdyBxdWV1ZSBpZiByZXR1cm5RdWV1ZT10cnVlXG4gICAqL1xuICBzaG93KHJldHVyblF1ZXVlKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXllZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVkcmF3KHJldHVyblF1ZXVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgaXRlbSBmcm9tIHRoZSBET00gKHdoZW4gdmlzaWJsZSlcbiAgICovXG4gIGhpZGUoKSB7XG4gICAgaWYgKHRoaXMuZGlzcGxheWVkKSB7XG4gICAgICBpZiAodGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmRvbS5wb2ludC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLnBvaW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwb3NpdGlvbiB0aGUgaXRlbSBob3Jpem9udGFsbHlcbiAgICogQE92ZXJyaWRlXG4gICAqL1xuICByZXBvc2l0aW9uWCgpIHtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpO1xuXG4gICAgdGhpcy5wb2ludFggPSBzdGFydDtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5yaWdodCA9IHN0YXJ0IC0gdGhpcy5wcm9wcy5kb3Qud2lkdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGVmdCA9IHN0YXJ0IC0gdGhpcy5wcm9wcy5kb3Qud2lkdGg7XG4gICAgfVxuXG4gICAgdGhpcy5yZXBvc2l0aW9uWFkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvc2l0aW9uIHRoZSBpdGVtIHZlcnRpY2FsbHlcbiAgICogQE92ZXJyaWRlXG4gICAqL1xuICByZXBvc2l0aW9uWSgpIHtcbiAgICBjb25zdCBvcmllbnRhdGlvbiA9IHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtO1xuICAgIGlmIChvcmllbnRhdGlvbiA9PSAndG9wJykge1xuICAgICAgdGhpcy5wb2ludFkgPSB0aGlzLnRvcDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvaW50WSA9IHRoaXMucGFyZW50LmhlaWdodCAtIHRoaXMudG9wIC0gdGhpcy5oZWlnaHQ7XG4gICAgfVxuXG4gICAgdGhpcy5yZXBvc2l0aW9uWFkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpdGVtIGxlZnQgZnJvbSBpdHMgc3RhcnQgZGF0ZVxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRXaWR0aExlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZG90LndpZHRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIGl0ZW0gcmlnaHQgZnJvbSAgaXRzIHN0YXJ0IGRhdGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0V2lkdGhSaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5kb3Qud2lkdGg7XG4gIH1cbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3IgUmFuZ2VJdGVtXG4gKiBAZXh0ZW5kcyBJdGVtXG4gKi9cbmNsYXNzIFJhbmdlSXRlbSBleHRlbmRzIEl0ZW0ge1xuICAvKipcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhICAgICAgICAgICAgIE9iamVjdCBjb250YWluaW5nIHBhcmFtZXRlcnMgc3RhcnQsIGVuZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCwgY2xhc3NOYW1lLlxuICogQHBhcmFtIHt7dG9TY3JlZW46IGZ1bmN0aW9uLCB0b1RpbWU6IGZ1bmN0aW9ufX0gY29udmVyc2lvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSB0aW1lIHRvIHNjcmVlbiBhbmQgdmljZSB2ZXJzYVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgICAgQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkZXNjcmliZSBvcHRpb25zXG4gKi9cbiAgY29uc3RydWN0b3IoZGF0YSwgY29udmVyc2lvbiwgb3B0aW9ucykge1xuICAgIHN1cGVyKGRhdGEsIGNvbnZlcnNpb24sIG9wdGlvbnMpO1xuICAgIHRoaXMucHJvcHMgPSB7XG4gICAgICBjb250ZW50OiB7XG4gICAgICAgIHdpZHRoOiAwXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm92ZXJmbG93ID0gZmFsc2U7IC8vIGlmIGNvbnRlbnRzIGNhbiBvdmVyZmxvdyAoY3NzIHN0eWxpbmcpLCB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWVcbiAgICAvLyB2YWxpZGF0ZSBkYXRhXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLnN0YXJ0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwic3RhcnRcIiBtaXNzaW5nIGluIGl0ZW0gJHtkYXRhLmlkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZW5kID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwiZW5kXCIgbWlzc2luZyBpbiBpdGVtICR7ZGF0YS5pZH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGlzIGl0ZW0gaXMgdmlzaWJsZSBpbnNpZGUgZ2l2ZW4gcmFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHt0aW1lbGluZS5SYW5nZX0gcmFuZ2Ugd2l0aCBhIHRpbWVzdGFtcCBmb3Igc3RhcnQgYW5kIGVuZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2aXNpYmxlXG4gICAqL1xuICBpc1Zpc2libGUocmFuZ2UpIHtcbiAgICBpZiAodGhpcy5jbHVzdGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGRldGVybWluZSB2aXNpYmlsaXR5XG4gICAgcmV0dXJuICh0aGlzLmRhdGEuc3RhcnQgPCByYW5nZS5lbmQpICYmICh0aGlzLmRhdGEuZW5kID4gcmFuZ2Uuc3RhcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBET00gZWxlbWVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVEb21FbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5kb20pIHtcbiAgICAgIC8vIGNyZWF0ZSBET01cbiAgICAgIHRoaXMuZG9tID0ge307XG5cbiAgICAgICAgLy8gYmFja2dyb3VuZCBib3hcbiAgICAgIHRoaXMuZG9tLmJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgLy8gY2xhc3NOYW1lIGlzIHVwZGF0ZWQgaW4gcmVkcmF3KClcblxuICAgICAgLy8gZnJhbWUgYm94ICh0byBwcmV2ZW50IHRoZSBpdGVtIGNvbnRlbnRzIGZyb20gb3ZlcmZsb3dpbmcpXG4gICAgICB0aGlzLmRvbS5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5kb20uZnJhbWUuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtLW92ZXJmbG93JztcbiAgICAgIHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSk7XG4gICAgXG4gICAgICAvLyB2aXNpYmxlIGZyYW1lIGJveCAoc2hvd2luZyB0aGUgZnJhbWUgdGhhdCBpcyBhbHdheXMgdmlzaWJsZSlcbiAgICAgIHRoaXMuZG9tLnZpc2libGVGcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5kb20udmlzaWJsZUZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtaXRlbS12aXNpYmxlLWZyYW1lJztcbiAgICAgIHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0aGlzLmRvbS52aXNpYmxlRnJhbWUpO1xuXG4gICAgICAvLyBjb250ZW50cyBib3hcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtLWNvbnRlbnQnO1xuICAgICAgdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCk7XG5cbiAgICAgIC8vIGF0dGFjaCB0aGlzIGl0ZW0gYXMgYXR0cmlidXRlXG4gICAgICB0aGlzLmRvbS5ib3hbJ3Zpcy1pdGVtJ10gPSB0aGlzO1xuXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBhcHBlbmQgZWxlbWVudCB0byBET01cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hcHBlbmREb21FbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRvbS5ib3gucGFyZW50Tm9kZSkge1xuICAgICAgY29uc3QgZm9yZWdyb3VuZCA9IHRoaXMucGFyZW50LmRvbS5mb3JlZ3JvdW5kO1xuICAgICAgaWYgKCFmb3JlZ3JvdW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGZvcmVncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIGZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBkaXJ0eSBET00gY29tcG9uZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cygpIHtcbiAgICAvLyB1cGRhdGUgZGlydHkgRE9NLiBBbiBpdGVtIGlzIG1hcmtlZCBkaXJ0eSB3aGVuOlxuICAgIC8vIC0gdGhlIGl0ZW0gaXMgbm90IHlldCByZW5kZXJlZFxuICAgIC8vIC0gdGhlIGl0ZW0ncyBkYXRhIGlzIGNoYW5nZWRcbiAgICAvLyAtIHRoZSBpdGVtIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWRcbiAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgdGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCk7XG4gICAgICB0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpO1xuICAgICAgdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20uYm94KTtcblxuICAgICAgY29uc3QgZWRpdGFibGUgPSAodGhpcy5lZGl0YWJsZS51cGRhdGVUaW1lIHx8IHRoaXMuZWRpdGFibGUudXBkYXRlR3JvdXApO1xuXG4gICAgICAvLyB1cGRhdGUgY2xhc3NcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9ICh0aGlzLmRhdGEuY2xhc3NOYW1lID8gKCcgJyArIHRoaXMuZGF0YS5jbGFzc05hbWUpIDogJycpICtcbiAgICAgICAgICAodGhpcy5zZWxlY3RlZCA/ICcgdmlzLXNlbGVjdGVkJyA6ICcnKSArIFxuICAgICAgICAgIChlZGl0YWJsZSA/ICcgdmlzLWVkaXRhYmxlJyA6ICcgdmlzLXJlYWRvbmx5Jyk7XG4gICAgICB0aGlzLmRvbS5ib3guY2xhc3NOYW1lID0gdGhpcy5iYXNlQ2xhc3NOYW1lICsgY2xhc3NOYW1lO1xuXG4gICAgICAvLyB0dXJuIG9mZiBtYXgtd2lkdGggdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgdGhlIHJlYWwgd2lkdGhcbiAgICAgIC8vIHRoaXMgY2F1c2VzIGFuIGV4dHJhIGJyb3dzZXIgcmVwYWludC9yZWZsb3csIGJ1dCBzbyBiZSBpdFxuICAgICAgdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IERPTSBjb21wb25lbnQgc2l6ZXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldERvbUNvbXBvbmVudHNTaXplcygpIHtcbiAgICAvLyBkZXRlcm1pbmUgZnJvbSBjc3Mgd2hldGhlciB0aGlzIGJveCBoYXMgb3ZlcmZsb3dcbiAgICB0aGlzLm92ZXJmbG93ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kb20uZnJhbWUpLm92ZXJmbG93ICE9PSAnaGlkZGVuJztcbiAgICB0aGlzLndoaXRlU3BhY2UgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5jb250ZW50KS53aGl0ZVNwYWNlICE9PSAnbm93cmFwJztcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICB3aWR0aDogdGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aCxcbiAgICAgIH0sXG4gICAgICBib3g6IHtcbiAgICAgICAgaGVpZ2h0OiB0aGlzLmRvbS5ib3gub2Zmc2V0SGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBET00gY29tcG9uZW50IHNpemVzXG4gICAqIEBwYXJhbSB7YXJyYXl9IHNpemVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzKHNpemVzKSB7XG4gICAgdGhpcy5wcm9wcy5jb250ZW50LndpZHRoID0gc2l6ZXMuY29udGVudC53aWR0aDtcbiAgICB0aGlzLmhlaWdodCA9IHNpemVzLmJveC5oZWlnaHQ7XG4gICAgdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXhXaWR0aCA9ICcnO1xuICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXBhaW50IERPTSBhZGRpdGlvbmFsIGNvbXBvbmVudHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXBhaW50RG9tQWRkaXRpb25hbHMoKSB7XG4gICAgdGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHRoaXMuZG9tLmJveCk7XG4gICAgdGhpcy5fcmVwYWludERlbGV0ZUJ1dHRvbih0aGlzLmRvbS5ib3gpO1xuICAgIHRoaXMuX3JlcGFpbnREcmFnQ2VudGVyKCk7XG4gICAgdGhpcy5fcmVwYWludERyYWdMZWZ0KCk7XG4gICAgdGhpcy5fcmVwYWludERyYWdSaWdodCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGl0ZW1cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuUXVldWU9ZmFsc2VdICByZXR1cm4gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZWRyYXcgcXVldWUgaWYgcmV0dXJuUXVldWU9dHJ1ZVxuICAgKi9cbiAgcmVkcmF3KHJldHVyblF1ZXVlKSB7XG4gICAgbGV0IHNpemVzO1xuICAgIGNvbnN0IHF1ZXVlID0gW1xuICAgICAgLy8gY3JlYXRlIGl0ZW0gRE9NXG4gICAgICB0aGlzLl9jcmVhdGVEb21FbGVtZW50LmJpbmQodGhpcyksXG5cbiAgICAgIC8vIGFwcGVuZCBET00gdG8gcGFyZW50IERPTVxuICAgICAgdGhpcy5fYXBwZW5kRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuXG4gICAgICAvLyB1cGRhdGUgZGlydHkgRE9NIFxuICAgICAgdGhpcy5fdXBkYXRlRGlydHlEb21Db21wb25lbnRzLmJpbmQodGhpcyksXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICBzaXplcyA9IHRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVEb21Db21wb25lbnRzU2l6ZXMuYmluZCh0aGlzKShzaXplcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIHJlcGFpbnQgRE9NIGFkZGl0aW9uYWxzXG4gICAgICB0aGlzLl9yZXBhaW50RG9tQWRkaXRpb25hbHMuYmluZCh0aGlzKVxuICAgIF07XG5cbiAgICBpZiAocmV0dXJuUXVldWUpIHtcbiAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHF1ZXVlLmZvckVhY2goZm4gPT4ge1xuICAgICAgICByZXN1bHQgPSBmbigpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBpdGVtIGluIHRoZSBET00gKHdoZW4gbm90IGFscmVhZHkgdmlzaWJsZSkuIFRoZSBpdGVtcyBET00gd2lsbFxuICAgKiBiZSBjcmVhdGVkIHdoZW4gbmVlZGVkLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXR1cm5RdWV1ZT1mYWxzZV0gIHdoZXRoZXIgdG8gcmV0dXJuIGEgcXVldWUgb2YgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgaW5zdGVhZCBvZiBqdXN0IGV4ZWN1dGluZyB0aGVtXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZWRyYXcgcXVldWUgaWYgcmV0dXJuUXVldWU9dHJ1ZVxuICAgKi9cbiAgc2hvdyhyZXR1cm5RdWV1ZSkge1xuICAgIGlmICghdGhpcy5kaXNwbGF5ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZHJhdyhyZXR1cm5RdWV1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIGl0ZW0gZnJvbSB0aGUgRE9NICh3aGVuIHZpc2libGUpXG4gICAqL1xuICBoaWRlKCkge1xuICAgIGlmICh0aGlzLmRpc3BsYXllZCkge1xuICAgICAgY29uc3QgYm94ID0gdGhpcy5kb20uYm94O1xuXG4gICAgICBpZiAoYm94LnBhcmVudE5vZGUpIHtcbiAgICAgICAgYm94LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYm94KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kaXNwbGF5ZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwb3NpdGlvbiB0aGUgaXRlbSBob3Jpem9udGFsbHlcbiAgICogQHBhcmFtIHtib29sZWFufSBbbGltaXRTaXplPXRydWVdIElmIHRydWUgKGRlZmF1bHQpLCB0aGUgd2lkdGggb2YgdGhlIHJhbmdlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtIHdpbGwgYmUgbGltaXRlZCwgYXMgdGhlIGJyb3dzZXIgY2Fubm90XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHZlcnkgd2lkZSBkaXZzLiBUaGlzIG1lYW5zIHRob3VnaFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGUgYXBwbGllZCBsZWZ0IGFuZCB3aWR0aCBtYXlcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb3JyZXNwb25kIHRvIHRoZSByYW5nZXMgc3RhcnQgYW5kIGVuZFxuICAgKiBAT3ZlcnJpZGVcbiAgICovXG4gIHJlcG9zaXRpb25YKGxpbWl0U2l6ZSkge1xuICAgIGNvbnN0IHBhcmVudFdpZHRoID0gdGhpcy5wYXJlbnQud2lkdGg7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5zdGFydCk7XG4gICAgbGV0IGVuZCA9IHRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuZW5kKTtcbiAgICBjb25zdCBhbGlnbiA9IHRoaXMuZGF0YS5hbGlnbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLmFsaWduIDogdGhpcy5kYXRhLmFsaWduO1xuICAgIGxldCBjb250ZW50U3RhcnRQb3NpdGlvbjtcbiAgICBsZXQgY29udGVudFdpZHRoO1xuXG4gICAgLy8gbGltaXQgdGhlIHdpZHRoIG9mIHRoZSByYW5nZSwgYXMgYnJvd3NlcnMgY2Fubm90IGRyYXcgdmVyeSB3aWRlIGRpdnNcbiAgICAvLyB1bmxlc3MgbGltaXRTaXplOiBmYWxzZSBpcyBleHBsaWNpdGx5IHNldCBpbiBpdGVtIGRhdGFcbiAgICBpZiAodGhpcy5kYXRhLmxpbWl0U2l6ZSAhPT0gZmFsc2UgJiYgKGxpbWl0U2l6ZSA9PT0gdW5kZWZpbmVkIHx8IGxpbWl0U2l6ZSA9PT0gdHJ1ZSkpIHtcbiAgICAgIGlmIChzdGFydCA8IC1wYXJlbnRXaWR0aCkge1xuICAgICAgICBzdGFydCA9IC1wYXJlbnRXaWR0aDtcbiAgICAgIH1cbiAgICAgIGlmIChlbmQgPiAyICogcGFyZW50V2lkdGgpIHtcbiAgICAgICAgZW5kID0gMiAqIHBhcmVudFdpZHRoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vcm91bmQgdG8gMyBkZWNpbWFscyB0byBjb21wZW5zYXRlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyByb3VuZGluZ1xuICAgIGNvbnN0IGJveFdpZHRoID0gTWF0aC5tYXgoTWF0aC5yb3VuZCgoZW5kIC0gc3RhcnQpICogMTAwMCkgLyAxMDAwLCAxKTtcblxuICAgIGlmICh0aGlzLm92ZXJmbG93KSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgICB0aGlzLnJpZ2h0ID0gc3RhcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxlZnQgPSBzdGFydDtcbiAgICAgIH1cbiAgICAgIHRoaXMud2lkdGggPSBib3hXaWR0aCArIHRoaXMucHJvcHMuY29udGVudC53aWR0aDtcbiAgICAgIGNvbnRlbnRXaWR0aCA9IHRoaXMucHJvcHMuY29udGVudC53aWR0aDtcblxuICAgICAgLy8gTm90ZTogVGhlIGNhbGN1bGF0aW9uIG9mIHdpZHRoIGlzIGFuIG9wdGltaXN0aWMgY2FsY3VsYXRpb24sIGdpdmluZ1xuICAgICAgLy8gICAgICAgYSB3aWR0aCB3aGljaCB3aWxsIG5vdCBjaGFuZ2Ugd2hlbiBtb3ZpbmcgdGhlIFRpbWVsaW5lXG4gICAgICAvLyAgICAgICBTbyBubyByZS1zdGFja2luZyBuZWVkZWQsIHdoaWNoIGlzIG5pY2VyIGZvciB0aGUgZXllO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgIHRoaXMucmlnaHQgPSBzdGFydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGVmdCA9IHN0YXJ0O1xuICAgICAgfVxuICAgICAgdGhpcy53aWR0aCA9IGJveFdpZHRoO1xuICAgICAgY29udGVudFdpZHRoID0gTWF0aC5taW4oZW5kIC0gc3RhcnQsIHRoaXMucHJvcHMuY29udGVudC53aWR0aCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke3RoaXMucmlnaHQgKiAtMX1weClgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvbS5ib3guc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHt0aGlzLmxlZnR9cHgpYDtcbiAgICB9XG4gICAgdGhpcy5kb20uYm94LnN0eWxlLndpZHRoID0gYCR7Ym94V2lkdGh9cHhgO1xuICAgIGlmICh0aGlzLndoaXRlU3BhY2UpIHtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmRvbS5ib3gub2Zmc2V0SGVpZ2h0O1xuICAgIH1cblxuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICB0aGlzLmRvbS5jb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKDApJztcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVYID0gTWF0aC5tYXgoKGJveFdpZHRoIC0gY29udGVudFdpZHRoKSwgMCkgKiAtMTtcbiAgICAgICAgICB0aGlzLmRvbS5jb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlWH1weClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtNYXRoLm1heCgoYm94V2lkdGggLSBjb250ZW50V2lkdGgpLCAwKX1weClgO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZVggPSBNYXRoLm1heCgoYm94V2lkdGggLSBjb250ZW50V2lkdGgpIC8gMiwgMCkgKiAtMTtcbiAgICAgICAgICB0aGlzLmRvbS5jb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlWH1weClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtNYXRoLm1heCgoYm94V2lkdGggLSBjb250ZW50V2lkdGgpIC8gMiwgMCl9cHgpYDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6IC8vICdhdXRvJ1xuICAgICAgICAvLyB3aGVuIHJhbmdlIGV4Y2VlZHMgbGVmdCBvZiB0aGUgd2luZG93LCBwb3NpdGlvbiB0aGUgY29udGVudHMgYXQgdGhlIGxlZnQgb2YgdGhlIHZpc2libGUgYXJlYVxuICAgICAgICBpZiAodGhpcy5vdmVyZmxvdykge1xuICAgICAgICAgIGlmIChlbmQgPiAwKSB7XG4gICAgICAgICAgICBjb250ZW50U3RhcnRQb3NpdGlvbiA9IE1hdGgubWF4KC1zdGFydCwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29udGVudFN0YXJ0UG9zaXRpb24gPSAtY29udGVudFdpZHRoOyAvLyBlbnN1cmUgaXQncyBub3QgdmlzaWJsZSBhbnltb3JlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChzdGFydCA8IDApIHtcbiAgICAgICAgICAgIGNvbnRlbnRTdGFydFBvc2l0aW9uID0gLXN0YXJ0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRlbnRTdGFydFBvc2l0aW9uID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgICBjb25zdCB0cmFuc2xhdGVYID0gY29udGVudFN0YXJ0UG9zaXRpb24gKiAtMTtcbiAgICAgICAgICB0aGlzLmRvbS5jb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7dHJhbnNsYXRlWH1weClgO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtjb250ZW50U3RhcnRQb3NpdGlvbn1weClgO1xuICAgICAgICAgIC8vIHRoaXMuZG9tLmNvbnRlbnQuc3R5bGUud2lkdGggPSBgY2FsYygxMDAlIC0gJHtjb250ZW50U3RhcnRQb3NpdGlvbn1weClgO1xuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9zaXRpb24gdGhlIGl0ZW0gdmVydGljYWxseVxuICAgKiBAT3ZlcnJpZGVcbiAgICovXG4gIHJlcG9zaXRpb25ZKCkge1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW07XG4gICAgY29uc3QgYm94ID0gdGhpcy5kb20uYm94O1xuXG4gICAgaWYgKG9yaWVudGF0aW9uID09ICd0b3AnKSB7XG4gICAgICBib3guc3R5bGUudG9wID0gYCR7dGhpcy50b3B9cHhgO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGJveC5zdHlsZS50b3AgPSBgJHt0aGlzLnBhcmVudC5oZWlnaHQgLSB0aGlzLnRvcCAtIHRoaXMuaGVpZ2h0fXB4YDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwYWludCBhIGRyYWcgYXJlYSBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSByYW5nZSB3aGVuIHRoZSByYW5nZSBpcyBzZWxlY3RlZFxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBfcmVwYWludERyYWdMZWZ0KCkge1xuICAgIGlmICgodGhpcy5zZWxlY3RlZCB8fCB0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUucmFuZ2UpICYmIHRoaXMuZWRpdGFibGUudXBkYXRlVGltZSAmJiAhdGhpcy5kb20uZHJhZ0xlZnQpIHtcbiAgICAgIC8vIGNyZWF0ZSBhbmQgc2hvdyBkcmFnIGFyZWFcbiAgICAgIGNvbnN0IGRyYWdMZWZ0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkcmFnTGVmdC5jbGFzc05hbWUgPSAndmlzLWRyYWctbGVmdCc7XG4gICAgICBkcmFnTGVmdC5kcmFnTGVmdEl0ZW0gPSB0aGlzO1xuXG4gICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQoZHJhZ0xlZnQpO1xuICAgICAgdGhpcy5kb20uZHJhZ0xlZnQgPSBkcmFnTGVmdDtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgIXRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5yYW5nZSAmJiB0aGlzLmRvbS5kcmFnTGVmdCkge1xuICAgICAgLy8gZGVsZXRlIGRyYWcgYXJlYVxuICAgICAgaWYgKHRoaXMuZG9tLmRyYWdMZWZ0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5kb20uZHJhZ0xlZnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnTGVmdCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRvbS5kcmFnTGVmdCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgYSBkcmFnIGFyZWEgb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHJhbmdlIHdoZW4gdGhlIHJhbmdlIGlzIHNlbGVjdGVkXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBhaW50RHJhZ1JpZ2h0KCkge1xuICAgIGlmICgodGhpcy5zZWxlY3RlZCB8fCB0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUucmFuZ2UpICYmIHRoaXMuZWRpdGFibGUudXBkYXRlVGltZSAmJiAhdGhpcy5kb20uZHJhZ1JpZ2h0KSB7XG4gICAgICAvLyBjcmVhdGUgYW5kIHNob3cgZHJhZyBhcmVhXG4gICAgICBjb25zdCBkcmFnUmlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRyYWdSaWdodC5jbGFzc05hbWUgPSAndmlzLWRyYWctcmlnaHQnO1xuICAgICAgZHJhZ1JpZ2h0LmRyYWdSaWdodEl0ZW0gPSB0aGlzO1xuXG4gICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQoZHJhZ1JpZ2h0KTtcbiAgICAgIHRoaXMuZG9tLmRyYWdSaWdodCA9IGRyYWdSaWdodDtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXRoaXMuc2VsZWN0ZWQgJiYgIXRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5yYW5nZSAmJiB0aGlzLmRvbS5kcmFnUmlnaHQpIHtcbiAgICAgIC8vIGRlbGV0ZSBkcmFnIGFyZWFcbiAgICAgIGlmICh0aGlzLmRvbS5kcmFnUmlnaHQucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmRvbS5kcmFnUmlnaHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnUmlnaHQpO1xuICAgICAgfVxuICAgICAgdGhpcy5kb20uZHJhZ1JpZ2h0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuUmFuZ2VJdGVtLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lID0gJ3Zpcy1pdGVtIHZpcy1yYW5nZSc7XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yIEJhY2tncm91bmRJdGVtXG4gKiBAZXh0ZW5kcyBJdGVtXG4gKi9cbmNsYXNzIEJhY2tncm91bmRJdGVtIGV4dGVuZHMgSXRlbSB7XG4gIC8qKlxuICogQGNvbnN0cnVjdG9yIEJhY2tncm91bmRJdGVtXG4gKiBAcGFyYW0ge09iamVjdH0gZGF0YSAgICAgICAgICAgICBPYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIHN0YXJ0LCBlbmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQsIGNsYXNzTmFtZS5cbiAqIEBwYXJhbSB7e3RvU2NyZWVuOiBmdW5jdGlvbiwgdG9UaW1lOiBmdW5jdGlvbn19IGNvbnZlcnNpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20gdGltZSB0byBzY3JlZW4gYW5kIHZpY2UgdmVyc2FcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gICAgICAgIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZGVzY3JpYmUgb3B0aW9uc1xuICogLy8gVE9ETzogaW1wbGVtZW50IHN1cHBvcnQgZm9yIHRoZSBCYWNrZ3JvdW5kSXRlbSBqdXN0IGhhdmluZyBhIHN0YXJ0LCB0aGVuIGJlaW5nIGRpc3BsYXllZCBhcyBhIHNvcnQgb2YgYW4gYW5ub3RhdGlvblxuICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIGNvbnZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBzdXBlcihkYXRhLCBjb252ZXJzaW9uLCBvcHRpb25zKTtcbiAgICB0aGlzLnByb3BzID0ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICB3aWR0aDogMFxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vdmVyZmxvdyA9IGZhbHNlOyAvLyBpZiBjb250ZW50cyBjYW4gb3ZlcmZsb3cgKGNzcyBzdHlsaW5nKSwgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlXG5cbiAgICAvLyB2YWxpZGF0ZSBkYXRhXG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIGlmIChkYXRhLnN0YXJ0ID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwic3RhcnRcIiBtaXNzaW5nIGluIGl0ZW0gJHtkYXRhLmlkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGEuZW5kID09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3BlcnR5IFwiZW5kXCIgbWlzc2luZyBpbiBpdGVtICR7ZGF0YS5pZH1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGlzIGl0ZW0gaXMgdmlzaWJsZSBpbnNpZGUgZ2l2ZW4gcmFuZ2VcbiAgICogQHBhcmFtIHt0aW1lbGluZS5SYW5nZX0gcmFuZ2Ugd2l0aCBhIHRpbWVzdGFtcCBmb3Igc3RhcnQgYW5kIGVuZFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2aXNpYmxlXG4gICAqL1xuICBpc1Zpc2libGUocmFuZ2UpIHtcbiAgICAvLyBkZXRlcm1pbmUgdmlzaWJpbGl0eVxuICAgIHJldHVybiAodGhpcy5kYXRhLnN0YXJ0IDwgcmFuZ2UuZW5kKSAmJiAodGhpcy5kYXRhLmVuZCA+IHJhbmdlLnN0YXJ0KTsgXG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIERPTSBlbGVtZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAvLyBjcmVhdGUgRE9NXG4gICAgICB0aGlzLmRvbSA9IHt9O1xuXG4gICAgICAvLyBiYWNrZ3JvdW5kIGJveFxuICAgICAgdGhpcy5kb20uYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAvLyBjbGFzc05hbWUgaXMgdXBkYXRlZCBpbiByZWRyYXcoKVxuXG4gICAgICAvLyBmcmFtZSBib3ggKHRvIHByZXZlbnQgdGhlIGl0ZW0gY29udGVudHMgZnJvbSBvdmVyZmxvd2luZ1xuICAgICAgdGhpcy5kb20uZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtaXRlbS1vdmVyZmxvdyc7XG4gICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpO1xuXG4gICAgICAvLyBjb250ZW50cyBib3hcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtLWNvbnRlbnQnO1xuICAgICAgdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCk7XG5cbiAgICAgIC8vIE5vdGU6IHdlIGRvIE5PVCBhdHRhY2ggdGhpcyBpdGVtIGFzIGF0dHJpYnV0ZSB0byB0aGUgRE9NLFxuICAgICAgLy8gICAgICAgc3VjaCB0aGF0IGJhY2tncm91bmQgaXRlbXMgY2Fubm90IGJlIHNlbGVjdGVkXG4gICAgICAvL3RoaXMuZG9tLmJveFsndmlzLWl0ZW0nXSA9IHRoaXM7XG5cbiAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBhcHBlbmQgRE9NIGVsZW1lbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hcHBlbmREb21FbGVtZW50KCkge1xuICAgIGlmICghdGhpcy5wYXJlbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRvbS5ib3gucGFyZW50Tm9kZSkge1xuICAgICAgY29uc3QgYmFja2dyb3VuZCA9IHRoaXMucGFyZW50LmRvbS5iYWNrZ3JvdW5kO1xuICAgICAgaWYgKCFiYWNrZ3JvdW5kKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGJhY2tncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgIH1cbiAgICAgIGJhY2tncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KTtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZSBET00gRGlydHkgY29tcG9uZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cygpIHtcbiAgICAvLyB1cGRhdGUgZGlydHkgRE9NLiBBbiBpdGVtIGlzIG1hcmtlZCBkaXJ0eSB3aGVuOlxuICAgIC8vIC0gdGhlIGl0ZW0gaXMgbm90IHlldCByZW5kZXJlZFxuICAgIC8vIC0gdGhlIGl0ZW0ncyBkYXRhIGlzIGNoYW5nZWRcbiAgICAvLyAtIHRoZSBpdGVtIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWRcbiAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgdGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCk7XG4gICAgICB0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5jb250ZW50KTtcbiAgICAgIHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7XG5cbiAgICAgIC8vIHVwZGF0ZSBjbGFzc1xuICAgICAgY29uc3QgY2xhc3NOYW1lID0gKHRoaXMuZGF0YS5jbGFzc05hbWUgPyAoJyAnICsgdGhpcy5kYXRhLmNsYXNzTmFtZSkgOiAnJykgK1xuICAgICAgICAgICh0aGlzLnNlbGVjdGVkID8gJyB2aXMtc2VsZWN0ZWQnIDogJycpO1xuICAgICAgdGhpcy5kb20uYm94LmNsYXNzTmFtZSA9IHRoaXMuYmFzZUNsYXNzTmFtZSArIGNsYXNzTmFtZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IERPTSBjb21wb25lbnRzIHNpemVzXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXREb21Db21wb25lbnRzU2l6ZXMoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGZyb20gY3NzIHdoZXRoZXIgdGhpcyBib3ggaGFzIG92ZXJmbG93XG4gICAgdGhpcy5vdmVyZmxvdyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuZG9tLmNvbnRlbnQpLm92ZXJmbG93ICE9PSAnaGlkZGVuJztcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDoge1xuICAgICAgICB3aWR0aDogdGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiB1cGRhdGUgRE9NIGNvbXBvbmVudHMgc2l6ZXNcbiAgICogQHBhcmFtIHtvYmplY3R9IHNpemVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzKHNpemVzKSB7XG4gICAgLy8gcmVjYWxjdWxhdGUgc2l6ZVxuICAgIHRoaXMucHJvcHMuY29udGVudC53aWR0aCA9IHNpemVzLmNvbnRlbnQud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSAwOyAvLyBzZXQgaGVpZ2h0IHplcm8sIHNvIHRoaXMgaXRlbSB3aWxsIGJlIGlnbm9yZWQgd2hlbiBzdGFja2luZyBpdGVtc1xuXG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlcGFpbnQgRE9NIGFkZGl0aW9uYWxzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVwYWludERvbUFkZGl0aW9uYWxzKCkge1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGl0ZW1cbiAgICogQHBhcmFtIHtib29sZWFufSBbcmV0dXJuUXVldWU9ZmFsc2VdICByZXR1cm4gdGhlIHF1ZXVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRoZSByZWRyYXcgcmVzdWx0IG9yIHRoZSByZWRyYXcgcXVldWUgaWYgcmV0dXJuUXVldWU9dHJ1ZVxuICAgKi9cbiAgcmVkcmF3KHJldHVyblF1ZXVlKSB7XG4gICAgbGV0IHNpemVzO1xuICAgIGNvbnN0IHF1ZXVlID0gW1xuICAgICAgLy8gY3JlYXRlIGl0ZW0gRE9NXG4gICAgICB0aGlzLl9jcmVhdGVEb21FbGVtZW50LmJpbmQodGhpcyksXG5cbiAgICAgIC8vIGFwcGVuZCBET00gdG8gcGFyZW50IERPTVxuICAgICAgdGhpcy5fYXBwZW5kRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuXG4gICAgICB0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxcblxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHNpemVzID0gdGhpcy5fZ2V0RG9tQ29tcG9uZW50c1NpemVzLmJpbmQodGhpcykoKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKHNpemVzKTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gcmVwYWludCBET00gYWRkaXRpb25hbHNcbiAgICAgIHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXG4gICAgXTtcblxuICAgIGlmIChyZXR1cm5RdWV1ZSkge1xuICAgICAgcmV0dXJuIHF1ZXVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgcXVldWUuZm9yRWFjaChmbiA9PiB7XG4gICAgICAgIHJlc3VsdCA9IGZuKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcG9zaXRpb24gdGhlIGl0ZW0gdmVydGljYWxseVxuICAgKiBAT3ZlcnJpZGVcbiAgICovXG4gIHJlcG9zaXRpb25ZKG1hcmdpbikgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGxldCBoZWlnaHQ7XG4gICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtcblxuICAgIC8vIHNwZWNpYWwgcG9zaXRpb25pbmcgZm9yIHN1Ymdyb3Vwc1xuICAgIGlmICh0aGlzLmRhdGEuc3ViZ3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVE9ETzogaW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBzdWJncm91cHMgaGVyZSBmb3IgZXZlcnkgQmFja2dyb3VuZEl0ZW0sIGNhbGN1bGF0ZSB0aGUgdG9wIG9mIHRoZSBzdWJncm91cCBvbmNlIGluIEl0ZW1zZXRcbiAgICAgIGNvbnN0IGl0ZW1TdWJncm91cCA9IHRoaXMuZGF0YS5zdWJncm91cDtcblxuICAgICAgdGhpcy5kb20uYm94LnN0eWxlLmhlaWdodCA9IGAke3RoaXMucGFyZW50LnN1Ymdyb3Vwc1tpdGVtU3ViZ3JvdXBdLmhlaWdodH1weGA7XG5cbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PSAndG9wJykgeyBcbiAgICAgICAgdGhpcy5kb20uYm94LnN0eWxlLnRvcCA9IGAke3RoaXMucGFyZW50LnRvcCArIHRoaXMucGFyZW50LnN1Ymdyb3Vwc1tpdGVtU3ViZ3JvdXBdLnRvcH1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRvbS5ib3guc3R5bGUudG9wID0gYCR7dGhpcy5wYXJlbnQudG9wICsgdGhpcy5wYXJlbnQuaGVpZ2h0IC0gdGhpcy5wYXJlbnQuc3ViZ3JvdXBzW2l0ZW1TdWJncm91cF0udG9wIC0gdGhpcy5wYXJlbnQuc3ViZ3JvdXBzW2l0ZW1TdWJncm91cF0uaGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b20gPSAnJztcbiAgICB9XG4gICAgLy8gYW5kIGluIHRoZSBjYXNlIG9mIG5vIHN1Ymdyb3VwczpcbiAgICBlbHNlIHtcbiAgICAgIC8vIHdlIHdhbnQgYmFja2dyb3VuZHMgd2l0aCBncm91cHMgdG8gb25seSBzaG93IGluIGdyb3Vwcy5cbiAgICAgIGlmICh0aGlzLnBhcmVudCBpbnN0YW5jZW9mIEJhY2tncm91bmRHcm91cCkge1xuICAgICAgICAvLyBpZiB0aGUgaXRlbSBpcyBub3QgaW4gYSBncm91cDpcbiAgICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5wYXJlbnQuaGVpZ2h0LFxuICAgICAgICAgICAgdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQsXG4gICAgICAgICAgICB0aGlzLnBhcmVudC5pdGVtU2V0LmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCk7XG4gICAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b20gPSBvcmllbnRhdGlvbiA9PSAnYm90dG9tJyA/ICcwJyA6ICcnO1xuICAgICAgICB0aGlzLmRvbS5ib3guc3R5bGUudG9wID0gb3JpZW50YXRpb24gPT0gJ3RvcCcgPyAnMCcgOiAnJztcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBoZWlnaHQgPSB0aGlzLnBhcmVudC5oZWlnaHQ7XG4gICAgICAgIC8vIHNhbWUgYWxpZ25tZW50IGZvciBpdGVtcyB3aGVuIG9yaWVudGF0aW9uIGlzIHRvcCBvciBib3R0b21cbiAgICAgICAgdGhpcy5kb20uYm94LnN0eWxlLnRvcCA9IGAke3RoaXMucGFyZW50LnRvcH1weGA7XG4gICAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b20gPSAnJztcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5kb20uYm94LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gIH1cbn1cblxuQmFja2dyb3VuZEl0ZW0ucHJvdG90eXBlLmJhc2VDbGFzc05hbWUgPSAndmlzLWl0ZW0gdmlzLWJhY2tncm91bmQnO1xuXG5CYWNrZ3JvdW5kSXRlbS5wcm90b3R5cGUuc3RhY2sgPSBmYWxzZTtcblxuLyoqXG4gKiBTaG93IHRoZSBpdGVtIGluIHRoZSBET00gKHdoZW4gbm90IGFscmVhZHkgdmlzaWJsZSkuIFRoZSBpdGVtcyBET00gd2lsbFxuICogYmUgY3JlYXRlZCB3aGVuIG5lZWRlZC5cbiAqL1xuQmFja2dyb3VuZEl0ZW0ucHJvdG90eXBlLnNob3cgPSBSYW5nZUl0ZW0ucHJvdG90eXBlLnNob3c7XG5cbi8qKlxuICogSGlkZSB0aGUgaXRlbSBmcm9tIHRoZSBET00gKHdoZW4gdmlzaWJsZSlcbiAqIEByZXR1cm4ge0Jvb2xlYW59IGNoYW5nZWRcbiAqL1xuQmFja2dyb3VuZEl0ZW0ucHJvdG90eXBlLmhpZGUgPSBSYW5nZUl0ZW0ucHJvdG90eXBlLmhpZGU7XG5cbi8qKlxuICogUmVwb3NpdGlvbiB0aGUgaXRlbSBob3Jpem9udGFsbHlcbiAqIEBPdmVycmlkZVxuICovXG5CYWNrZ3JvdW5kSXRlbS5wcm90b3R5cGUucmVwb3NpdGlvblggPSBSYW5nZUl0ZW0ucHJvdG90eXBlLnJlcG9zaXRpb25YO1xuXG4vKipcbiAqIFBvcHVwIGlzIGEgY2xhc3MgdG8gY3JlYXRlIGEgcG9wdXAgd2luZG93IHdpdGggc29tZSB0ZXh0XG4gKi9cbmNsYXNzIFBvcHVwIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gY29udGFpbmVyICAgICAgIFRoZSBjb250YWluZXIgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gIG92ZXJmbG93TWV0aG9kICBIb3cgdGhlIHBvcHVwIHNob3VsZCBhY3QgdG8gb3ZlcmZsb3dpbmcgKCdmbGlwJywgJ2NhcCcgb3IgJ25vbmUnKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29udGFpbmVyLCBvdmVyZmxvd01ldGhvZCkge1xuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMub3ZlcmZsb3dNZXRob2QgPSBvdmVyZmxvd01ldGhvZCB8fCAnY2FwJztcblxuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLnBhZGRpbmcgPSA1O1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGZyYW1lXG4gICAgdGhpcy5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZnJhbWUuY2xhc3NOYW1lID0gJ3Zpcy10b29sdGlwJztcbiAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0geCAgIEhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHBvcHVwIHdpbmRvd1xuICAgKiBAcGFyYW0ge251bWJlcn0geSAgIFZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBwb3B1cCB3aW5kb3dcbiAgICovXG4gIHNldFBvc2l0aW9uKHgsIHkpIHtcbiAgICB0aGlzLnggPSBwYXJzZUludCh4KTtcbiAgICB0aGlzLnkgPSBwYXJzZUludCh5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbnRlbnQgZm9yIHRoZSBwb3B1cCB3aW5kb3cuIFRoaXMgY2FuIGJlIEhUTUwgY29kZSBvciB0ZXh0LlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IEVsZW1lbnR9IGNvbnRlbnRcbiAgICovXG4gIHNldFRleHQoY29udGVudCkge1xuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGhpcy5mcmFtZS5pbm5lckhUTUwgPSAnJztcbiAgICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5mcmFtZS5pbm5lckhUTUwgPSB1dGlsLnhzcyhjb250ZW50KTsgLy8gc3RyaW5nIGNvbnRhaW5pbmcgdGV4dCBvciBIVE1MXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHBvcHVwIHdpbmRvd1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkb1Nob3ddICAgIFNob3cgb3IgaGlkZSB0aGUgd2luZG93XG4gICAqL1xuICBzaG93KGRvU2hvdykge1xuICAgIGlmIChkb1Nob3cgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZG9TaG93ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoZG9TaG93ID09PSB0cnVlKSB7XG4gICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgd2lkdGggPSB0aGlzLmZyYW1lLmNsaWVudFdpZHRoO1xuICAgICAgdmFyIG1heEhlaWdodCA9IHRoaXMuZnJhbWUucGFyZW50Tm9kZS5jbGllbnRIZWlnaHQ7XG4gICAgICB2YXIgbWF4V2lkdGggPSB0aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHZhciBsZWZ0ID0gMCwgdG9wID0gMDtcblxuICAgICAgaWYgKHRoaXMub3ZlcmZsb3dNZXRob2QgPT0gJ2ZsaXAnIHx8IHRoaXMub3ZlcmZsb3dNZXRob2QgPT0gJ25vbmUnKSB7XG4gICAgICAgIGxldCBpc0xlZnQgPSBmYWxzZSwgaXNUb3AgPSB0cnVlOyAvLyBXaGVyZSBhcm91bmQgdGhlIHBvc2l0aW9uIGl0J3MgbG9jYXRlZFxuXG4gICAgICAgIGlmICh0aGlzLm92ZXJmbG93TWV0aG9kID09ICdmbGlwJykge1xuICAgICAgICAgIGlmICh0aGlzLnkgLSBoZWlnaHQgPCB0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIGlzVG9wID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMueCArIHdpZHRoID4gbWF4V2lkdGggLSB0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgICAgIGlzTGVmdCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzTGVmdCkge1xuICAgICAgICAgIGxlZnQgPSB0aGlzLnggLSB3aWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZWZ0ID0gdGhpcy54O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzVG9wKSB7XG4gICAgICAgICAgdG9wID0gdGhpcy55IC0gaGVpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRvcCA9IHRoaXMueTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gdGhpcy5vdmVyZmxvd01ldGhvZCA9PSAnY2FwJ1xuICAgICAgICB0b3AgPSAodGhpcy55IC0gaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRvcCArIGhlaWdodCArIHRoaXMucGFkZGluZyA+IG1heEhlaWdodCkge1xuICAgICAgICAgIHRvcCA9IG1heEhlaWdodCAtIGhlaWdodCAtIHRoaXMucGFkZGluZztcbiAgICAgICAgfVxuICAgICAgICBpZiAodG9wIDwgdGhpcy5wYWRkaW5nKSB7XG4gICAgICAgICAgdG9wID0gdGhpcy5wYWRkaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVmdCA9IHRoaXMueDtcbiAgICAgICAgaWYgKGxlZnQgKyB3aWR0aCArIHRoaXMucGFkZGluZyA+IG1heFdpZHRoKSB7XG4gICAgICAgICAgbGVmdCA9IG1heFdpZHRoIC0gd2lkdGggLSB0aGlzLnBhZGRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnQgPCB0aGlzLnBhZGRpbmcpIHtcbiAgICAgICAgICBsZWZ0ID0gdGhpcy5wYWRkaW5nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZnJhbWUuc3R5bGUubGVmdCA9IGxlZnQgKyBcInB4XCI7XG4gICAgICB0aGlzLmZyYW1lLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwidmlzaWJsZVwiO1xuICAgICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgcG9wdXAgd2luZG93XG4gICAqL1xuICBoaWRlKCkge1xuICAgIHRoaXMuaGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmZyYW1lLnN0eWxlLmxlZnQgPSBcIjBcIjtcbiAgICB0aGlzLmZyYW1lLnN0eWxlLnRvcCA9IFwiMFwiO1xuICAgIHRoaXMuZnJhbWUuc3R5bGUudmlzaWJpbGl0eSA9IFwiaGlkZGVuXCI7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBwb3B1cCB3aW5kb3dcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpOyAvLyBSZW1vdmUgZWxlbWVudCBmcm9tIERPTVxuICB9XG59XG5cbi8qKlxuICogQ2x1c3Rlckl0ZW1cbiAqL1xuY2xhc3MgQ2x1c3Rlckl0ZW0gZXh0ZW5kcyBJdGVtIHtcbiAgLyoqXG4gKiBAY29uc3RydWN0b3IgSXRlbVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgICAgICAgICAgICAgT2JqZWN0IGNvbnRhaW5pbmcgKG9wdGlvbmFsKSBwYXJhbWV0ZXJzIHR5cGUsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBjb250ZW50LCBncm91cCwgY2xhc3NOYW1lLlxuICogQHBhcmFtIHt7dG9TY3JlZW46IGZ1bmN0aW9uLCB0b1RpbWU6IGZ1bmN0aW9ufX0gY29udmVyc2lvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSB0aW1lIHRvIHNjcmVlbiBhbmQgdmljZSB2ZXJzYVxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAgICAgICAgQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBkZXNjcmliZSBhdmFpbGFibGUgb3B0aW9uc1xuICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIGNvbnZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICBjb25zdCBtb2RpZmllZE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB7Zml0T25Eb3VibGVDbGljazogdHJ1ZX0sIG9wdGlvbnMsIHtlZGl0YWJsZTogZmFsc2V9KTtcbiAgICBzdXBlcihkYXRhLCBjb252ZXJzaW9uLCBtb2RpZmllZE9wdGlvbnMpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHtcbiAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgd2lkdGg6IDAsXG4gICAgICAgIGhlaWdodDogMFxuICAgICAgfSxcbiAgICB9O1xuICAgIFxuICAgIGlmICghZGF0YSB8fCBkYXRhLnVpSXRlbXMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwidWlJdGVtc1wiIG1pc3NpbmcgaW4gaXRlbSAnICsgZGF0YS5pZCk7XG4gICAgfVxuICBcbiAgICB0aGlzLmlkID0gdjQoKTtcbiAgICB0aGlzLmdyb3VwID0gZGF0YS5ncm91cDtcbiAgICB0aGlzLl9zZXR1cFJhbmdlKCk7XG4gIFxuICAgIHRoaXMuZW1pdHRlciA9IHRoaXMuZGF0YS5ldmVudEVtaXR0ZXI7XG4gICAgdGhpcy5yYW5nZSA9IHRoaXMuZGF0YS5yYW5nZTtcbiAgICB0aGlzLmF0dGFjaGVkID0gZmFsc2U7XG4gICAgdGhpcy5pc0NsdXN0ZXIgPSB0cnVlO1xuICAgIHRoaXMuZGF0YS5pc0NsdXN0ZXIgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIGNoZWNrIGlmIHRoZXJlIGFyZSBpdGVtc1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgaGFzSXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS51aUl0ZW1zICYmIHRoaXMuZGF0YS51aUl0ZW1zLmxlbmd0aCAmJiB0aGlzLmF0dGFjaGVkO1xuICB9XG4gIFxuICAvKipcbiAgICogc2V0IFVJIGl0ZW1zXG4gICAqIEBwYXJhbSB7YXJyYXl9IGl0ZW1zXG4gICAqL1xuICBzZXRVaUl0ZW1zKGl0ZW1zKSB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgXG4gICAgdGhpcy5kYXRhLnVpSXRlbXMgPSBpdGVtcztcbiAgXG4gICAgdGhpcy5fc2V0dXBSYW5nZSgpO1xuICBcbiAgICB0aGlzLmF0dGFjaCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogY2hlY2sgaXMgdmlzaWJsZVxuICAgKiBAcGFyYW0ge29iamVjdH0gcmFuZ2VcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGlzVmlzaWJsZShyYW5nZSkge1xuICAgIGNvbnN0IHJhbmdlV2lkdGggPSB0aGlzLmRhdGEuZW5kID8gdGhpcy5kYXRhLmVuZCAtIHRoaXMuZGF0YS5zdGFydCA6IDA7XG4gICAgY29uc3Qgd2lkdGhJbk1zID0gdGhpcy53aWR0aCAqIHJhbmdlLmdldE1pbGxpc2Vjb25kc1BlclBpeGVsKCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5tYXgodGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKSArIHJhbmdlV2lkdGgsIHRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCkgKyB3aWR0aEluTXMpO1xuICAgIHJldHVybiAodGhpcy5kYXRhLnN0YXJ0IDwgcmFuZ2UuZW5kKSAmJiAoZW5kID4gcmFuZ2Uuc3RhcnQpICYmIHRoaXMuaGFzSXRlbXMoKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIGdldCBjbHVzdGVyIGRhdGFcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgZ2V0RGF0YSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaXNDbHVzdGVyOiB0cnVlLFxuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpdGVtczogdGhpcy5kYXRhLml0ZW1zIHx8IFtdLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogcmVkcmF3IGNsdXN0ZXIgaXRlbVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJldHVyblF1ZXVlXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICByZWRyYXcgKHJldHVyblF1ZXVlKSB7XG4gICAgdmFyIHNpemVzO1xuICAgIHZhciBxdWV1ZSA9IFtcbiAgICAgIC8vIGNyZWF0ZSBpdGVtIERPTVxuICAgICAgdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuICBcbiAgICAgIC8vIGFwcGVuZCBET00gdG8gcGFyZW50IERPTVxuICAgICAgdGhpcy5fYXBwZW5kRG9tRWxlbWVudC5iaW5kKHRoaXMpLFxuICBcbiAgICAgIC8vIHVwZGF0ZSBkaXJ0eSBET01cbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cy5iaW5kKHRoaXMpLFxuICBcbiAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmRpcnR5KSB7XG4gICAgICAgICAgc2l6ZXMgPSB0aGlzLl9nZXREb21Db21wb25lbnRzU2l6ZXMoKTtcbiAgICAgICAgfVxuICAgICAgfSkuYmluZCh0aGlzKSxcbiAgXG4gICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKHNpemVzKTtcbiAgICAgICAgfVxuICAgICAgfSkuYmluZCh0aGlzKSxcbiAgXG4gICAgICAvLyByZXBhaW50IERPTSBhZGRpdGlvbmFsc1xuICAgICAgdGhpcy5fcmVwYWludERvbUFkZGl0aW9uYWxzLmJpbmQodGhpcylcbiAgICBdO1xuICBcbiAgICBpZiAocmV0dXJuUXVldWUpIHtcbiAgICAgIHJldHVybiBxdWV1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHF1ZXVlLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJlc3VsdCA9IGZuKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogc2hvdyBjbHVzdGVyIGl0ZW1cbiAgICovXG4gIHNob3coKSB7XG4gICAgaWYgKCF0aGlzLmRpc3BsYXllZCkge1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBIaWRlIHRoZSBpdGVtIGZyb20gdGhlIERPTSAod2hlbiB2aXNpYmxlKVxuICAgKi9cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5kaXNwbGF5ZWQpIHtcbiAgICAgIHZhciBkb20gPSB0aGlzLmRvbTtcbiAgICAgIGlmIChkb20uYm94LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZG9tLmJveC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRvbS5ib3gpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNob3dTdGlwZXMpIHtcbiAgICAgICAgaWYgKGRvbS5saW5lLnBhcmVudE5vZGUpICB7XG4gICAgICAgICAgZG9tLmxpbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkb20ubGluZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRvbS5kb3QucGFyZW50Tm9kZSkgIHtcbiAgICAgICAgICBkb20uZG90LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZG9tLmRvdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuZGlzcGxheWVkID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogcmVwb3NpdGlvbiBpdGVtIHggYXhpc1xuICAgKi9cbiAgcmVwb3NpdGlvblgoKSB7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5zdGFydCk7XG4gICAgbGV0IGVuZCA9IHRoaXMuZGF0YS5lbmQgPyB0aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLmVuZCkgOiAwO1xuICAgIGlmIChlbmQpIHtcbiAgICAgIHRoaXMucmVwb3NpdGlvblhXaXRoUmFuZ2VzKHN0YXJ0LCBlbmQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgYWxpZ24gPSB0aGlzLmRhdGEuYWxpZ24gPT09IHVuZGVmaW5lZCA/IHRoaXMub3B0aW9ucy5hbGlnbiA6IHRoaXMuZGF0YS5hbGlnbjtcbiAgICAgIHRoaXMucmVwb3NpdGlvblhXaXRob3V0UmFuZ2VzKHN0YXJ0LCBhbGlnbik7XG4gICAgfVxuICBcbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dTdGlwZXMpIHtcbiAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUuZGlzcGxheSA9IHRoaXMuX2lzU3RpcGVWaXNpYmxlKCkgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgICAgdGhpcy5kb20uZG90LnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9pc1N0aXBlVmlzaWJsZSgpID8gJ2Jsb2NrJyA6ICdub25lJztcblxuICAgICAgaWYgKHRoaXMuX2lzU3RpcGVWaXNpYmxlKCkpIHtcbiAgICAgICAgdGhpcy5yZXBvc2l0aW9uU3R5cGUoc3RhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJlcG9zaXRpb24gaXRlbSBzdHlwZVxuICAgKiBAcGFyYW0ge2RhdGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7ZGF0ZX0gZW5kXG4gICAqL1xuICByZXBvc2l0aW9uU3R5cGUoc3RhcnQsIGVuZCkge1xuICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgdGhpcy5kb20uZG90LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIGNvbnN0IGxpbmVPZmZzZXRXaWR0aCA9IHRoaXMuZG9tLmxpbmUub2Zmc2V0V2lkdGg7XG4gICAgY29uc3QgZG90T2Zmc2V0V2lkdGggPSB0aGlzLmRvbS5kb3Qub2Zmc2V0V2lkdGg7XG5cbiAgICBpZiAoZW5kKSB7XG4gICAgICBjb25zdCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldFdpZHRoICsgc3RhcnQgKyAoZW5kIC0gc3RhcnQpIC8gMjtcbiAgICAgIGNvbnN0IGRvdE9mZnNldCA9IGxpbmVPZmZzZXQgLSBkb3RPZmZzZXRXaWR0aCAvIDI7XG4gICAgICBjb25zdCBsaW5lT2Zmc2V0RGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLnJ0bCA/IGxpbmVPZmZzZXQgKiAtMSA6IGxpbmVPZmZzZXQ7XG4gICAgICBjb25zdCBkb3RPZmZzZXREaXJlY3Rpb24gPSB0aGlzLm9wdGlvbnMucnRsID8gZG90T2Zmc2V0ICogLTEgOiBkb3RPZmZzZXQ7XG5cbiAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtsaW5lT2Zmc2V0RGlyZWN0aW9ufXB4KWA7XG4gICAgICB0aGlzLmRvbS5kb3Quc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtkb3RPZmZzZXREaXJlY3Rpb259cHgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbGluZU9mZnNldERpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5ydGwgPyAoc3RhcnQgKiAtMSkgOiBzdGFydDtcbiAgICAgIGNvbnN0IGRvdE9mZnNldERpcmVjdGlvbiA9IHRoaXMub3B0aW9ucy5ydGwgPyAoKHN0YXJ0IC0gZG90T2Zmc2V0V2lkdGggLyAyKSAqIC0xKSA6IChzdGFydCAtIGRvdE9mZnNldFdpZHRoIC8gMik7XG5cbiAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtsaW5lT2Zmc2V0RGlyZWN0aW9ufXB4KWA7XG4gICAgICB0aGlzLmRvbS5kb3Quc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVgoJHtkb3RPZmZzZXREaXJlY3Rpb259cHgpYDtcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiByZXBvc2l0aW9uIHggd2l0aG91dCByYW5nZXNcbiAgICogQHBhcmFtIHtkYXRlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYWxpZ25cbiAgICovXG4gIHJlcG9zaXRpb25YV2l0aG91dFJhbmdlcyhzdGFydCwgYWxpZ24pIHtcbiAgICAvLyBjYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgYm94XG4gICAgaWYgKGFsaWduID09ICdyaWdodCcpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgIHRoaXMucmlnaHQgPSBzdGFydCAtIHRoaXMud2lkdGg7XG4gIFxuICAgICAgICAvLyByZXBvc2l0aW9uIGJveCwgbGluZSwgYW5kIGRvdFxuICAgICAgICB0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQgPSB0aGlzLnJpZ2h0ICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGVmdCA9IHN0YXJ0IC0gdGhpcy53aWR0aDtcbiAgXG4gICAgICAgIC8vIHJlcG9zaXRpb24gYm94LCBsaW5lLCBhbmQgZG90XG4gICAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFsaWduID09ICdsZWZ0Jykge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgdGhpcy5yaWdodCA9IHN0YXJ0O1xuICBcbiAgICAgICAgLy8gcmVwb3NpdGlvbiBib3gsIGxpbmUsIGFuZCBkb3RcbiAgICAgICAgdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0ID0gdGhpcy5yaWdodCArICdweCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxlZnQgPSBzdGFydDtcbiAgXG4gICAgICAgIC8vIHJlcG9zaXRpb24gYm94LCBsaW5lLCBhbmQgZG90XG4gICAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0ID0gdGhpcy5sZWZ0ICsgJ3B4JztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZGVmYXVsdCBvciAnY2VudGVyJ1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgdGhpcy5yaWdodCA9IHN0YXJ0IC0gdGhpcy53aWR0aCAvIDI7XG4gIFxuICAgICAgICAvLyByZXBvc2l0aW9uIGJveCwgbGluZSwgYW5kIGRvdFxuICAgICAgICB0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQgPSB0aGlzLnJpZ2h0ICsgJ3B4JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGVmdCA9IHN0YXJ0IC0gdGhpcy53aWR0aCAvIDI7XG4gIFxuICAgICAgICAvLyByZXBvc2l0aW9uIGJveCwgbGluZSwgYW5kIGRvdFxuICAgICAgICB0aGlzLmRvbS5ib3guc3R5bGUubGVmdCA9IHRoaXMubGVmdCArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogcmVwb3NpdGlvbiB4IHdpdGggcmFuZ2VzXG4gICAqIEBwYXJhbSB7ZGF0ZX0gc3RhcnRcbiAgICogQHBhcmFtIHtkYXRlfSBlbmRcbiAgICovXG4gIHJlcG9zaXRpb25YV2l0aFJhbmdlcyhzdGFydCwgZW5kKSB7XG4gICAgbGV0IGJveFdpZHRoID0gTWF0aC5yb3VuZChNYXRoLm1heChlbmQgLSBzdGFydCArIDAuNSwgMSkpO1xuICBcbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5yaWdodCA9IHN0YXJ0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxlZnQgPSBzdGFydDtcbiAgICB9XG4gIFxuICAgIHRoaXMud2lkdGggPSBNYXRoLm1heChib3hXaWR0aCwgdGhpcy5taW5XaWR0aCB8fCAwKTtcbiAgXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgIHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodCA9IHRoaXMucmlnaHQgKyAncHgnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRvbS5ib3guc3R5bGUubGVmdCA9IHRoaXMubGVmdCArICdweCc7XG4gICAgfVxuICBcbiAgICB0aGlzLmRvbS5ib3guc3R5bGUud2lkdGggPSBib3hXaWR0aCArICdweCc7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiByZXBvc2l0aW9uIGl0ZW0geSBheGlzXG4gICAqL1xuICByZXBvc2l0aW9uWSgpIHtcbiAgICB2YXIgb3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtcbiAgICB2YXIgYm94ID0gdGhpcy5kb20uYm94O1xuICAgIGlmIChvcmllbnRhdGlvbiA9PSAndG9wJykge1xuICAgICAgYm94LnN0eWxlLnRvcCA9ICh0aGlzLnRvcCB8fCAwKSArICdweCc7XG4gICAgfSBlbHNlIHsgXG4gICAgICAvLyBvcmllbnRhdGlvbiAnYm90dG9tJ1xuICAgICAgYm94LnN0eWxlLnRvcCA9ICh0aGlzLnBhcmVudC5oZWlnaHQgLSB0aGlzLnRvcCAtIHRoaXMuaGVpZ2h0IHx8IDApICsgJ3B4JztcbiAgICB9XG4gIFxuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1N0aXBlcykge1xuICAgICAgaWYgKG9yaWVudGF0aW9uID09ICd0b3AnKSB7XG4gICAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUudG9wICAgID0gJzAnO1xuICAgICAgICB0aGlzLmRvbS5saW5lLnN0eWxlLmhlaWdodCA9ICh0aGlzLnBhcmVudC50b3AgKyB0aGlzLnRvcCArIDEpICsgJ3B4JztcbiAgICAgICAgdGhpcy5kb20ubGluZS5zdHlsZS5ib3R0b20gPSAnJztcbiAgICAgIH1cbiAgICAgIGVsc2UgeyBcbiAgICAgICAgLy8gb3JpZW50YXRpb24gJ2JvdHRvbSdcbiAgICAgICAgdmFyIGl0ZW1TZXRIZWlnaHQgPSB0aGlzLnBhcmVudC5pdGVtU2V0LnByb3BzLmhlaWdodDtcbiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBpdGVtU2V0SGVpZ2h0IC0gdGhpcy5wYXJlbnQudG9wIC0gdGhpcy5wYXJlbnQuaGVpZ2h0ICsgdGhpcy50b3A7XG4gICAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUudG9wICAgID0gKGl0ZW1TZXRIZWlnaHQgLSBsaW5lSGVpZ2h0KSArICdweCc7XG4gICAgICAgIHRoaXMuZG9tLmxpbmUuc3R5bGUuYm90dG9tID0gJzAnO1xuICAgICAgfVxuICAgIFxuICAgICAgdGhpcy5kb20uZG90LnN0eWxlLnRvcCA9ICgtdGhpcy5kb20uZG90Lm9mZnNldEhlaWdodCAvIDIpICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHdpZHRoIGxlZnRcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKi9cbiAgZ2V0V2lkdGhMZWZ0KCkge1xuICAgIHJldHVybiB0aGlzLndpZHRoIC8gMjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIGdldCB3aWR0aCByaWdodFxuICAgKiBAcmV0dXJuIHtudW1iZXJ9XG4gICAqL1xuICBnZXRXaWR0aFJpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLndpZHRoIC8gMjtcbiAgfVxuICBcbiAgLyoqXG4gICAqIG1vdmUgY2x1c3RlciBpdGVtXG4gICAqL1xuICBtb3ZlKCkge1xuICAgIHRoaXMucmVwb3NpdGlvblgoKTtcbiAgICB0aGlzLnJlcG9zaXRpb25ZKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBhdHRhY2hcbiAgICovXG4gIGF0dGFjaCgpIHtcbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZGF0YS51aUl0ZW1zKSB7XG4gICAgICBpdGVtLmNsdXN0ZXIgPSB0aGlzO1xuICAgIH1cbiAgXG4gICAgdGhpcy5kYXRhLml0ZW1zID0gdGhpcy5kYXRhLnVpSXRlbXMubWFwKGl0ZW0gPT4gaXRlbS5kYXRhKTtcblxuICAgIHRoaXMuYXR0YWNoZWQgPSB0cnVlO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogZGV0YWNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWNoRnJvbVBhcmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgZGV0YWNoKGRldGFjaEZyb21QYXJlbnQgPSBmYWxzZSkge1xuICAgIGlmICghdGhpcy5oYXNJdGVtcygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICBcbiAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZGF0YS51aUl0ZW1zKSB7XG4gICAgICBkZWxldGUgaXRlbS5jbHVzdGVyO1xuICAgIH1cbiAgXG4gICAgdGhpcy5hdHRhY2hlZCA9IGZhbHNlO1xuICBcbiAgICBpZiAoZGV0YWNoRnJvbVBhcmVudCAmJiB0aGlzLmdyb3VwKSB7XG4gICAgICB0aGlzLmdyb3VwLnJlbW92ZSh0aGlzKTtcbiAgICAgIHRoaXMuZ3JvdXAgPSBudWxsO1xuICAgIH1cbiAgXG4gICAgdGhpcy5kYXRhLml0ZW1zID0gW107XG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBoYW5kbGUgb24gZG91YmxlIGNsaWNrXG4gICAqL1xuICBfb25Eb3VibGVDbGljaygpIHtcbiAgIHRoaXMuX2ZpdCgpO1xuICB9XG4gIFxuICAvKipcbiAgICogc2V0IHJhbmdlXG4gICAqL1xuICBfc2V0dXBSYW5nZSgpIHtcbiAgICBjb25zdCBzdGF0cyA9IHRoaXMuZGF0YS51aUl0ZW1zLm1hcChpdGVtID0+ICh7XG4gICAgICBzdGFydDogaXRlbS5kYXRhLnN0YXJ0LnZhbHVlT2YoKSxcbiAgICAgIGVuZDogaXRlbS5kYXRhLmVuZCA/IGl0ZW0uZGF0YS5lbmQudmFsdWVPZigpIDogaXRlbS5kYXRhLnN0YXJ0LnZhbHVlT2YoKSxcbiAgICB9KSk7XG4gIFxuICAgIHRoaXMuZGF0YS5taW4gPSBNYXRoLm1pbiguLi5zdGF0cy5tYXAocyA9PiBNYXRoLm1pbihzLnN0YXJ0LCBzLmVuZCB8fCBzLnN0YXJ0KSkpO1xuICAgIHRoaXMuZGF0YS5tYXggPSBNYXRoLm1heCguLi5zdGF0cy5tYXAocyA9PiBNYXRoLm1heChzLnN0YXJ0LCBzLmVuZCB8fCBzLnN0YXJ0KSkpO1xuICAgIGNvbnN0IGNlbnRlcnMgPSB0aGlzLmRhdGEudWlJdGVtcy5tYXAoaXRlbSA9PiBpdGVtLmNlbnRlcik7XG4gICAgY29uc3QgYXZnID0gY2VudGVycy5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IHN1bSArIHZhbHVlLCAwKSAvIHRoaXMuZGF0YS51aUl0ZW1zLmxlbmd0aDtcbiAgXG4gICAgaWYgKHRoaXMuZGF0YS51aUl0ZW1zLnNvbWUoaXRlbSA9PiBpdGVtLmRhdGEuZW5kKSkge1xuICAgICAgLy8gY29udGFpbnMgcmFuZ2VzXG4gICAgICB0aGlzLmRhdGEuc3RhcnQgPSBuZXcgRGF0ZSh0aGlzLmRhdGEubWluKTtcbiAgICAgIHRoaXMuZGF0YS5lbmQgPSBuZXcgRGF0ZSh0aGlzLmRhdGEubWF4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhLnN0YXJ0ID0gbmV3IERhdGUoYXZnKTtcbiAgICAgIHRoaXMuZGF0YS5lbmQgPSBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIGdldCBVSSBpdGVtc1xuICAgKiBAcmV0dXJuIHthcnJheX1cbiAgICovXG4gIF9nZXRVaUl0ZW1zKCkge1xuICAgIGlmICh0aGlzLmRhdGEudWlJdGVtcyAmJiB0aGlzLmRhdGEudWlJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmRhdGEudWlJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmNsdXN0ZXIgPT09IHRoaXMpO1xuICAgIH1cbiAgXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIFxuICAvKipcbiAgICogY3JlYXRlIERPTSBlbGVtZW50XG4gICAqL1xuICBfY3JlYXRlRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuZG9tKSB7XG4gICAgICAvLyBjcmVhdGUgRE9NXG4gICAgICB0aGlzLmRvbSA9IHt9O1xuICBcbiAgICAgIC8vIGNyZWF0ZSBtYWluIGJveFxuICAgICAgdGhpcy5kb20uYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gIFxuICAgICAgLy8gY29udGVudHMgYm94IChpbnNpZGUgdGhlIGJhY2tncm91bmQgYm94KS4gdXNlZCBmb3IgbWFraW5nIG1hcmdpbnNcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgIHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtLWNvbnRlbnQnO1xuICAgICAgXG4gICAgICB0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCk7XG4gIFxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zaG93U3RpcGVzKSB7XG4gICAgICAgIC8vIGxpbmUgdG8gYXhpc1xuICAgICAgICB0aGlzLmRvbS5saW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7XG4gICAgICAgIHRoaXMuZG9tLmxpbmUuY2xhc3NOYW1lID0gJ3Zpcy1jbHVzdGVyLWxpbmUnO1xuICAgICAgICB0aGlzLmRvbS5saW5lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIFxuICAgICAgICAvLyBkb3Qgb24gYXhpc1xuICAgICAgICB0aGlzLmRvbS5kb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdESVYnKTtcbiAgICAgICAgdGhpcy5kb20uZG90LmNsYXNzTmFtZSA9ICd2aXMtY2x1c3Rlci1kb3QnO1xuICAgICAgICB0aGlzLmRvbS5kb3Quc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIH1cbiAgXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmZpdE9uRG91YmxlQ2xpY2spIHtcbiAgICAgICAgdGhpcy5kb20uYm94Lm9uZGJsY2xpY2sgPSBDbHVzdGVySXRlbS5wcm90b3R5cGUuX29uRG91YmxlQ2xpY2suYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gYXR0YWNoIHRoaXMgaXRlbSBhcyBhdHRyaWJ1dGVcbiAgICAgIHRoaXMuZG9tLmJveFsndmlzLWl0ZW0nXSA9IHRoaXM7XG4gIFxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogYXBwZW5kIGVsZW1lbnQgdG8gRE9NXG4gICAqL1xuICBfYXBwZW5kRG9tRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWRyYXcgaXRlbTogbm8gcGFyZW50IGF0dGFjaGVkJyk7XG4gICAgfVxuICBcbiAgICBpZiAoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKSB7XG4gICAgICBjb25zdCBmb3JlZ3JvdW5kID0gdGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7XG4gICAgICBpZiAoIWZvcmVncm91bmQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudCcpO1xuICAgICAgfVxuICBcbiAgICAgIGZvcmVncm91bmQuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KTtcbiAgICB9XG4gIFxuICAgIGNvbnN0IGJhY2tncm91bmQgPSB0aGlzLnBhcmVudC5kb20uYmFja2dyb3VuZDtcbiAgXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93U3RpcGVzKSB7XG4gICAgICBpZiAoIXRoaXMuZG9tLmxpbmUucGFyZW50Tm9kZSkge1xuICAgICAgICBpZiAoIWJhY2tncm91bmQpIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGJhY2tncm91bmQgY29udGFpbmVyIGVsZW1lbnQnKTtcbiAgICAgICAgYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lKTtcbiAgICAgIH1cbiAgICBcbiAgICAgIGlmICghdGhpcy5kb20uZG90LnBhcmVudE5vZGUpIHtcbiAgICAgICAgdmFyIGF4aXMgPSB0aGlzLnBhcmVudC5kb20uYXhpcztcbiAgICAgICAgaWYgKCFiYWNrZ3JvdW5kKSB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBheGlzIGNvbnRhaW5lciBlbGVtZW50Jyk7XG4gICAgICAgIGF4aXMuYXBwZW5kQ2hpbGQodGhpcy5kb20uZG90KTtcbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIHRoaXMuZGlzcGxheWVkID0gdHJ1ZTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIHVwZGF0ZSBkaXJ0eSBET00gY29tcG9uZW50c1xuICAgKi9cbiAgX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cygpIHtcbiAgICAvLyBBbiBpdGVtIGlzIG1hcmtlZCBkaXJ0eSB3aGVuOlxuICAgIC8vIC0gdGhlIGl0ZW0gaXMgbm90IHlldCByZW5kZXJlZFxuICAgIC8vIC0gdGhlIGl0ZW0ncyBkYXRhIGlzIGNoYW5nZWRcbiAgICAvLyAtIHRoZSBpdGVtIGlzIHNlbGVjdGVkL2Rlc2VsZWN0ZWRcbiAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgdGhpcy5fdXBkYXRlQ29udGVudHModGhpcy5kb20uY29udGVudCk7XG4gICAgICB0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpO1xuICAgICAgdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20uYm94KTtcbiAgXG4gICAgICAvLyB1cGRhdGUgY2xhc3NcbiAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IHRoaXMuYmFzZUNsYXNzTmFtZSArICcgJyArICh0aGlzLmRhdGEuY2xhc3NOYW1lID8gJyAnICsgdGhpcy5kYXRhLmNsYXNzTmFtZSA6ICcnKSArXG4gICAgICAgICh0aGlzLnNlbGVjdGVkID8gJyB2aXMtc2VsZWN0ZWQnIDogJycpICsgJyB2aXMtcmVhZG9ubHknO1xuICAgICAgdGhpcy5kb20uYm94LmNsYXNzTmFtZSA9ICd2aXMtaXRlbSAnICsgY2xhc3NOYW1lO1xuICBcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1N0aXBlcykge1xuICAgICAgICB0aGlzLmRvbS5saW5lLmNsYXNzTmFtZSA9ICd2aXMtaXRlbSB2aXMtY2x1c3Rlci1saW5lICcgKyAgKHRoaXMuc2VsZWN0ZWQgPyAnIHZpcy1zZWxlY3RlZCcgOiAnJyk7XG4gICAgICAgIHRoaXMuZG9tLmRvdC5jbGFzc05hbWUgID0gJ3Zpcy1pdGVtIHZpcy1jbHVzdGVyLWRvdCAnICsgICh0aGlzLnNlbGVjdGVkID8gJyB2aXMtc2VsZWN0ZWQnIDogJycpO1xuICAgICAgfVxuICBcbiAgICAgIGlmICh0aGlzLmRhdGEuZW5kKSB7XG4gICAgICAgIC8vIHR1cm4gb2ZmIG1heC13aWR0aCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSB0aGUgcmVhbCB3aWR0aFxuICAgICAgICAvLyB0aGlzIGNhdXNlcyBhbiBleHRyYSBicm93c2VyIHJlcGFpbnQvcmVmbG93LCBidXQgc28gYmUgaXRcbiAgICAgICAgdGhpcy5kb20uY29udGVudC5zdHlsZS5tYXhXaWR0aCA9ICdub25lJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBnZXQgRE9NIGNvbXBvbmVudHMgc2l6ZXNcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgX2dldERvbUNvbXBvbmVudHNTaXplcygpIHtcbiAgICBjb25zdCBzaXplcyA9IHtcbiAgICAgIHByZXZpb3VzOiB7XG4gICAgICAgIHJpZ2h0OiB0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQsXG4gICAgICAgIGxlZnQ6IHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0XG4gICAgICB9LFxuICAgICAgYm94OiB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5ib3gub2Zmc2V0V2lkdGgsXG4gICAgICAgIGhlaWdodDogdGhpcy5kb20uYm94Lm9mZnNldEhlaWdodFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93U3RpcGVzKSB7XG4gICAgICBzaXplcy5kb3QgPSB7XG4gICAgICAgIGhlaWdodDogdGhpcy5kb20uZG90Lm9mZnNldEhlaWdodCxcbiAgICAgICAgd2lkdGg6IHRoaXMuZG9tLmRvdC5vZmZzZXRXaWR0aFxuICAgICAgfTtcbiAgICAgIHNpemVzLmxpbmUgPSB7XG4gICAgICAgIHdpZHRoOiB0aGlzLmRvbS5saW5lLm9mZnNldFdpZHRoXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzaXplcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIHVwZGF0ZSBET00gY29tcG9uZW50cyBzaXplc1xuICAgKiBAcGFyYW0ge29iamVjdH0gc2l6ZXNcbiAgICovXG4gIF91cGRhdGVEb21Db21wb25lbnRzU2l6ZXMoc2l6ZXMpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0ID0gXCIwcHhcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb20uYm94LnN0eWxlLmxlZnQgPSBcIjBweFwiO1xuICAgIH1cbiAgXG4gICAgLy8gcmVjYWxjdWxhdGUgc2l6ZVxuICAgIGlmICghdGhpcy5kYXRhLmVuZCkge1xuICAgICAgdGhpcy53aWR0aCA9IHNpemVzLmJveC53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5taW5XaWR0aCA9IHNpemVzLmJveC53aWR0aDtcbiAgICB9XG4gIFxuICAgIHRoaXMuaGVpZ2h0ID0gc2l6ZXMuYm94LmhlaWdodDtcbiAgXG4gICAgLy8gcmVzdG9yZSBwcmV2aW91cyBwb3NpdGlvblxuICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICB0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQgPSBzaXplcy5wcmV2aW91cy5yaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb20uYm94LnN0eWxlLmxlZnQgPSBzaXplcy5wcmV2aW91cy5sZWZ0O1xuICAgIH1cbiAgXG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICB9XG4gIFxuICAvKipcbiAgICogcmVwYWludCBET00gYWRkaXRpb25hbCBjb21wb25lbnRzXG4gICAqL1xuICBfcmVwYWludERvbUFkZGl0aW9uYWxzKCkge1xuICAgIHRoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0aGlzLmRvbS5ib3gpO1xuICB9XG4gIFxuICAvKipcbiAgICogY2hlY2sgaXMgc3RyaXBlIHZpc2libGVcbiAgICogQHJldHVybiB7bnVtYmVyfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2lzU3RpcGVWaXNpYmxlKCkge1xuICAgIHJldHVybiB0aGlzLm1pbldpZHRoID49IHRoaXMud2lkdGggfHwgIXRoaXMuZGF0YS5lbmQ7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBnZXQgZml0IHJhbmdlXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRGaXRSYW5nZSgpIHtcbiAgICBjb25zdCBvZmZzZXQgPSAwLjA1Kih0aGlzLmRhdGEubWF4IC0gdGhpcy5kYXRhLm1pbikgLyAyO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZml0U3RhcnQ6IHRoaXMuZGF0YS5taW4gLSBvZmZzZXQsXG4gICAgICAgIGZpdEVuZDogdGhpcy5kYXRhLm1heCArIG9mZnNldFxuICAgICAgfTtcbiAgfVxuICBcbiAgIC8qKlxuICAgKiBmaXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9maXQoKSB7XG4gICAgaWYgKHRoaXMuZW1pdHRlcikge1xuICAgICAgY29uc3Qge2ZpdFN0YXJ0LCBmaXRFbmR9ID0gdGhpcy5fZ2V0Rml0UmFuZ2UoKTtcbiAgXG4gICAgICBjb25zdCBmaXRBcmdzID0ge1xuICAgICAgICBzdGFydDogbmV3IERhdGUoZml0U3RhcnQpLFxuICAgICAgICBlbmQ6IG5ldyBEYXRlKGZpdEVuZCksXG4gICAgICAgIGFuaW1hdGlvbjogdHJ1ZVxuICAgICAgfTtcbiAgXG4gICAgICB0aGlzLmVtaXR0ZXIuZW1pdCgnZml0JywgZml0QXJncyk7XG4gICAgfVxuICB9XG5cbiAgIC8qKlxuICAgKiBnZXQgaXRlbSBkYXRhXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRJdGVtRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xuICB9XG59XG5cbkNsdXN0ZXJJdGVtLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lID0gJ3Zpcy1pdGVtIHZpcy1yYW5nZSB2aXMtY2x1c3Rlcic7XG5cbmNvbnN0IFVOR1JPVVBFRCQxID0gJ19fdW5ncm91cGVkX18nOyAgIC8vIHJlc2VydmVkIGdyb3VwIGlkIGZvciB1bmdyb3VwZWQgaXRlbXNcbmNvbnN0IEJBQ0tHUk9VTkQkMSA9ICdfX2JhY2tncm91bmRfXyc7IC8vIHJlc2VydmVkIGdyb3VwIGlkIGZvciBiYWNrZ3JvdW5kIGl0ZW1zIHdpdGhvdXQgZ3JvdXBcblxuY29uc3QgUmVzZXJ2ZWRHcm91cElkcyQxID0ge1xuICBVTkdST1VQRUQ6IFVOR1JPVVBFRCQxLFxuICBCQUNLR1JPVU5EOiBCQUNLR1JPVU5EJDFcbn07XG5cbi8qKlxuICogQW4gQ2x1c3RlciBnZW5lcmF0b3IgZ2VuZXJhdGVzIGNsdXN0ZXIgaXRlbXNcbiAqL1xuY2xhc3MgQ2x1c3RlckdlbmVyYXRvciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtJdGVtU2V0fSBpdGVtU2V0IGl0ZW1zU2V0IGluc3RhbmNlXG4gICAgICogQGNvbnN0cnVjdG9yIENsdXN0ZXJHZW5lcmF0b3JcbiAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGl0ZW1TZXQpIHtcbiAgICAgICAgdGhpcy5pdGVtU2V0ID0gaXRlbVNldDtcbiAgICAgICAgdGhpcy5ncm91cHMgPSB7fTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IHt9O1xuICAgICAgICB0aGlzLmNhY2hlWy0xXSA9IFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtRGF0YSAgICAgICAgICAgICBPYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIHN0YXJ0IGNvbnRlbnQsIGNsYXNzTmFtZS5cbiAgICAgKiBAcGFyYW0ge3t0b1NjcmVlbjogZnVuY3Rpb24sIHRvVGltZTogZnVuY3Rpb259fSBjb252ZXJzaW9uXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSB0aW1lIHRvIHNjcmVlbiBhbmQgdmljZSB2ZXJzYVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gICAgICAgIENvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgICAqIEByZXR1cm4ge09iamVjdH0gbmV3SXRlbVxuICAgICovXG4gICAgY3JlYXRlQ2x1c3Rlckl0ZW0oaXRlbURhdGEsIGNvbnZlcnNpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbmV3SXRlbSA9IG5ldyBDbHVzdGVySXRlbShpdGVtRGF0YSwgY29udmVyc2lvbiwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBuZXdJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgaXRlbXMgdG8gYmUgY2x1c3RlcmVkLlxuICAgICAqIFRoaXMgd2lsbCBjbGVhciBjYWNoZWQgY2x1c3RlcnMuXG4gICAgICogQHBhcmFtIHtJdGVtW119IGl0ZW1zXG4gICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgQXZhaWxhYmxlIG9wdGlvbnM6XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IGFwcGx5T25DaGFuZ2VkTGV2ZWxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSAoZGVmYXVsdCksIHRoZSBjaGFuZ2VkIGRhdGEgaXMgYXBwbGllZFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBzb29uIHRoZSBjbHVzdGVyIGxldmVsIGNoYW5nZXMuIElmIGZhbHNlLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY2hhbmdlZCBkYXRhIGlzIGFwcGxpZWQgaW1tZWRpYXRlbHlcbiAgICAgKi9cbiAgICBzZXRJdGVtcyhpdGVtcywgb3B0aW9ucykge1xuICAgICAgICB0aGlzLml0ZW1zID0gaXRlbXMgfHwgW107XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFwcGx5T25DaGFuZ2VkTGV2ZWwgPSBmYWxzZTtcblxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmFwcGx5T25DaGFuZ2VkTGV2ZWwpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlPbkNoYW5nZWRMZXZlbCA9IG9wdGlvbnMuYXBwbHlPbkNoYW5nZWRMZXZlbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgY3VycmVudCBkYXRhIHNldDogY2xlYXIgY2FjaGUsIGFuZCByZWNhbGN1bGF0ZSB0aGUgY2x1c3RlcmluZyBmb3JcbiAgICAgKiB0aGUgY3VycmVudCBsZXZlbFxuICAgICAqL1xuICAgIHVwZGF0ZURhdGEoKSB7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmFwcGx5T25DaGFuZ2VkTGV2ZWwgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbHVzdGVyIHRoZSBpdGVtcyB3aGljaCBhcmUgdG9vIGNsb3NlIHRvZ2V0aGVyXG4gICAgICogQHBhcmFtIHthcnJheX0gb2xkQ2x1c3RlcnMgXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNjYWxlICAgICAgVGhlIHNjYWxlIG9mIHRoZSBjdXJyZW50IHdpbmRvdyA6ICh3aW5kb3dXaWR0aCAvIChlbmREYXRlIC0gc3RhcnREYXRlKSkgXG4gICAgICogQHBhcmFtIHt7bWF4SXRlbXM6IG51bWJlciwgY2x1c3RlckNyaXRlcmlhOiBmdW5jdGlvbiwgdGl0bGVUZW1wbGF0ZTogc3RyaW5nfX0gb3B0aW9ucyAgICAgICAgICAgICBcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gY2x1c3RlcnNcbiAgICAqL1xuICAgIGdldENsdXN0ZXJzKG9sZENsdXN0ZXJzLCBzY2FsZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgeyBtYXhJdGVtcywgY2x1c3RlckNyaXRlcmlhIH0gPSB0eXBlb2Ygb3B0aW9ucyA9PT0gXCJib29sZWFuXCIgPyB7fSA6IG9wdGlvbnM7XG4gICAgXG4gICAgICAgIGlmICghY2x1c3RlckNyaXRlcmlhKSB7XG4gICAgICAgICAgICBjbHVzdGVyQ3JpdGVyaWEgPSAoKSA9PiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbWF4SXRlbXMgPSBtYXhJdGVtcyB8fCAxO1xuXG4gICAgICAgIGxldCBsZXZlbCA9IC0xO1xuICAgICAgICBsZXQgZ3JhbnVsYXJpdHkgPSAyO1xuICAgICAgICBsZXQgdGltZVdpbmRvdyA9IDA7XG5cbiAgICAgICAgaWYgKHNjYWxlID4gMCkge1xuICAgICAgICAgICAgaWYgKHNjYWxlID49IDEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldmVsID0gTWF0aC5hYnMoTWF0aC5yb3VuZChNYXRoLmxvZygxMDAgLyBzY2FsZSkgLyBNYXRoLmxvZyhncmFudWxhcml0eSkpKTtcbiAgICAgICAgICAgIHRpbWVXaW5kb3cgPSBNYXRoLmFicyhNYXRoLnBvdyhncmFudWxhcml0eSwgbGV2ZWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZSB3aGVuIGFuZCByZS1nZW5lcmF0ZSBncm91cHMgdGhlIGRhdGEgd2hlbiBuZWVkZWQuXG4gICAgICAgIGlmICh0aGlzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBsZXZlbENoYW5nZWQgPSAobGV2ZWwgIT0gdGhpcy5jYWNoZUxldmVsKTtcbiAgICAgICAgICAgIGNvbnN0IGFwcGx5RGF0YU5vdyA9IHRoaXMuYXBwbHlPbkNoYW5nZWRMZXZlbCA/IGxldmVsQ2hhbmdlZCA6IHRydWU7XG4gICAgICAgICAgICBpZiAoYXBwbHlEYXRhTm93KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJvcExldmVsc0NhY2hlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlsdGVyRGF0YSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWNoZUxldmVsID0gbGV2ZWw7XG4gICAgICAgIGxldCBjbHVzdGVycyA9IHRoaXMuY2FjaGVbbGV2ZWxdO1xuICAgICAgICBpZiAoIWNsdXN0ZXJzKSB7XG4gICAgICAgICAgICBjbHVzdGVycyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgZ3JvdXBOYW1lIGluIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGdyb3VwTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdyb3Vwc1tncm91cE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpTWF4ID0gaXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgaU1heCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCBhbGwgaXRlbXMgYXJvdW5kIGN1cnJlbnQgaXRlbSwgd2l0aGluIHRoZSB0aW1lV2luZG93XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5laWdoYm9ycyA9IDE7IC8vIHN0YXJ0IGF0IDEsIHRvIGluY2x1ZGUgaXRzZWxmKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggaXRlbXMgbGVmdCBmcm9tIHRoZSBjdXJyZW50IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gaSAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA+PSAwICYmIChpdGVtLmNlbnRlciAtIGl0ZW1zW2pdLmNlbnRlcikgPCB0aW1lV2luZG93IC8gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbXNbal0uY2x1c3RlciAmJiBjbHVzdGVyQ3JpdGVyaWEoaXRlbS5kYXRhLCBpdGVtc1tqXS5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWlnaGJvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggaXRlbXMgcmlnaHQgZnJvbSB0aGUgY3VycmVudCBpdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgayA9IGkgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGsgPCBpdGVtcy5sZW5ndGggJiYgKGl0ZW1zW2tdLmNlbnRlciAtIGl0ZW0uY2VudGVyKSA8IHRpbWVXaW5kb3cgLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJDcml0ZXJpYShpdGVtLmRhdGEsIGl0ZW1zW2tdLmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9ycysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgY3JlYXRlZCBjbHVzdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGwgPSBjbHVzdGVycy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwgPj0gMCAmJiAoaXRlbS5jZW50ZXIgLSBjbHVzdGVyc1tsXS5jZW50ZXIpIDwgdGltZVdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdyb3VwID09IGNsdXN0ZXJzW2xdLmdyb3VwICYmIGNsdXN0ZXJDcml0ZXJpYShpdGVtLmRhdGEsIGNsdXN0ZXJzW2xdLmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9ycysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsLS07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFnZ3JlZ2F0ZSB1bnRpbCB0aGUgbnVtYmVyIG9mIGl0ZW1zIGlzIHdpdGhpbiBtYXhJdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5laWdoYm9ycyA+IG1heEl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9vIGJ1c3kgaW4gdGhpcyB3aW5kb3cuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtID0gbmVpZ2hib3JzIC0gbWF4SXRlbXMgKyAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJJdGVtcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBpdGVtcyB0byB0aGUgY2x1c3RlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY2FsY3VsYXRlIHRoZSBhdmVyYWdlIHN0YXJ0IGZvciB0aGUgY2x1c3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2x1c3Rlckl0ZW1zLmxlbmd0aCA8IG51bSAmJiBtIDwgaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyQ3JpdGVyaWEoaXRlbXNbaV0uZGF0YSwgaXRlbXNbbV0uZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJJdGVtcy5wdXNoKGl0ZW1zW21dKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuaXRlbVNldC5nZXRHcm91cElkKGl0ZW0uZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLml0ZW1TZXQuZ3JvdXBzW2dyb3VwSWRdIHx8IHRoaXMuaXRlbVNldC5ncm91cHNbUmVzZXJ2ZWRHcm91cElkcyQxLlVOR1JPVVBFRF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNsdXN0ZXIgPSB0aGlzLl9nZXRDbHVzdGVyRm9ySXRlbXMoY2x1c3Rlckl0ZW1zLCBncm91cCwgb2xkQ2x1c3RlcnMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goY2x1c3Rlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IG51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGl0ZW0uY2x1c3RlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2FjaGVbbGV2ZWxdID0gY2x1c3RlcnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY2x1c3RlcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRoZSBpdGVtcyBwZXIgZ3JvdXAuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZmlsdGVyRGF0YSgpIHtcbiAgICAgICAgLy8gZmlsdGVyIHBlciBncm91cFxuICAgICAgICBjb25zdCBncm91cHMgPSB7fTtcbiAgICAgICAgdGhpcy5ncm91cHMgPSBncm91cHM7XG5cbiAgICAgICAgLy8gc3BsaXQgdGhlIGl0ZW1zIHBlciBncm91cFxuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLml0ZW1zKSkge1xuICAgICAgICAgICAgLy8gcHV0IHRoZSBpdGVtIGluIHRoZSBjb3JyZWN0IGdyb3VwXG4gICAgICAgICAgICBjb25zdCBncm91cE5hbWUgPSBpdGVtLnBhcmVudCA/IGl0ZW0ucGFyZW50Lmdyb3VwSWQgOiAnJztcbiAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3Vwc1tncm91cE5hbWVdO1xuICAgICAgICAgICAgaWYgKCFncm91cCkge1xuICAgICAgICAgICAgICAgIGdyb3VwID0gW107XG4gICAgICAgICAgICAgICAgZ3JvdXBzW2dyb3VwTmFtZV0gPSBncm91cDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyb3VwLnB1c2goaXRlbSk7XG5cbiAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgY2VudGVyIG9mIHRoZSBpdGVtXG4gICAgICAgICAgICBpZiAoaXRlbS5kYXRhLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5lbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jZW50ZXIgPSAoaXRlbS5kYXRhLnN0YXJ0LnZhbHVlT2YoKSArIGl0ZW0uZGF0YS5lbmQudmFsdWVPZigpKSAvIDI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gYm94LCBkb3RcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5jZW50ZXIgPSBpdGVtLmRhdGEuc3RhcnQudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNvcnQgdGhlIGl0ZW1zIHBlciBncm91cFxuICAgICAgICBmb3IgKGxldCBjdXJyZW50R3JvdXBOYW1lIGluIGdyb3Vwcykge1xuICAgICAgICAgICAgaWYgKGdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShjdXJyZW50R3JvdXBOYW1lKSkge1xuICAgICAgICAgICAgICAgIGdyb3Vwc1tjdXJyZW50R3JvdXBOYW1lXS5zb3J0KChhLCBiKSA9PiBhLmNlbnRlciAtIGIuY2VudGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0YUNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgbmV3IGNsdXN0ZXIgb3IgcmV0dXJuIGV4aXN0aW5nXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0ge2FycmF5fSBjbHVzdGVySXRlbXMgICAgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGdyb3VwIFxuICAgICAqIEBwYXJhbSB7YXJyYXl9IG9sZENsdXN0ZXJzIFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIFxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9IGNsdXN0ZXJcbiAgICAgKi9cbiAgICBfZ2V0Q2x1c3RlckZvckl0ZW1zKGNsdXN0ZXJJdGVtcywgZ3JvdXAsIG9sZENsdXN0ZXJzLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG9sZENsdXN0ZXJzTG9va3VwID0gKG9sZENsdXN0ZXJzIHx8IFtdKS5tYXAoY2x1c3RlciA9PiAoe1xuICAgICAgICAgICAgY2x1c3RlcixcbiAgICAgICAgICAgIGl0ZW1zSWRzOiBuZXcgU2V0KGNsdXN0ZXIuZGF0YS51aUl0ZW1zLm1hcChpdGVtID0+IGl0ZW0uaWQpKVxuICAgICAgICB9KSk7XG4gICAgICAgIGxldCBjbHVzdGVyO1xuICAgICAgICBpZiAob2xkQ2x1c3RlcnNMb29rdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBvbGRDbHVzdGVyRGF0YSBvZiBvbGRDbHVzdGVyc0xvb2t1cCkge1xuICAgICAgICAgICAgICAgIGlmIChvbGRDbHVzdGVyRGF0YS5pdGVtc0lkcy5zaXplID09PSBjbHVzdGVySXRlbXMubGVuZ3RoIFxuICAgICAgICAgICAgICAgICAgICAmJiBjbHVzdGVySXRlbXMuZXZlcnkoY2x1c3Rlckl0ZW0gPT4gb2xkQ2x1c3RlckRhdGEuaXRlbXNJZHMuaGFzKGNsdXN0ZXJJdGVtLmlkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlciA9IG9sZENsdXN0ZXJEYXRhLmNsdXN0ZXI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjbHVzdGVyKSB7XG4gICAgICAgICAgICBjbHVzdGVyLnNldFVpSXRlbXMoY2x1c3Rlckl0ZW1zKTtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyLmdyb3VwICE9PSBncm91cCkge1xuICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ3JvdXAucmVtb3ZlKGNsdXN0ZXIpOyAgICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkKGNsdXN0ZXIpOyAgICBcbiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5ncm91cCA9IGdyb3VwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbHVzdGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRpdGxlVGVtcGxhdGUgPSBvcHRpb25zLnRpdGxlVGVtcGxhdGUgfHwgJyc7XG4gICAgICAgIGNvbnN0IGNvbnZlcnNpb24gPSB7XG4gICAgICAgICAgICB0b1NjcmVlbjogdGhpcy5pdGVtU2V0LmJvZHkudXRpbC50b1NjcmVlbixcbiAgICAgICAgICAgIHRvVGltZTogdGhpcy5pdGVtU2V0LmJvZHkudXRpbC50b1RpbWVcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlVGVtcGxhdGUucmVwbGFjZSgve2NvdW50fS8sIGNsdXN0ZXJJdGVtcy5sZW5ndGgpO1xuICAgICAgICBjb25zdCBjbHVzdGVyQ29udGVudCA9ICc8ZGl2IHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiPicgKyBjbHVzdGVySXRlbXMubGVuZ3RoICsgJzwvZGl2Pic7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywgdGhpcy5pdGVtU2V0Lm9wdGlvbnMpO1xuICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQnOiBjbHVzdGVyQ29udGVudCxcbiAgICAgICAgICAgICd0aXRsZSc6IHRpdGxlLFxuICAgICAgICAgICAgJ2dyb3VwJzogZ3JvdXAsXG4gICAgICAgICAgICAndWlJdGVtcyc6IGNsdXN0ZXJJdGVtcyxcbiAgICAgICAgICAgICdldmVudEVtaXR0ZXInOiB0aGlzLml0ZW1TZXQuYm9keS5lbWl0dGVyLFxuICAgICAgICAgICAgJ3JhbmdlJzogdGhpcy5pdGVtU2V0LmJvZHkucmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgY2x1c3RlciA9IHRoaXMuY3JlYXRlQ2x1c3Rlckl0ZW0oZGF0YSxcbiAgICAgICAgY29udmVyc2lvbixcbiAgICAgICAgY2x1c3Rlck9wdGlvbnMpO1xuXG4gICAgICAgIGlmIChncm91cCkge1xuICAgICAgICAgICAgZ3JvdXAuYWRkKGNsdXN0ZXIpO1xuICAgICAgICAgICAgY2x1c3Rlci5ncm91cCA9IGdyb3VwO1xuICAgICAgICB9XG5cbiAgICAgICAgY2x1c3Rlci5hdHRhY2goKTtcblxuICAgICAgICByZXR1cm4gY2x1c3RlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wIGNhY2hlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfZHJvcExldmVsc0NhY2hlKCkge1xuICAgICAgICB0aGlzLmNhY2hlID0ge307XG4gICAgICAgIHRoaXMuY2FjaGVMZXZlbCA9IC0xO1xuICAgICAgICB0aGlzLmNhY2hlW3RoaXMuY2FjaGVMZXZlbF0gPSBbXTtcbiAgICB9XG59XG5cbmNvbnN0IFVOR1JPVVBFRCQyID0gJ19fdW5ncm91cGVkX18nOyAgIC8vIHJlc2VydmVkIGdyb3VwIGlkIGZvciB1bmdyb3VwZWQgaXRlbXNcbmNvbnN0IEJBQ0tHUk9VTkQkMiA9ICdfX2JhY2tncm91bmRfXyc7IC8vIHJlc2VydmVkIGdyb3VwIGlkIGZvciBiYWNrZ3JvdW5kIGl0ZW1zIHdpdGhvdXQgZ3JvdXBcblxuLyoqXG4gKiBBbiBJdGVtU2V0IGhvbGRzIGEgc2V0IG9mIGl0ZW1zIGFuZCByYW5nZXMgd2hpY2ggY2FuIGJlIGRpc3BsYXllZCBpbiBhXG4gKiByYW5nZS4gVGhlIHdpZHRoIGlzIGRldGVybWluZWQgYnkgdGhlIHBhcmVudCBvZiB0aGUgSXRlbVNldCwgYW5kIHRoZSBoZWlnaHRcbiAqIGlzIGRldGVybWluZWQgYnkgdGhlIHNpemUgb2YgdGhlIGl0ZW1zLlxuICovXG5jbGFzcyBJdGVtU2V0IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gKiBAcGFyYW0ge3tkb206IE9iamVjdCwgZG9tUHJvcHM6IE9iamVjdCwgZW1pdHRlcjogRW1pdHRlciwgcmFuZ2U6IFJhbmdlfX0gYm9keVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgIFNlZSBJdGVtU2V0LnNldE9wdGlvbnMgZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEBjb25zdHJ1Y3RvciBJdGVtU2V0XG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuICBjb25zdHJ1Y3Rvcihib2R5LCBvcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJvZHkgPSBib2R5O1xuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICB0eXBlOiBudWxsLCAgLy8gJ2JveCcsICdwb2ludCcsICdyYW5nZScsICdiYWNrZ3JvdW5kJ1xuICAgICAgb3JpZW50YXRpb246IHtcbiAgICAgICAgaXRlbTogJ2JvdHRvbScgICAvLyBpdGVtIG9yaWVudGF0aW9uOiAndG9wJyBvciAnYm90dG9tJ1xuICAgICAgfSxcbiAgICAgIGFsaWduOiAnYXV0bycsIC8vIGFsaWdubWVudCBvZiBib3ggaXRlbXNcbiAgICAgIHN0YWNrOiB0cnVlLFxuICAgICAgc3RhY2tTdWJncm91cHM6IHRydWUsXG4gICAgICBncm91cE9yZGVyU3dhcChmcm9tR3JvdXAsIHRvR3JvdXAsIGdyb3VwcykgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBjb25zdCB0YXJnZXRPcmRlciA9IHRvR3JvdXAub3JkZXI7XG4gICAgICAgIHRvR3JvdXAub3JkZXIgPSBmcm9tR3JvdXAub3JkZXI7XG4gICAgICAgIGZyb21Hcm91cC5vcmRlciA9IHRhcmdldE9yZGVyO1xuICAgICAgfSxcbiAgICAgIGdyb3VwT3JkZXI6ICdvcmRlcicsXG5cbiAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICBtdWx0aXNlbGVjdDogZmFsc2UsXG4gICAgICBsb25nU2VsZWN0UHJlc3NUaW1lOiAyNTEsXG4gICAgICBpdGVtc0Fsd2F5c0RyYWdnYWJsZToge1xuICAgICAgICBpdGVtOiBmYWxzZSxcbiAgICAgICAgcmFuZ2U6IGZhbHNlLFxuICAgICAgfSxcblxuICAgICAgZWRpdGFibGU6IHtcbiAgICAgICAgdXBkYXRlVGltZTogZmFsc2UsXG4gICAgICAgIHVwZGF0ZUdyb3VwOiBmYWxzZSxcbiAgICAgICAgYWRkOiBmYWxzZSxcbiAgICAgICAgcmVtb3ZlOiBmYWxzZSxcbiAgICAgICAgb3ZlcnJpZGVJdGVtczogZmFsc2VcbiAgICAgIH0sXG5cbiAgICAgIGdyb3VwRWRpdGFibGU6IHtcbiAgICAgICAgb3JkZXI6IGZhbHNlLFxuICAgICAgICBhZGQ6IGZhbHNlLFxuICAgICAgICByZW1vdmU6IGZhbHNlXG4gICAgICB9LFxuXG4gICAgICBzbmFwOiBUaW1lU3RlcC5zbmFwLFxuXG4gICAgICAvLyBPbmx5IGNhbGxlZCB3aGVuIGBvYmplY3REYXRhLnRhcmdldCA9PT0gJ2l0ZW0nLlxuICAgICAgb25Ecm9wT2JqZWN0T25JdGVtKG9iamVjdERhdGEsIGl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIG9uQWRkKGl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlKGl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIG9uTW92ZShpdGVtLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhpdGVtKTtcbiAgICAgIH0sXG4gICAgICBvblJlbW92ZShpdGVtLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhpdGVtKTtcbiAgICAgIH0sXG4gICAgICBvbk1vdmluZyhpdGVtLCBjYWxsYmFjaykge1xuICAgICAgICBjYWxsYmFjayhpdGVtKTtcbiAgICAgIH0sXG4gICAgICBvbkFkZEdyb3VwKGl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIG9uTW92ZUdyb3VwKGl0ZW0sIGNhbGxiYWNrKSB7XG4gICAgICAgIGNhbGxiYWNrKGl0ZW0pO1xuICAgICAgfSxcbiAgICAgIG9uUmVtb3ZlR3JvdXAoaXRlbSwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soaXRlbSk7XG4gICAgICB9LFxuXG4gICAgICBtYXJnaW46IHtcbiAgICAgICAgaXRlbToge1xuICAgICAgICAgIGhvcml6b250YWw6IDEwLFxuICAgICAgICAgIHZlcnRpY2FsOiAxMFxuICAgICAgICB9LFxuICAgICAgICBheGlzOiAyMFxuICAgICAgfSxcblxuICAgICAgc2hvd1Rvb2x0aXBzOiB0cnVlLFxuXG4gICAgICB0b29sdGlwOiB7XG4gICAgICAgIGZvbGxvd01vdXNlOiBmYWxzZSxcbiAgICAgICAgb3ZlcmZsb3dNZXRob2Q6ICdmbGlwJyxcbiAgICAgICAgZGVsYXk6IDUwMFxuICAgICAgfSxcblxuICAgICAgdG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWU6IGZhbHNlXG4gICAgfTtcblxuICAgIC8vIG9wdGlvbnMgaXMgc2hhcmVkIGJ5IHRoaXMgSXRlbVNldCBhbmQgYWxsIGl0cyBpdGVtc1xuICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRPcHRpb25zKTtcbiAgICB0aGlzLm9wdGlvbnMucnRsID0gb3B0aW9ucy5ydGw7XG4gICAgdGhpcy5vcHRpb25zLm9uVGltZW91dCA9IG9wdGlvbnMub25UaW1lb3V0O1xuXG4gICAgdGhpcy5jb252ZXJzaW9uID0ge1xuICAgICAgdG9TY3JlZW46IGJvZHkudXRpbC50b1NjcmVlbixcbiAgICAgIHRvVGltZTogYm9keS51dGlsLnRvVGltZVxuICAgIH07XG4gICAgdGhpcy5kb20gPSB7fTtcbiAgICB0aGlzLnByb3BzID0ge307XG4gICAgdGhpcy5oYW1tZXIgPSBudWxsO1xuICAgIFxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICB0aGlzLml0ZW1zRGF0YSA9IG51bGw7ICAgIC8vIERhdGFTZXRcbiAgICB0aGlzLmdyb3Vwc0RhdGEgPSBudWxsOyAgIC8vIERhdGFTZXRcbiAgICB0aGlzLml0ZW1zU2V0dGluZ1RpbWUgPSBudWxsO1xuICAgIHRoaXMuaW5pdGlhbEl0ZW1TZXREcmF3biA9IGZhbHNlO1xuICAgIHRoaXMudXNlckNvbnRpbnVlTm90QmFpbCA9IG51bGw7ICBcblxuICAgIHRoaXMuc2VxdWVudGlhbFNlbGVjdGlvbiA9IGZhbHNlO1xuICAgIFxuICAgIC8vIGxpc3RlbmVycyBmb3IgdGhlIERhdGFTZXQgb2YgdGhlIGl0ZW1zXG4gICAgdGhpcy5pdGVtTGlzdGVuZXJzID0ge1xuICAgICAgJ2FkZCcoZXZlbnQsIHBhcmFtcywgc2VuZGVySWQpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgICAgbWUuX29uQWRkKHBhcmFtcy5pdGVtcyk7XG4gICAgICAgIGlmIChtZS5vcHRpb25zLmNsdXN0ZXIpIHtcbiAgICAgICAgICBtZS5jbHVzdGVyR2VuZXJhdG9yLnNldEl0ZW1zKG1lLml0ZW1zLCB7IGFwcGx5T25DaGFuZ2VkTGV2ZWw6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICAgIG1lLnJlZHJhdygpO1xuICAgICAgfSxcbiAgICAgICd1cGRhdGUnKGV2ZW50LCBwYXJhbXMsIHNlbmRlcklkKSB7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgIG1lLl9vblVwZGF0ZShwYXJhbXMuaXRlbXMpO1xuICAgICAgICBpZiAobWUub3B0aW9ucy5jbHVzdGVyKSB7XG4gICAgICAgICAgbWUuY2x1c3RlckdlbmVyYXRvci5zZXRJdGVtcyhtZS5pdGVtcywgeyBhcHBseU9uQ2hhbmdlZExldmVsOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBtZS5yZWRyYXcoKTtcbiAgICAgIH0sXG4gICAgICAncmVtb3ZlJyhldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBtZS5fb25SZW1vdmUocGFyYW1zLml0ZW1zKTtcbiAgICAgICAgaWYgKG1lLm9wdGlvbnMuY2x1c3Rlcikge1xuICAgICAgICAgIG1lLmNsdXN0ZXJHZW5lcmF0b3Iuc2V0SXRlbXMobWUuaXRlbXMsIHsgYXBwbHlPbkNoYW5nZWRMZXZlbDogZmFsc2UgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbWUucmVkcmF3KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGxpc3RlbmVycyBmb3IgdGhlIERhdGFTZXQgb2YgdGhlIGdyb3Vwc1xuICAgIHRoaXMuZ3JvdXBMaXN0ZW5lcnMgPSB7XG4gICAgICAnYWRkJyhldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBtZS5fb25BZGRHcm91cHMocGFyYW1zLml0ZW1zKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChtZS5ncm91cHNEYXRhICYmIG1lLmdyb3Vwc0RhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBzRGF0YSA9IG1lLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpO1xuICAgICAgICAgICAgZ3JvdXBzRGF0YS5nZXQoKS5mb3JFYWNoKGdyb3VwRGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoZ3JvdXBEYXRhLm5lc3RlZEdyb3Vwcykge1xuICAgICAgICAgICAgICBpZiAoZ3JvdXBEYXRhLnNob3dOZXN0ZWQgIT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBncm91cERhdGEuc2hvd05lc3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IHVwZGF0ZWRHcm91cHMgPSBbXTtcbiAgICAgICAgICAgICAgZ3JvdXBEYXRhLm5lc3RlZEdyb3Vwcy5mb3JFYWNoKG5lc3RlZEdyb3VwSWQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWROZXN0ZWRHcm91cCA9IGdyb3Vwc0RhdGEuZ2V0KG5lc3RlZEdyb3VwSWQpO1xuICAgICAgICAgICAgICAgIGlmICghdXBkYXRlZE5lc3RlZEdyb3VwKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgIHVwZGF0ZWROZXN0ZWRHcm91cC5uZXN0ZWRJbkdyb3VwID0gZ3JvdXBEYXRhLmlkO1xuICAgICAgICAgICAgICAgIGlmIChncm91cERhdGEuc2hvd05lc3RlZCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlZE5lc3RlZEdyb3VwLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdXBkYXRlZEdyb3VwcyA9IHVwZGF0ZWRHcm91cHMuY29uY2F0KHVwZGF0ZWROZXN0ZWRHcm91cCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBncm91cHNEYXRhLnVwZGF0ZSh1cGRhdGVkR3JvdXBzLCBzZW5kZXJJZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAndXBkYXRlJyhldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBtZS5fb25VcGRhdGVHcm91cHMocGFyYW1zLml0ZW1zKTtcbiAgICAgIH0sXG4gICAgICAncmVtb3ZlJyhldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgICBtZS5fb25SZW1vdmVHcm91cHMocGFyYW1zLml0ZW1zKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5pdGVtcyA9IHt9OyAgICAgIC8vIG9iamVjdCB3aXRoIGFuIEl0ZW0gZm9yIGV2ZXJ5IGRhdGEgaXRlbVxuICAgIHRoaXMuZ3JvdXBzID0ge307ICAgICAvLyBHcm91cCBvYmplY3QgZm9yIGV2ZXJ5IGdyb3VwXG4gICAgdGhpcy5ncm91cElkcyA9IFtdO1xuXG4gICAgdGhpcy5zZWxlY3Rpb24gPSBbXTsgIC8vIGxpc3Qgd2l0aCB0aGUgaWRzIG9mIGFsbCBzZWxlY3RlZCBub2Rlc1xuXG4gICAgdGhpcy5wb3B1cCA9IG51bGw7XG4gICAgdGhpcy5wb3B1cFRpbWVyID0gbnVsbDtcblxuICAgIHRoaXMudG91Y2hQYXJhbXMgPSB7fTsgLy8gc3RvcmVzIHByb3BlcnRpZXMgd2hpbGUgZHJhZ2dpbmdcbiAgICB0aGlzLmdyb3VwVG91Y2hQYXJhbXMgPSB7XG4gICAgICBncm91cDogbnVsbCxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlXG4gICAgfTtcbiAgXG4gICAgLy8gY3JlYXRlIHRoZSBIVE1MIERPTVxuICAgIHRoaXMuX2NyZWF0ZSgpO1xuXG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIHRoaXMuY2x1c3RlcnMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEhUTUwgRE9NIGZvciB0aGUgSXRlbVNldFxuICAgKi9cbiAgX2NyZWF0ZSgpIHtcbiAgICBjb25zdCBmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtaXRlbXNldCc7XG4gICAgZnJhbWVbJ3Zpcy1pdGVtc2V0J10gPSB0aGlzO1xuICAgIHRoaXMuZG9tLmZyYW1lID0gZnJhbWU7XG5cbiAgICAvLyBjcmVhdGUgYmFja2dyb3VuZCBwYW5lbFxuICAgIGNvbnN0IGJhY2tncm91bmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBiYWNrZ3JvdW5kLmNsYXNzTmFtZSA9ICd2aXMtYmFja2dyb3VuZCc7XG4gICAgZnJhbWUuYXBwZW5kQ2hpbGQoYmFja2dyb3VuZCk7XG4gICAgdGhpcy5kb20uYmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG5cbiAgICAvLyBjcmVhdGUgZm9yZWdyb3VuZCBwYW5lbFxuICAgIGNvbnN0IGZvcmVncm91bmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBmb3JlZ3JvdW5kLmNsYXNzTmFtZSA9ICd2aXMtZm9yZWdyb3VuZCc7XG4gICAgZnJhbWUuYXBwZW5kQ2hpbGQoZm9yZWdyb3VuZCk7XG4gICAgdGhpcy5kb20uZm9yZWdyb3VuZCA9IGZvcmVncm91bmQ7XG5cbiAgICAvLyBjcmVhdGUgYXhpcyBwYW5lbFxuICAgIGNvbnN0IGF4aXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBheGlzLmNsYXNzTmFtZSA9ICd2aXMtYXhpcyc7XG4gICAgdGhpcy5kb20uYXhpcyA9IGF4aXM7XG5cbiAgICAvLyBjcmVhdGUgbGFiZWxzZXRcbiAgICBjb25zdCBsYWJlbFNldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGxhYmVsU2V0LmNsYXNzTmFtZSA9ICd2aXMtbGFiZWxzZXQnO1xuICAgIHRoaXMuZG9tLmxhYmVsU2V0ID0gbGFiZWxTZXQ7XG5cbiAgICAvLyBjcmVhdGUgdW5ncm91cGVkIEdyb3VwXG4gICAgdGhpcy5fdXBkYXRlVW5ncm91cGVkKCk7XG5cbiAgICAvLyBjcmVhdGUgYmFja2dyb3VuZCBHcm91cFxuICAgIGNvbnN0IGJhY2tncm91bmRHcm91cCA9IG5ldyBCYWNrZ3JvdW5kR3JvdXAoQkFDS0dST1VORCQyLCBudWxsLCB0aGlzKTtcbiAgICBiYWNrZ3JvdW5kR3JvdXAuc2hvdygpO1xuICAgIHRoaXMuZ3JvdXBzW0JBQ0tHUk9VTkQkMl0gPSBiYWNrZ3JvdW5kR3JvdXA7XG5cbiAgICAvLyBhdHRhY2ggZXZlbnQgbGlzdGVuZXJzXG4gICAgLy8gTm90ZTogd2UgYmluZCB0byB0aGUgY2VudGVyQ29udGFpbmVyIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaGVpZ2h0XG4gICAgLy8gICAgICAgb2YgdGhlIGNlbnRlciBjb250YWluZXIgaXMgbGFyZ2VyIHRoYW4gb2YgdGhlIEl0ZW1TZXQsIHNvIHdlXG4gICAgLy8gICAgICAgY2FuIGNsaWNrIGluIHRoZSBlbXB0eSBhcmVhIHRvIGNyZWF0ZSBhIG5ldyBpdGVtIG9yIGRlc2VsZWN0IGFuIGl0ZW0uXG4gICAgdGhpcy5oYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyKTtcblxuICAgIC8vIGRyYWcgaXRlbXMgd2hlbiBzZWxlY3RlZFxuICAgIHRoaXMuaGFtbWVyLm9uKCdoYW1tZXIuaW5wdXQnLCBldmVudCA9PiB7XG4gICAgICBpZiAoZXZlbnQuaXNGaXJzdCkge1xuICAgICAgICB0aGlzLl9vblRvdWNoKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFuc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFubW92ZScsICB0aGlzLl9vbkRyYWcuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5oYW1tZXIub24oJ3BhbmVuZCcsICAgdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpO1xuICAgIHRoaXMuaGFtbWVyLmdldCgncGFuJykuc2V0KHt0aHJlc2hvbGQ6NSwgZGlyZWN0aW9uOiBIYW1tZXIuQUxMfSk7XG5cbiAgICAvLyBzaW5nbGUgc2VsZWN0IChvciB1bnNlbGVjdCkgd2hlbiB0YXBwaW5nIGFuIGl0ZW1cbiAgICB0aGlzLmhhbW1lci5vbigndGFwJywgIHRoaXMuX29uU2VsZWN0SXRlbS5iaW5kKHRoaXMpKTtcblxuICAgIC8vIG11bHRpIHNlbGVjdCB3aGVuIGhvbGRpbmcgbW91c2UvdG91Y2gsIG9yIG9uIGN0cmwrY2xpY2tcbiAgICB0aGlzLmhhbW1lci5vbigncHJlc3MnLCB0aGlzLl9vbk11bHRpU2VsZWN0SXRlbS5iaW5kKHRoaXMpKTtcblxuICAgIC8vIGFkZCBpdGVtIG9uIGRvdWJsZXRhcFxuICAgIHRoaXMuaGFtbWVyLm9uKCdkb3VibGV0YXAnLCB0aGlzLl9vbkFkZEl0ZW0uYmluZCh0aGlzKSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5ncm91cEhhbW1lciA9IG5ldyBIYW1tZXIodGhpcy5ib2R5LmRvbS5yaWdodENvbnRhaW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ3JvdXBIYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuYm9keS5kb20ubGVmdENvbnRhaW5lcik7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuZ3JvdXBIYW1tZXIub24oJ3RhcCcsICAgICAgdGhpcy5fb25Hcm91cENsaWNrLmJpbmQodGhpcykpO1xuICAgIHRoaXMuZ3JvdXBIYW1tZXIub24oJ3BhbnN0YXJ0JywgdGhpcy5fb25Hcm91cERyYWdTdGFydC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmdyb3VwSGFtbWVyLm9uKCdwYW5tb3ZlJywgIHRoaXMuX29uR3JvdXBEcmFnLmJpbmQodGhpcykpO1xuICAgIHRoaXMuZ3JvdXBIYW1tZXIub24oJ3BhbmVuZCcsICAgdGhpcy5fb25Hcm91cERyYWdFbmQuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5ncm91cEhhbW1lci5nZXQoJ3BhbicpLnNldCh7dGhyZXNob2xkOjUsIGRpcmVjdGlvbjogSGFtbWVyLkRJUkVDVElPTl9WRVJUSUNBTH0pO1xuICAgIFxuICAgIHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIHRoaXMuX29uTW91c2VPdmVyLmJpbmQodGhpcykpO1xuICAgIHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JywgdGhpcy5fb25Nb3VzZU91dC5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTtcbiAgICAvLyByaWdodC1jbGljayBvbiB0aW1lbGluZSBcbiAgICB0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNld2hlZWwnLCB0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSk7XG5cbiAgICAvLyBhdHRhY2ggdG8gdGhlIERPTVxuICAgIHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBvcHRpb25zIGZvciB0aGUgSXRlbVNldC4gRXhpc3Rpbmcgb3B0aW9ucyB3aWxsIGJlIGV4dGVuZGVkL292ZXJ3cml0dGVuLlxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHR5cGUgZm9yIHRoZSBpdGVtcy4gQ2hvb3NlIGZyb20gJ2JveCdcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCksICdwb2ludCcsICdyYW5nZScsIG9yICdiYWNrZ3JvdW5kJy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBzdHlsZSBjYW4gYmUgb3ZlcndyaXR0ZW4gYnlcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIGl0ZW1zLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzdHJpbmd9IGFsaWduXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50IGZvciB0aGUgaXRlbXMsIG9ubHkgYXBwbGljYWJsZSBmb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3hJdGVtLiBDaG9vc2UgJ2NlbnRlcicgKGRlZmF1bHQpLCAnbGVmdCcsIG9yXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0Jy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7c3RyaW5nfSBvcmllbnRhdGlvbi5pdGVtXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JpZW50YXRpb24gb2YgdGhlIGl0ZW0gc2V0LiBDaG9vc2UgJ3RvcCcgb3JcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm90dG9tJyAoZGVmYXVsdCkuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Z1bmN0aW9ufSBncm91cE9yZGVyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBzb3J0aW5nIGZ1bmN0aW9uIGZvciBvcmRlcmluZyBncm91cHNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gc3RhY2tcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgaXRlbXMgd2lsbCBiZSBzdGFja2VkIG9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIG9mIGVhY2ggb3RoZXIuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge251bWJlcn0gbWFyZ2luLmF4aXNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW4gYmV0d2VlbiB0aGUgYXhpcyBhbmQgdGhlIGl0ZW1zIGluIHBpeGVscy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIDIwLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtudW1iZXJ9IG1hcmdpbi5pdGVtLmhvcml6b250YWxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIG1hcmdpbiBiZXR3ZWVuIGl0ZW1zIGluIHBpeGVscy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIDEwLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtudW1iZXJ9IG1hcmdpbi5pdGVtLnZlcnRpY2FsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGljYWwgTWFyZ2luIGJldHdlZW4gaXRlbXMgaW4gcGl4ZWxzLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgaXMgMTAuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge251bWJlcn0gbWFyZ2luLml0ZW1cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJnaW4gYmV0d2VlbiBpdGVtcyBpbiBwaXhlbHMgaW4gYm90aCBob3Jpem9udGFsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnRpY2FsIGRpcmVjdGlvbi4gRGVmYXVsdCBpcyAxMC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7bnVtYmVyfSBtYXJnaW5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgbWFyZ2luIGZvciBib3RoIGF4aXMgYW5kIGl0ZW1zIGluIHBpeGVscy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gc2VsZWN0YWJsZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpLCBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IG11bHRpc2VsZWN0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgdHJ1ZSwgbXVsdGlwbGUgaXRlbXMgY2FuIGJlIHNlbGVjdGVkLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGJ5IGRlZmF1bHQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IGVkaXRhYmxlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IGFsbCBlZGl0YWJsZSBvcHRpb25zIHRvIHRydWUgb3IgZmFsc2VcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gZWRpdGFibGUudXBkYXRlVGltZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGRyYWdnaW5nIGFuIGl0ZW0gdG8gYW4gb3RoZXIgbW9tZW50IGluIHRpbWVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym9vbGVhbn0gZWRpdGFibGUudXBkYXRlR3JvdXBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBkcmFnZ2luZyBhbiBpdGVtIHRvIGFuIG90aGVyIGdyb3VwXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IGVkaXRhYmxlLmFkZFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGNyZWF0aW5nIG5ldyBpdGVtcyBvbiBkb3VibGUgdGFwXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge2Jvb2xlYW59IGVkaXRhYmxlLnJlbW92ZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IHJlbW92aW5nIGl0ZW1zIGJ5IGNsaWNraW5nIHRoZSBkZWxldGUgYnV0dG9uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIHJpZ2h0IG9mIGEgc2VsZWN0ZWQgaXRlbS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7RnVuY3Rpb24oaXRlbTogSXRlbSwgY2FsbGJhY2s6IEZ1bmN0aW9uKX0gb25BZGRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbiB0cmlnZ2VyZWQgd2hlbiBhbiBpdGVtIGlzIGFib3V0IHRvIGJlIGFkZGVkOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHVzZXIgZG91YmxlIHRhcHMgYW4gZW1wdHkgc3BhY2UgaW4gdGhlIFRpbWVsaW5lLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtGdW5jdGlvbihpdGVtOiBJdGVtLCBjYWxsYmFjazogRnVuY3Rpb24pfSBvblVwZGF0ZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGZ1bmN0aW9uIGZpcmVkIHdoZW4gYW4gaXRlbSBpcyBhYm91dCB0byBiZSB1cGRhdGVkLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdHlwaWNhbGx5IGhhcyB0byBzaG93IGEgZGlhbG9nIHdoZXJlIHRoZSB1c2VyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIHRoZSBpdGVtLiBJZiBub3QgaW1wbGVtZW50ZWQsIG5vdGhpbmcgaGFwcGVucy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7RnVuY3Rpb24oaXRlbTogSXRlbSwgY2FsbGJhY2s6IEZ1bmN0aW9uKX0gb25Nb3ZlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyZWQgd2hlbiBhbiBpdGVtIGhhcyBiZWVuIG1vdmVkLiBJZiBub3QgaW1wbGVtZW50ZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vdmUgYWN0aW9uIHdpbGwgYmUgYWNjZXB0ZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Z1bmN0aW9uKGl0ZW06IEl0ZW0sIGNhbGxiYWNrOiBGdW5jdGlvbil9IG9uUmVtb3ZlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlyZWQgd2hlbiBhbiBpdGVtIGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm90IGltcGxlbWVudGVkLCB0aGUgaXRlbSB3aWxsIGJlIGFsd2F5cyByZW1vdmVkLlxuICAgKi9cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIC8vIGNvcHkgYWxsIG9wdGlvbnMgdGhhdCB3ZSBrbm93XG4gICAgICBjb25zdCBmaWVsZHMgPSBbXG4gICAgICAgICd0eXBlJywgJ3J0bCcsICdhbGlnbicsICdvcmRlcicsICdzdGFjaycsICdzdGFja1N1Ymdyb3VwcycsICdzZWxlY3RhYmxlJywgJ211bHRpc2VsZWN0JywgJ3NlcXVlbnRpYWxTZWxlY3Rpb24nLFxuICAgICAgICAnbXVsdGlzZWxlY3RQZXJHcm91cCcsICdsb25nU2VsZWN0UHJlc3NUaW1lJywgJ2dyb3VwT3JkZXInLCAnZGF0YUF0dHJpYnV0ZXMnLCAndGVtcGxhdGUnLCAnZ3JvdXBUZW1wbGF0ZScsICd2aXNpYmxlRnJhbWVUZW1wbGF0ZScsXG4gICAgICAgICdoaWRlJywgJ3NuYXAnLCAnZ3JvdXBPcmRlclN3YXAnLCAnc2hvd1Rvb2x0aXBzJywgJ3Rvb2x0aXAnLCAndG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWUnLCAnZ3JvdXBIZWlnaHRNb2RlJywgJ29uVGltZW91dCdcbiAgICAgIF07XG4gICAgICB1dGlsLnNlbGVjdGl2ZUV4dGVuZChmaWVsZHMsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgIGlmICgnaXRlbXNBbHdheXNEcmFnZ2FibGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUuaXRlbSA9IG9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdXRpbC5zZWxlY3RpdmVFeHRlbmQoWydpdGVtJywgJ3JhbmdlJ10sIHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZSwgb3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZSk7XG4gICAgICAgICAgLy8gb25seSBhbGxvdyByYW5nZSBhbHdheXMgZHJhZ2dhYmxlIHdoZW4gaXRlbSBpcyBhbHdheXMgZHJhZ2dhYmxlIGFzIHdlbGxcbiAgICAgICAgICBpZiAoISB0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUuaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICgnc2VxdWVudGlhbFNlbGVjdGlvbicgaW4gb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2VxdWVudGlhbFNlbGVjdGlvbiA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnNlcXVlbnRpYWxTZWxlY3Rpb24gPSBvcHRpb25zLnNlcXVlbnRpYWxTZWxlY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdvcmllbnRhdGlvbicgaW4gb3B0aW9ucykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0gPSBvcHRpb25zLm9yaWVudGF0aW9uID09PSAndG9wJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMub3JpZW50YXRpb24gPT09ICdvYmplY3QnICYmICdpdGVtJyBpbiBvcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLml0ZW0gPSBvcHRpb25zLm9yaWVudGF0aW9uLml0ZW07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdtYXJnaW4nIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLm1hcmdpbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubWFyZ2luLmF4aXMgPSBvcHRpb25zLm1hcmdpbjtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0uaG9yaXpvbnRhbCA9IG9wdGlvbnMubWFyZ2luO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbCA9IG9wdGlvbnMubWFyZ2luO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLm1hcmdpbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB1dGlsLnNlbGVjdGl2ZUV4dGVuZChbJ2F4aXMnXSwgdGhpcy5vcHRpb25zLm1hcmdpbiwgb3B0aW9ucy5tYXJnaW4pO1xuICAgICAgICAgIGlmICgnaXRlbScgaW4gb3B0aW9ucy5tYXJnaW4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5tYXJnaW4uaXRlbSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWwgPSBvcHRpb25zLm1hcmdpbi5pdGVtO1xuICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0udmVydGljYWwgPSBvcHRpb25zLm1hcmdpbi5pdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMubWFyZ2luLml0ZW0gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHV0aWwuc2VsZWN0aXZlRXh0ZW5kKFsnaG9yaXpvbnRhbCcsICd2ZXJ0aWNhbCddLCB0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0sIG9wdGlvbnMubWFyZ2luLml0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBbJ2xvY2FsZScsICdsb2NhbGVzJ10uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBpZiAoa2V5IGluIG9wdGlvbnMpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmICgnZWRpdGFibGUnIGluIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmVkaXRhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZSAgICA9IG9wdGlvbnMuZWRpdGFibGU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZUdyb3VwICAgPSBvcHRpb25zLmVkaXRhYmxlO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQgICAgICAgICAgID0gb3B0aW9ucy5lZGl0YWJsZTtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZWRpdGFibGUucmVtb3ZlICAgICAgICA9IG9wdGlvbnMuZWRpdGFibGU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5lZGl0YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB1dGlsLnNlbGVjdGl2ZUV4dGVuZChbJ3VwZGF0ZVRpbWUnLCAndXBkYXRlR3JvdXAnLCAnYWRkJywgJ3JlbW92ZScsICdvdmVycmlkZUl0ZW1zJ10sIHRoaXMub3B0aW9ucy5lZGl0YWJsZSwgb3B0aW9ucy5lZGl0YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCdncm91cEVkaXRhYmxlJyBpbiBvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ncm91cEVkaXRhYmxlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlciAgPSBvcHRpb25zLmdyb3VwRWRpdGFibGU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUuYWRkICAgID0gb3B0aW9ucy5ncm91cEVkaXRhYmxlO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLnJlbW92ZSA9IG9wdGlvbnMuZ3JvdXBFZGl0YWJsZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucy5ncm91cEVkaXRhYmxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHV0aWwuc2VsZWN0aXZlRXh0ZW5kKFsnb3JkZXInLCAnYWRkJywgJ3JlbW92ZSddLCB0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZSwgb3B0aW9ucy5ncm91cEVkaXRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICAgIGNvbnN0IGFkZENhbGxiYWNrID0gbmFtZSA9PiB7XG4gICAgICAgIGNvbnN0IGZuID0gb3B0aW9uc1tuYW1lXTtcbiAgICAgICAgaWYgKGZuKSB7XG4gICAgICAgICAgaWYgKCEodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBvcHRpb24gJHtuYW1lfSBtdXN0IGJlIGEgZnVuY3Rpb24gJHtuYW1lfShpdGVtLCBjYWxsYmFjaylgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vcHRpb25zW25hbWVdID0gZm47XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBbJ29uRHJvcE9iamVjdE9uSXRlbScsICdvbkFkZCcsICdvblVwZGF0ZScsICdvblJlbW92ZScsICdvbk1vdmUnLCAnb25Nb3ZpbmcnLCAnb25BZGRHcm91cCcsICdvbk1vdmVHcm91cCcsICdvblJlbW92ZUdyb3VwJ10uZm9yRWFjaChhZGRDYWxsYmFjayk7XG5cbiAgICAgIGlmIChvcHRpb25zLmNsdXN0ZXIpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMsIHtcbiAgICAgICAgICBjbHVzdGVyOiBvcHRpb25zLmNsdXN0ZXJcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghdGhpcy5jbHVzdGVyR2VuZXJhdG9yKSB7XG4gICAgICAgICAgdGhpcy5jbHVzdGVyR2VuZXJhdG9yID0gbmV3IENsdXN0ZXJHZW5lcmF0b3IodGhpcyk7XG4gICAgICAgIH0gXG4gICAgICAgIHRoaXMuY2x1c3RlckdlbmVyYXRvci5zZXRJdGVtcyh0aGlzLml0ZW1zLCB7IGFwcGx5T25DaGFuZ2VkTGV2ZWw6IGZhbHNlIH0pO1xuICAgICAgICB0aGlzLm1hcmtEaXJ0eSh7IHJlZnJlc2hJdGVtczogdHJ1ZSwgcmVzdGFja0dyb3VwczogdHJ1ZSB9KTtcblxuICAgICAgICB0aGlzLnJlZHJhdygpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNsdXN0ZXJHZW5lcmF0b3IpIHtcbiAgICAgICAgdGhpcy5fZGV0YWNoQWxsQ2x1c3RlcnMoKTtcbiAgICAgICAgdGhpcy5jbHVzdGVycyA9IFtdO1xuICAgICAgICB0aGlzLmNsdXN0ZXJHZW5lcmF0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9wdGlvbnMuY2x1c3RlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5tYXJrRGlydHkoeyByZWZyZXNoSXRlbXM6IHRydWUsIHJlc3RhY2tHcm91cHM6IHRydWUgfSk7XG5cbiAgICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZvcmNlIHRoZSBpdGVtU2V0IHRvIHJlZnJlc2g6IG9wdGlvbnMgbGlrZSBvcmllbnRhdGlvbiBhbmQgbWFyZ2lucyBtYXkgYmUgY2hhbmdlZFxuICAgICAgICB0aGlzLm1hcmtEaXJ0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBJdGVtU2V0IGRpcnR5IHNvIGl0IHdpbGwgcmVmcmVzaCBldmVyeXRoaW5nIHdpdGggbmV4dCByZWRyYXcuXG4gICAqIE9wdGlvbmFsbHksIGFsbCBpdGVtcyBjYW4gYmUgbWFya2VkIGFzIGRpcnR5IGFuZCBiZSByZWZyZXNoZWQuXG4gICAqIEBwYXJhbSB7e3JlZnJlc2hJdGVtczogYm9vbGVhbn19IFtvcHRpb25zXVxuICAgKi9cbiAgbWFya0RpcnR5KG9wdGlvbnMpIHtcbiAgICB0aGlzLmdyb3VwSWRzID0gW107XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMucmVmcmVzaEl0ZW1zKSB7XG4gICAgICAgIHV0aWwuZm9yRWFjaCh0aGlzLml0ZW1zLCBpdGVtID0+IHtcbiAgICAgICAgICBpdGVtLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoaXRlbS5kaXNwbGF5ZWQpIGl0ZW0ucmVkcmF3KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgXG4gICAgICBpZiAob3B0aW9ucy5yZXN0YWNrR3JvdXBzKSB7XG4gICAgICAgIHV0aWwuZm9yRWFjaCh0aGlzLmdyb3VwcywgKGdyb3VwLCBrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5ID09PSBCQUNLR1JPVU5EJDIpIHJldHVybjtcbiAgICAgICAgICBncm91cC5zdGFja0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3kgdGhlIEl0ZW1TZXRcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhclBvcHVwVGltZXIoKTtcbiAgICB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnNldEl0ZW1zKG51bGwpO1xuICAgIHRoaXMuc2V0R3JvdXBzKG51bGwpO1xuXG4gICAgdGhpcy5oYW1tZXIgJiYgdGhpcy5oYW1tZXIuZGVzdHJveSgpO1xuICAgIHRoaXMuZ3JvdXBIYW1tZXIgJiYgdGhpcy5ncm91cEhhbW1lci5kZXN0cm95KCk7XG4gICAgdGhpcy5oYW1tZXIgPSBudWxsO1xuXG4gICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICB0aGlzLmNvbnZlcnNpb24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBET01cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgLy8gcmVtb3ZlIHRoZSBmcmFtZSBjb250YWluaW5nIHRoZSBpdGVtc1xuICAgIGlmICh0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZyYW1lKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGhlIGF4aXMgd2l0aCBkb3RzXG4gICAgaWYgKHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmF4aXMpO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSB0aGUgbGFiZWxzZXQgY29udGFpbmluZyBhbGwgZ3JvdXAgbGFiZWxzXG4gICAgaWYgKHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGFiZWxTZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZSBjb21wb25lbnQgaW4gdGhlIERPTSAod2hlbiBub3QgYWxyZWFkeSB2aXNpYmxlKS5cbiAgICovXG4gIHNob3coKSB7XG4gICAgLy8gc2hvdyBmcmFtZSBjb250YWluaW5nIHRoZSBpdGVtc1xuICAgIGlmICghdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpO1xuICAgIH1cblxuICAgIC8vIHNob3cgYXhpcyB3aXRoIGRvdHNcbiAgICBpZiAoIXRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyk7XG4gICAgfVxuXG4gICAgLy8gc2hvdyBsYWJlbHNldCBjb250YWluaW5nIGxhYmVsc1xuICAgIGlmICghdGhpcy5kb20ubGFiZWxTZXQucGFyZW50Tm9kZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ydGwpIHtcbiAgICAgICAgdGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbFNldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJvZHkuZG9tLmxlZnQuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGFiZWxTZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RpdmF0ZXMgdGhlIHBvcHVwIHRpbWVyIHRvIHNob3cgdGhlIGdpdmVuIHBvcHVwIGFmdGVyIGEgZml4ZWQgdGltZS5cbiAgICogQHBhcmFtIHtQb3B1cH0gcG9wdXBcbiAgICovXG4gIHNldFBvcHVwVGltZXIocG9wdXApIHtcbiAgICB0aGlzLmNsZWFyUG9wdXBUaW1lcigpO1xuICAgIGlmIChwb3B1cCkge1xuICAgICAgY29uc3QgZGVsYXkgPSB0aGlzLm9wdGlvbnMudG9vbHRpcC5kZWxheSB8fCB0eXBlb2YgdGhpcy5vcHRpb25zLnRvb2x0aXAuZGVsYXkgPT09ICdudW1iZXInID9cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50b29sdGlwLmRlbGF5IDpcbiAgICAgICAgICAgIDUwMDtcbiAgICAgIHRoaXMucG9wdXBUaW1lciA9IHNldFRpbWVvdXQoXG4gICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwb3B1cC5zaG93KCk7XG4gICAgICAgIH0sIGRlbGF5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIHRoZSBwb3B1cCB0aW1lciBmb3IgdGhlIHRvb2x0aXAuXG4gICAqL1xuICBjbGVhclBvcHVwVGltZXIoKSB7XG4gICAgaWYgKHRoaXMucG9wdXBUaW1lciAhPSBudWxsKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBvcHVwVGltZXIpO1xuICAgICAgICB0aGlzLnBvcHVwVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFNldCBzZWxlY3RlZCBpdGVtcyBieSB0aGVpciBpZC4gUmVwbGFjZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAqIFVua25vd24gaWQncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2lkc10gQW4gYXJyYXkgd2l0aCB6ZXJvIG9yIG1vcmUgaWQncyBvZiB0aGUgaXRlbXMgdG8gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQsIG9yIGEgc2luZ2xlIGl0ZW0gaWQuIElmIGlkcyBpcyB1bmRlZmluZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gZW1wdHkgYXJyYXksIGFsbCBpdGVtcyB3aWxsIGJlIHVuc2VsZWN0ZWQuXG4gICAqL1xuICBzZXRTZWxlY3Rpb24oaWRzKSB7XG4gICAgaWYgKGlkcyA9PSB1bmRlZmluZWQpIHsgXG4gICAgICBpZHMgPSBbXTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlkcykpIHtcbiAgICAgIGlkcyA9IFtpZHNdO1xuICAgIH1cbiAgXG5cbiAgICBjb25zdCBpZHNUb0Rlc2VsZWN0ID0gdGhpcy5zZWxlY3Rpb24uZmlsdGVyKGlkID0+IGlkcy5pbmRleE9mKGlkKSA9PT0gLTEpO1xuXG4gICAgLy8gdW5zZWxlY3QgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW1zXG4gICAgZm9yIChsZXQgc2VsZWN0ZWRJZCBvZiBpZHNUb0Rlc2VsZWN0KSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5nZXRJdGVtQnlJZChzZWxlY3RlZElkKTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW0udW5zZWxlY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIFxuICAgIC8vIHNlbGVjdCBpdGVtc1xuICAgIHRoaXMuc2VsZWN0aW9uID0gWyAuLi5pZHMgXTtcbiAgICBmb3IgKGxldCBpZCBvZiBpZHMpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmdldEl0ZW1CeUlkKGlkKTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGl0ZW0uc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VsZWN0ZWQgaXRlbXMgYnkgdGhlaXIgaWRcbiAgICogQHJldHVybiB7QXJyYXl9IGlkcyAgVGhlIGlkcyBvZiB0aGUgc2VsZWN0ZWQgaXRlbXNcbiAgICovXG4gIGdldFNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uY29uY2F0KFtdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGlkJ3Mgb2YgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGl0ZW1zLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBpZHMgb2YgdGhlIHZpc2libGUgaXRlbXNcbiAgICovXG4gIGdldFZpc2libGVJdGVtcygpIHtcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuYm9keS5yYW5nZS5nZXRSYW5nZSgpO1xuICAgIGxldCByaWdodDtcbiAgICBsZXQgbGVmdDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7IFxuICAgICAgcmlnaHQgID0gdGhpcy5ib2R5LnV0aWwudG9TY3JlZW4ocmFuZ2Uuc3RhcnQpO1xuICAgICAgbGVmdCA9IHRoaXMuYm9keS51dGlsLnRvU2NyZWVuKHJhbmdlLmVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlZnQgID0gdGhpcy5ib2R5LnV0aWwudG9TY3JlZW4ocmFuZ2Uuc3RhcnQpO1xuICAgICAgcmlnaHQgPSB0aGlzLmJvZHkudXRpbC50b1NjcmVlbihyYW5nZS5lbmQpO1xuICAgIH1cblxuICAgIGNvbnN0IGlkcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZ3JvdXBJZCBpbiB0aGlzLmdyb3Vwcykge1xuICAgICAgaWYgKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGdyb3VwSWQpKSB7XG4gICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZF07XG4gICAgICAgIGNvbnN0IHJhd1Zpc2libGVJdGVtcyA9IGdyb3VwLmlzVmlzaWJsZSA/IGdyb3VwLnZpc2libGVJdGVtcyA6IFtdO1xuXG4gICAgICAgIC8vIGZpbHRlciB0aGUgXCJyYXdcIiBzZXQgd2l0aCB2aXNpYmxlSXRlbXMgaW50byBhIHNldCB3aGljaCBpcyByZWFsbHlcbiAgICAgICAgLy8gdmlzaWJsZSBieSBwaXhlbHNcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJhd1Zpc2libGVJdGVtcykge1xuICAgICAgICAgIC8vIFRPRE86IGFsc28gY2hlY2sgd2hldGhlciB2aXNpYmxlIHZlcnRpY2FsbHlcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkgeyBcbiAgICAgICAgICAgIGlmICgoaXRlbS5yaWdodCA8IGxlZnQpICYmIChpdGVtLnJpZ2h0ICsgaXRlbS53aWR0aCA+IHJpZ2h0KSkge1xuICAgICAgICAgICAgICBpZHMucHVzaChpdGVtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKChpdGVtLmxlZnQgPCByaWdodCkgJiYgKGl0ZW0ubGVmdCArIGl0ZW0ud2lkdGggPiBsZWZ0KSkge1xuICAgICAgICAgICAgICBpZHMucHVzaChpdGVtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgaWQncyBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgZ3JvdXBzLlxuICAgKiBAcmV0dXJucyB7QXJyYXl9IFRoZSBpZHMgb2YgdGhlIHZpc2libGUgZ3JvdXBzXG4gICAqL1xuICBnZXRWaXNpYmxlR3JvdXBzKCkge1xuICAgIGNvbnN0IGlkcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cElkIGluIHRoaXMuZ3JvdXBzKSB7XG4gICAgICBpZiAodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZ3JvdXBJZCkpIHtcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkXTtcbiAgICAgICAgaWYgKGdyb3VwLmlzVmlzaWJsZSkge1xuICAgICAgICAgIGlkcy5wdXNoKGdyb3VwSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkcztcbiAgfVxuICBcbiAgLyoqXG4gICAqIGdldCBpdGVtIGJ5IGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZFxuICAgKiBAcmV0dXJuIHtvYmplY3R9IGl0ZW1cbiAgICovXG4gIGdldEl0ZW1CeUlkKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNbaWRdIHx8IHRoaXMuY2x1c3RlcnMuZmluZChjbHVzdGVyID0+IGNsdXN0ZXIuaWQgPT09IGlkKTtcbiAgfSBcblxuICAvKipcbiAgICogRGVzZWxlY3QgYSBzZWxlY3RlZCBpdGVtXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Rlc2VsZWN0KGlkKSB7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgZm9yIChsZXQgaSA9IDAsIGlpID0gc2VsZWN0aW9uLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgIGlmIChzZWxlY3Rpb25baV0gPT0gaWQpIHsgLy8gbm9uLXN0cmljdCBjb21wYXJpc29uIVxuICAgICAgICBzZWxlY3Rpb24uc3BsaWNlKGksIDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwYWludCB0aGUgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIHJlc2l6ZWRcbiAgICovXG4gIHJlZHJhdygpIHtcbiAgICBjb25zdCBtYXJnaW4gPSB0aGlzLm9wdGlvbnMubWFyZ2luO1xuICAgIGNvbnN0IHJhbmdlID0gdGhpcy5ib2R5LnJhbmdlO1xuICAgIGNvbnN0IGFzU2l6ZSA9IHV0aWwub3B0aW9uLmFzU2l6ZTtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gb3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtO1xuICAgIGxldCByZXNpemVkID0gZmFsc2U7XG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLmRvbS5mcmFtZTtcblxuICAgIC8vIHJlY2FsY3VsYXRlIGFic29sdXRlIHBvc2l0aW9uIChiZWZvcmUgcmVkcmF3aW5nIGdyb3VwcylcbiAgICB0aGlzLnByb3BzLnRvcCA9IHRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0ICsgdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3A7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5wcm9wcy5yaWdodCA9IHRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aCArIHRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIucmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMubGVmdCA9IHRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LndpZHRoICsgdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci5sZWZ0O1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBjbGFzcyBuYW1lXG4gICAgZnJhbWUuY2xhc3NOYW1lID0gJ3Zpcy1pdGVtc2V0JztcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2x1c3Rlcikge1xuICAgICAgdGhpcy5fY2x1c3Rlckl0ZW1zKCk7XG4gICAgfVxuXG4gICAgLy8gcmVvcmRlciB0aGUgZ3JvdXBzIChpZiBuZWVkZWQpXG4gICAgcmVzaXplZCA9IHRoaXMuX29yZGVyR3JvdXBzKCkgfHwgcmVzaXplZDtcblxuICAgIC8vIGNoZWNrIHdoZXRoZXIgem9vbWVkIChpbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byByZS1zdGFjayBldmVyeXRoaW5nKVxuICAgIC8vIFRPRE86IHdvdWxkIGJlIG5pY2VyIHRvIGdldCB0aGlzIGFzIGEgdHJpZ2dlciBmcm9tIFJhbmdlXG4gICAgY29uc3QgdmlzaWJsZUludGVydmFsID0gcmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQ7XG4gICAgY29uc3Qgem9vbWVkID0gKHZpc2libGVJbnRlcnZhbCAhPSB0aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWwpIHx8ICh0aGlzLnByb3BzLndpZHRoICE9IHRoaXMucHJvcHMubGFzdFdpZHRoKTtcbiAgICBjb25zdCBzY3JvbGxlZCA9IHJhbmdlLnN0YXJ0ICE9IHRoaXMubGFzdFJhbmdlU3RhcnQ7XG4gICAgY29uc3QgY2hhbmdlZFN0YWNrT3B0aW9uID0gb3B0aW9ucy5zdGFjayAhPSB0aGlzLmxhc3RTdGFjaztcbiAgICBjb25zdCBjaGFuZ2VkU3RhY2tTdWJncm91cHNPcHRpb24gPSBvcHRpb25zLnN0YWNrU3ViZ3JvdXBzICE9IHRoaXMubGFzdFN0YWNrU3ViZ3JvdXBzO1xuICAgIGNvbnN0IGZvcmNlUmVzdGFjayA9ICh6b29tZWQgfHwgc2Nyb2xsZWQgfHwgY2hhbmdlZFN0YWNrT3B0aW9uIHx8IGNoYW5nZWRTdGFja1N1Ymdyb3Vwc09wdGlvbik7XG4gICAgdGhpcy5sYXN0VmlzaWJsZUludGVydmFsID0gdmlzaWJsZUludGVydmFsO1xuICAgIHRoaXMubGFzdFJhbmdlU3RhcnQgPSByYW5nZS5zdGFydDtcbiAgICB0aGlzLmxhc3RTdGFjayA9IG9wdGlvbnMuc3RhY2s7XG4gICAgdGhpcy5sYXN0U3RhY2tTdWJncm91cHMgPSBvcHRpb25zLnN0YWNrU3ViZ3JvdXBzO1xuXG4gICAgdGhpcy5wcm9wcy5sYXN0V2lkdGggPSB0aGlzLnByb3BzLndpZHRoO1xuICAgIGNvbnN0IGZpcnN0R3JvdXAgPSB0aGlzLl9maXJzdEdyb3VwKCk7XG4gICAgY29uc3QgZmlyc3RNYXJnaW4gPSB7XG4gICAgICBpdGVtOiBtYXJnaW4uaXRlbSxcbiAgICAgIGF4aXM6IG1hcmdpbi5heGlzXG4gICAgfTtcbiAgICBjb25zdCBub25GaXJzdE1hcmdpbiA9IHtcbiAgICAgIGl0ZW06IG1hcmdpbi5pdGVtLFxuICAgICAgYXhpczogbWFyZ2luLml0ZW0udmVydGljYWwgLyAyXG4gICAgfTtcbiAgICBsZXQgaGVpZ2h0ID0gMDtcbiAgICBjb25zdCBtaW5IZWlnaHQgPSBtYXJnaW4uYXhpcyArIG1hcmdpbi5pdGVtLnZlcnRpY2FsO1xuXG4gICAgLy8gcmVkcmF3IHRoZSBiYWNrZ3JvdW5kIGdyb3VwXG4gICAgdGhpcy5ncm91cHNbQkFDS0dST1VORCQyXS5yZWRyYXcocmFuZ2UsIG5vbkZpcnN0TWFyZ2luLCBmb3JjZVJlc3RhY2spO1xuXG4gICAgY29uc3QgcmVkcmF3UXVldWUgPSB7fTtcbiAgICBsZXQgcmVkcmF3UXVldWVMZW5ndGggPSAwO1xuXG4gICAgLy8gY29sbGVjdCByZWRyYXcgZnVuY3Rpb25zXG4gICAgdXRpbC5mb3JFYWNoKHRoaXMuZ3JvdXBzLCAoZ3JvdXAsIGtleSkgPT4ge1xuICAgICAgaWYgKGtleSA9PT0gQkFDS0dST1VORCQyKSByZXR1cm47XG4gICAgICBjb25zdCBncm91cE1hcmdpbiA9IGdyb3VwID09IGZpcnN0R3JvdXAgPyBmaXJzdE1hcmdpbiA6IG5vbkZpcnN0TWFyZ2luO1xuICAgICAgY29uc3QgcmV0dXJuUXVldWUgPSB0cnVlO1xuICAgICAgcmVkcmF3UXVldWVba2V5XSA9IGdyb3VwLnJlZHJhdyhyYW5nZSwgZ3JvdXBNYXJnaW4sIGZvcmNlUmVzdGFjaywgcmV0dXJuUXVldWUpO1xuICAgICAgcmVkcmF3UXVldWVMZW5ndGggPSByZWRyYXdRdWV1ZVtrZXldLmxlbmd0aDtcbiAgICB9KTtcblxuICAgIGNvbnN0IG5lZWRSZWRyYXcgPSByZWRyYXdRdWV1ZUxlbmd0aCA+IDA7XG4gICAgaWYgKG5lZWRSZWRyYXcpIHtcbiAgICAgIGNvbnN0IHJlZHJhd1Jlc3VsdHMgPSB7fTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWRyYXdRdWV1ZUxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHV0aWwuZm9yRWFjaChyZWRyYXdRdWV1ZSwgKGZucywga2V5KSA9PiB7XG4gICAgICAgICAgcmVkcmF3UmVzdWx0c1trZXldID0gZm5zW2ldKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWRyYXcgYWxsIHJlZ3VsYXIgZ3JvdXBzXG4gICAgICB1dGlsLmZvckVhY2godGhpcy5ncm91cHMsIChncm91cCwga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgPT09IEJBQ0tHUk9VTkQkMikgcmV0dXJuO1xuICAgICAgICBjb25zdCBncm91cFJlc2l6ZWQgPSByZWRyYXdSZXN1bHRzW2tleV07XG4gICAgICAgIHJlc2l6ZWQgPSBncm91cFJlc2l6ZWQgfHwgcmVzaXplZDtcbiAgICAgICAgaGVpZ2h0ICs9IGdyb3VwLmhlaWdodDtcbiAgICAgIH0pO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoaGVpZ2h0LCBtaW5IZWlnaHQpO1xuICAgIH1cblxuICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgbWluSGVpZ2h0KTtcblxuICAgIC8vIHVwZGF0ZSBmcmFtZSBoZWlnaHRcbiAgICBmcmFtZS5zdHlsZS5oZWlnaHQgID0gYXNTaXplKGhlaWdodCk7XG5cbiAgICAvLyBjYWxjdWxhdGUgYWN0dWFsIHNpemVcbiAgICB0aGlzLnByb3BzLndpZHRoID0gZnJhbWUub2Zmc2V0V2lkdGg7XG4gICAgdGhpcy5wcm9wcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAvLyByZXBvc2l0aW9uIGF4aXNcbiAgICB0aGlzLmRvbS5heGlzLnN0eWxlLnRvcCA9IGFzU2l6ZSgob3JpZW50YXRpb24gPT0gJ3RvcCcpID9cbiAgICAgICAgKHRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0ICsgdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3ApIDpcbiAgICAgICAgKHRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0ICsgdGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQpKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgdGhpcy5kb20uYXhpcy5zdHlsZS5yaWdodCA9ICcwJztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kb20uYXhpcy5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgIH1cblxuICAgIHRoaXMuaGFtbWVyLmdldCgncHJlc3MnKS5zZXQoe3RpbWU6IHRoaXMub3B0aW9ucy5sb25nU2VsZWN0UHJlc3NUaW1lfSk7XG5cbiAgICB0aGlzLmluaXRpYWxJdGVtU2V0RHJhd24gPSB0cnVlO1xuICAgIC8vIGNoZWNrIGlmIHRoaXMgY29tcG9uZW50IGlzIHJlc2l6ZWRcbiAgICByZXNpemVkID0gdGhpcy5faXNSZXNpemVkKCkgfHwgcmVzaXplZDtcblxuICAgIHJldHVybiByZXNpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmlyc3QgZ3JvdXAsIGFsaWduZWQgd2l0aCB0aGUgYXhpc1xuICAgKiBAcmV0dXJuIHtHcm91cCB8IG51bGx9IGZpcnN0R3JvdXBcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9maXJzdEdyb3VwKCkge1xuICAgIGNvbnN0IGZpcnN0R3JvdXBJbmRleCA9ICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSA9PSAndG9wJykgPyAwIDogKHRoaXMuZ3JvdXBJZHMubGVuZ3RoIC0gMSk7XG4gICAgY29uc3QgZmlyc3RHcm91cElkID0gdGhpcy5ncm91cElkc1tmaXJzdEdyb3VwSW5kZXhdO1xuICAgIGNvbnN0IGZpcnN0R3JvdXAgPSB0aGlzLmdyb3Vwc1tmaXJzdEdyb3VwSWRdIHx8IHRoaXMuZ3JvdXBzW1VOR1JPVVBFRCQyXTtcblxuICAgIHJldHVybiBmaXJzdEdyb3VwIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIGRlbGV0ZSB0aGUgZ3JvdXAgaG9sZGluZyBhbGwgdW5ncm91cGVkIGl0ZW1zLiBUaGlzIGdyb3VwIGlzIHVzZWQgd2hlblxuICAgKiB0aGVyZSBhcmUgbm8gZ3JvdXBzIHNwZWNpZmllZC5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX3VwZGF0ZVVuZ3JvdXBlZCgpIHtcbiAgICBsZXQgdW5ncm91cGVkID0gdGhpcy5ncm91cHNbVU5HUk9VUEVEJDJdO1xuICAgIGxldCBpdGVtO1xuICAgIGxldCBpdGVtSWQ7XG5cbiAgICBpZiAodGhpcy5ncm91cHNEYXRhKSB7XG4gICAgICAvLyByZW1vdmUgdGhlIGdyb3VwIGhvbGRpbmcgYWxsIHVuZ3JvdXBlZCBpdGVtc1xuICAgICAgaWYgKHVuZ3JvdXBlZCkge1xuICAgICAgICB1bmdyb3VwZWQuZGlzcG9zZSgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ncm91cHNbVU5HUk9VUEVEJDJdO1xuXG4gICAgICAgIGZvciAoaXRlbUlkIGluIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICBpZiAodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShpdGVtSWQpKSB7XG4gICAgICAgICAgICBpdGVtID0gdGhpcy5pdGVtc1tpdGVtSWRdO1xuICAgICAgICAgICAgaXRlbS5wYXJlbnQgJiYgaXRlbS5wYXJlbnQucmVtb3ZlKGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuZ2V0R3JvdXBJZChpdGVtLmRhdGEpO1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkXTtcbiAgICAgICAgICAgIGdyb3VwICYmIGdyb3VwLmFkZChpdGVtKSB8fCBpdGVtLmhpZGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgYSBncm91cCBob2xkaW5nIGFsbCAodW5maWx0ZXJlZCkgaXRlbXNcbiAgICAgIGlmICghdW5ncm91cGVkKSB7XG4gICAgICAgIGNvbnN0IGlkID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0YSA9IG51bGw7XG4gICAgICAgIHVuZ3JvdXBlZCA9IG5ldyBHcm91cChpZCwgZGF0YSwgdGhpcyk7XG4gICAgICAgIHRoaXMuZ3JvdXBzW1VOR1JPVVBFRCQyXSA9IHVuZ3JvdXBlZDtcblxuICAgICAgICBmb3IgKGl0ZW1JZCBpbiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoaXRlbUlkKSkge1xuICAgICAgICAgICAgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbUlkXTtcbiAgICAgICAgICAgIHVuZ3JvdXBlZC5hZGQoaXRlbSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdW5ncm91cGVkLnNob3coKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWxzZXRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9IGxhYmVsU2V0XG4gICAqL1xuICBnZXRMYWJlbFNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5kb20ubGFiZWxTZXQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGl0ZW1zXG4gICAqIEBwYXJhbSB7dmlzLkRhdGFTZXQgfCBudWxsfSBpdGVtc1xuICAgKi9cbiAgc2V0SXRlbXMoaXRlbXMpIHtcbiAgICB0aGlzLml0ZW1zU2V0dGluZ1RpbWUgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICBsZXQgaWRzO1xuICAgIGNvbnN0IG9sZEl0ZW1zRGF0YSA9IHRoaXMuaXRlbXNEYXRhO1xuXG4gICAgLy8gcmVwbGFjZSB0aGUgZGF0YXNldFxuICAgIGlmICghaXRlbXMpIHtcbiAgICAgIHRoaXMuaXRlbXNEYXRhID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEYXRhVmlld0xpa2UoXCJpZFwiLCBpdGVtcykpIHtcbiAgICAgIHRoaXMuaXRlbXNEYXRhID0gdHlwZUNvZXJjZURhdGFTZXQoaXRlbXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0RhdGEgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3Jyk7XG4gICAgfVxuXG4gICAgaWYgKG9sZEl0ZW1zRGF0YSkge1xuICAgICAgLy8gdW5zdWJzY3JpYmUgZnJvbSBvbGQgZGF0YXNldFxuICAgICAgdXRpbC5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycywgKGNhbGxiYWNrLCBldmVudCkgPT4ge1xuICAgICAgICBvbGRJdGVtc0RhdGEub2ZmKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgICB9KTtcblxuICAgICAgLy8gc3RvcCBtYWludGFpbmluZyBhIGNvZXJjZWQgdmVyc2lvbiBvZiB0aGUgb2xkIGRhdGEgc2V0XG4gICAgICBvbGRJdGVtc0RhdGEuZGlzcG9zZSgpO1xuXG4gICAgICAvLyByZW1vdmUgYWxsIGRyYXduIGl0ZW1zXG4gICAgICBpZHMgPSBvbGRJdGVtc0RhdGEuZ2V0SWRzKCk7XG4gICAgICB0aGlzLl9vblJlbW92ZShpZHMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLml0ZW1zRGF0YSkge1xuICAgICAgLy8gc3Vic2NyaWJlIHRvIG5ldyBkYXRhc2V0XG4gICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7XG4gICAgICB1dGlsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLCAoY2FsbGJhY2ssIGV2ZW50KSA9PiB7XG4gICAgICAgIG1lLml0ZW1zRGF0YS5vbihldmVudCwgY2FsbGJhY2ssIGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBhZGQgYWxsIG5ldyBpdGVtc1xuICAgICAgaWRzID0gdGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCk7XG4gICAgICB0aGlzLl9vbkFkZChpZHMpO1xuXG4gICAgICAvLyB1cGRhdGUgdGhlIGdyb3VwIGhvbGRpbmcgYWxsIHVuZ3JvdXBlZCBpdGVtc1xuICAgICAgdGhpcy5fdXBkYXRlVW5ncm91cGVkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnX2NoYW5nZScsIHtxdWV1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBpdGVtc1xuICAgKiBAcmV0dXJucyB7dmlzLkRhdGFTZXQgfCBudWxsfVxuICAgKi9cbiAgZ2V0SXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXNEYXRhICE9IG51bGwgPyB0aGlzLml0ZW1zRGF0YS5yYXdEUyA6IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGdyb3Vwc1xuICAgKiBAcGFyYW0ge3Zpcy5EYXRhU2V0fSBncm91cHNcbiAgICovXG4gIHNldEdyb3Vwcyhncm91cHMpIHtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgbGV0IGlkcztcblxuICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gY3VycmVudCBkYXRhc2V0XG4gICAgaWYgKHRoaXMuZ3JvdXBzRGF0YSkge1xuICAgICAgdXRpbC5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsIChjYWxsYmFjaywgZXZlbnQpID0+IHtcbiAgICAgICAgbWUuZ3JvdXBzRGF0YS5vZmYoZXZlbnQsIGNhbGxiYWNrKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyByZW1vdmUgYWxsIGRyYXduIGdyb3Vwc1xuICAgICAgaWRzID0gdGhpcy5ncm91cHNEYXRhLmdldElkcygpO1xuICAgICAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDtcbiAgICAgIHRoaXMuX29uUmVtb3ZlR3JvdXBzKGlkcyk7IC8vIG5vdGU6IHRoaXMgd2lsbCBjYXVzZSBhIHJlZHJhd1xuICAgIH1cblxuICAgIC8vIHJlcGxhY2UgdGhlIGRhdGFzZXRcbiAgICBpZiAoIWdyb3Vwcykge1xuICAgICAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNEYXRhVmlld0xpa2UoXCJpZFwiLCBncm91cHMpKSB7XG4gICAgICB0aGlzLmdyb3Vwc0RhdGEgPSBncm91cHM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGF0YSBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXcnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ncm91cHNEYXRhKSB7XG4gICAgICAvLyBnbyBvdmVyIGFsbCBncm91cHMgbmVzdGluZ1xuICAgICAgY29uc3QgZ3JvdXBzRGF0YSA9IHRoaXMuZ3JvdXBzRGF0YS5nZXREYXRhU2V0KCk7XG5cbiAgICAgIGdyb3Vwc0RhdGEuZ2V0KCkuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGlmIChncm91cC5uZXN0ZWRHcm91cHMpIHtcbiAgICAgICAgICBncm91cC5uZXN0ZWRHcm91cHMuZm9yRWFjaChuZXN0ZWRHcm91cElkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWROZXN0ZWRHcm91cCA9IGdyb3Vwc0RhdGEuZ2V0KG5lc3RlZEdyb3VwSWQpO1xuICAgICAgICAgICAgdXBkYXRlZE5lc3RlZEdyb3VwLm5lc3RlZEluR3JvdXAgPSBncm91cC5pZDtcbiAgICAgICAgICAgIGlmIChncm91cC5zaG93TmVzdGVkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZWROZXN0ZWRHcm91cC52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBncm91cHNEYXRhLnVwZGF0ZSh1cGRhdGVkTmVzdGVkR3JvdXApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gc3Vic2NyaWJlIHRvIG5ldyBkYXRhc2V0XG4gICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7XG4gICAgICB1dGlsLmZvckVhY2godGhpcy5ncm91cExpc3RlbmVycywgKGNhbGxiYWNrLCBldmVudCkgPT4ge1xuICAgICAgICBtZS5ncm91cHNEYXRhLm9uKGV2ZW50LCBjYWxsYmFjaywgaWQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIGRyYXcgYWxsIG1zXG4gICAgICBpZHMgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCk7XG4gICAgICB0aGlzLl9vbkFkZEdyb3VwcyhpZHMpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSB0aGUgZ3JvdXAgaG9sZGluZyBhbGwgdW5ncm91cGVkIGl0ZW1zXG4gICAgdGhpcy5fdXBkYXRlVW5ncm91cGVkKCk7XG5cbiAgICAvLyB1cGRhdGUgdGhlIG9yZGVyIG9mIGFsbCBpdGVtcyBpbiBlYWNoIGdyb3VwXG4gICAgdGhpcy5fb3JkZXIoKTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuY2x1c3Rlcikge1xuICAgICAgdGhpcy5jbHVzdGVyR2VuZXJhdG9yLnVwZGF0ZURhdGEoKTtcbiAgICAgIHRoaXMuX2NsdXN0ZXJJdGVtcygpO1xuICAgICAgdGhpcy5tYXJrRGlydHkoeyByZWZyZXNoSXRlbXM6IHRydWUsIHJlc3RhY2tHcm91cHM6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnX2NoYW5nZScsIHtxdWV1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBncm91cHNcbiAgICogQHJldHVybnMge3Zpcy5EYXRhU2V0IHwgbnVsbH0gZ3JvdXBzXG4gICAqL1xuICBnZXRHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ3JvdXBzRGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gaXRlbSBieSBpdHMgaWRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkXG4gICAqL1xuICByZW1vdmVJdGVtKGlkKSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXNEYXRhLmdldChpZCk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gY29uZmlybSBkZWxldGlvblxuICAgICAgdGhpcy5vcHRpb25zLm9uUmVtb3ZlKGl0ZW0sIGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgIC8vIHJlbW92ZSBieSBpZCBoZXJlLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGFuIGl0ZW0gaGFzIG5vIGlkIGRlZmluZWRcbiAgICAgICAgICAvLyBpdHNlbGYsIHNvIGJldHRlciBub3QgZGVsZXRlIGJ5IHRoZSBpdGVtIGl0c2VsZlxuICAgICAgICAgIHRoaXMuaXRlbXNEYXRhLnJlbW92ZShpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHRpbWUgb2YgYW4gaXRlbSBiYXNlZCBvbiBpdCdzIGRhdGEgYW5kIG9wdGlvbnMudHlwZVxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbURhdGFcbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHlwZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2dldFR5cGUoaXRlbURhdGEpIHtcbiAgICByZXR1cm4gaXRlbURhdGEudHlwZSB8fCB0aGlzLm9wdGlvbnMudHlwZSB8fCAoaXRlbURhdGEuZW5kID8gJ3JhbmdlJyA6ICdib3gnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGdyb3VwIGlkIGZvciBhbiBpdGVtXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtRGF0YVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBncm91cElkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRHcm91cElkKGl0ZW1EYXRhKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuX2dldFR5cGUoaXRlbURhdGEpO1xuICAgIGlmICh0eXBlID09ICdiYWNrZ3JvdW5kJyAmJiBpdGVtRGF0YS5ncm91cCA9PSB1bmRlZmluZWQpIHtcbiAgICAgcmV0dXJuIEJBQ0tHUk9VTkQkMjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5ncm91cHNEYXRhID8gaXRlbURhdGEuZ3JvdXAgOiBVTkdST1VQRUQkMjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHVwZGF0ZWQgaXRlbXNcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gaWRzXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9vblVwZGF0ZShpZHMpIHtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG5cbiAgICBpZHMuZm9yRWFjaChpZCA9PiB7XG4gICAgICBjb25zdCBpdGVtRGF0YSA9IG1lLml0ZW1zRGF0YS5nZXQoaWQpO1xuICAgICAgbGV0IGl0ZW0gPSBtZS5pdGVtc1tpZF07XG4gICAgICBjb25zdCB0eXBlID0gaXRlbURhdGEgPyBtZS5fZ2V0VHlwZShpdGVtRGF0YSkgOiBudWxsO1xuXG4gICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IEl0ZW1TZXQudHlwZXNbdHlwZV07XG4gICAgICBsZXQgc2VsZWN0ZWQ7XG5cbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIC8vIHVwZGF0ZSBpdGVtICAgXHRcbiAgICAgICAgaWYgKCFjb25zdHJ1Y3RvciB8fCAhKGl0ZW0gaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICAvLyBpdGVtIHR5cGUgaGFzIGNoYW5nZWQsIGRlbGV0ZSB0aGUgaXRlbSBhbmQgcmVjcmVhdGUgaXRcbiAgICAgICAgICBzZWxlY3RlZCA9IGl0ZW0uc2VsZWN0ZWQ7IC8vIHByZXNlcnZlIHNlbGVjdGlvbiBvZiB0aGlzIGl0ZW1cbiAgICAgICAgICBtZS5fcmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgICBpdGVtID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBtZS5fdXBkYXRlSXRlbShpdGVtLCBpdGVtRGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFpdGVtICYmIGl0ZW1EYXRhKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBpdGVtXG4gICAgICAgIGlmIChjb25zdHJ1Y3Rvcikge1xuICAgICAgICAgIGl0ZW0gPSBuZXcgY29uc3RydWN0b3IoaXRlbURhdGEsIG1lLmNvbnZlcnNpb24sIG1lLm9wdGlvbnMpO1xuICAgICAgICAgIGl0ZW0uaWQgPSBpZDsgLy8gVE9ETzogbm90IHNvIG5pY2Ugc2V0dGluZyBpZCBhZnRlcndhcmRzXG5cbiAgICAgICAgICBtZS5fYWRkSXRlbShpdGVtKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnB1c2goaWQpO1xuICAgICAgICAgICAgaXRlbS5zZWxlY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5rbm93biBpdGVtIHR5cGUgXCIke3R5cGV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5fb3JkZXIoKTtcbiAgICBcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsdXN0ZXIpIHtcbiAgICAgIHRoaXMuY2x1c3RlckdlbmVyYXRvci5zZXRJdGVtcyh0aGlzLml0ZW1zLCB7IGFwcGx5T25DaGFuZ2VkTGV2ZWw6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5fY2x1c3Rlckl0ZW1zKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnX2NoYW5nZScsIHtxdWV1ZTogdHJ1ZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZW1vdmVkIGl0ZW1zXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGlkc1xuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBfb25SZW1vdmUoaWRzKSB7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgaWRzLmZvckVhY2goaWQgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IG1lLml0ZW1zW2lkXTtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIG1lLl9yZW1vdmVJdGVtKGl0ZW0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGNvdW50KSB7XG4gICAgICAvLyB1cGRhdGUgb3JkZXJcbiAgICAgIHRoaXMuX29yZGVyKCk7XG4gICAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdfY2hhbmdlJywge3F1ZXVlOiB0cnVlfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgb3JkZXIgb2YgaXRlbSBpbiBhbGwgZ3JvdXBzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb3JkZXIoKSB7XG4gICAgLy8gcmVvcmRlciB0aGUgaXRlbXMgaW4gYWxsIGdyb3Vwc1xuICAgIC8vIFRPRE86IG9wdGltaXphdGlvbjogb25seSByZW9yZGVyIGdyb3VwcyBhZmZlY3RlZCBieSB0aGUgY2hhbmdlZCBpdGVtc1xuICAgIHV0aWwuZm9yRWFjaCh0aGlzLmdyb3VwcywgZ3JvdXAgPT4ge1xuICAgICAgZ3JvdXAub3JkZXIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdXBkYXRlZCBncm91cHNcbiAgICogQHBhcmFtIHtudW1iZXJbXX0gaWRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25VcGRhdGVHcm91cHMoaWRzKSB7XG4gICAgdGhpcy5fb25BZGRHcm91cHMoaWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2hhbmdlZCBncm91cHMgKGFkZGVkIG9yIHVwZGF0ZWQpXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGlkc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uQWRkR3JvdXBzKGlkcykge1xuICAgIGNvbnN0IG1lID0gdGhpcztcblxuICAgIGlkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IG1lLmdyb3Vwc0RhdGEuZ2V0KGlkKTtcbiAgICAgIGxldCBncm91cCA9IG1lLmdyb3Vwc1tpZF07XG5cbiAgICAgIGlmICghZ3JvdXApIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHJlc2VydmVkIGlkc1xuICAgICAgICBpZiAoaWQgPT0gVU5HUk9VUEVEJDIgfHwgaWQgPT0gQkFDS0dST1VORCQyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbGxlZ2FsIGdyb3VwIGlkLiAke2lkfSBpcyBhIHJlc2VydmVkIGlkLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZ3JvdXBPcHRpb25zID0gT2JqZWN0LmNyZWF0ZShtZS5vcHRpb25zKTtcbiAgICAgICAgdXRpbC5leHRlbmQoZ3JvdXBPcHRpb25zLCB7XG4gICAgICAgICAgaGVpZ2h0OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGdyb3VwID0gbmV3IEdyb3VwKGlkLCBncm91cERhdGEsIG1lKTtcbiAgICAgICAgbWUuZ3JvdXBzW2lkXSA9IGdyb3VwO1xuXG4gICAgICAgIC8vIGFkZCBpdGVtcyB3aXRoIHRoaXMgZ3JvdXBJZCB0byB0aGUgbmV3IGdyb3VwXG4gICAgICAgIGZvciAoY29uc3QgaXRlbUlkIGluIG1lLml0ZW1zKSB7XG4gICAgICAgICAgaWYgKG1lLml0ZW1zLmhhc093blByb3BlcnR5KGl0ZW1JZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBtZS5pdGVtc1tpdGVtSWRdO1xuICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5ncm91cCA9PSBpZCkge1xuICAgICAgICAgICAgICBncm91cC5hZGQoaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ3JvdXAub3JkZXIoKTtcbiAgICAgICAgZ3JvdXAuc2hvdygpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIHVwZGF0ZSBncm91cFxuICAgICAgICBncm91cC5zZXREYXRhKGdyb3VwRGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdfY2hhbmdlJywge3F1ZXVlOiB0cnVlfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHJlbW92ZWQgZ3JvdXBzXG4gICAqIEBwYXJhbSB7bnVtYmVyW119IGlkc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uUmVtb3ZlR3JvdXBzKGlkcykge1xuICAgIGlkcy5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHNbaWRdO1xuXG4gICAgICBpZiAoZ3JvdXApIHtcbiAgICAgICAgZ3JvdXAuZGlzcG9zZSgpO1xuICAgICAgICBkZWxldGUgdGhpcy5ncm91cHNbaWRdO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5jbHVzdGVyKSB7XG4gICAgICB0aGlzLmNsdXN0ZXJHZW5lcmF0b3IudXBkYXRlRGF0YSgpO1xuICAgICAgdGhpcy5fY2x1c3Rlckl0ZW1zKCk7XG4gICAgfSBcblxuICAgIHRoaXMubWFya0RpcnR5KHsgcmVzdGFja0dyb3VwczogISF0aGlzLm9wdGlvbnMuY2x1c3RlciB9KTtcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdfY2hhbmdlJywge3F1ZXVlOiB0cnVlfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVvcmRlciB0aGUgZ3JvdXBzIGlmIG5lZWRlZFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBjaGFuZ2VkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb3JkZXJHcm91cHMoKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXBzRGF0YSkge1xuICAgICAgLy8gcmVvcmRlciB0aGUgZ3JvdXBzXG4gICAgICBsZXQgZ3JvdXBJZHMgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtcbiAgICAgICAgb3JkZXI6IHRoaXMub3B0aW9ucy5ncm91cE9yZGVyXG4gICAgICB9KTtcblxuICAgICAgZ3JvdXBJZHMgPSB0aGlzLl9vcmRlck5lc3RlZEdyb3Vwcyhncm91cElkcyk7XG5cbiAgICAgIGNvbnN0IGNoYW5nZWQgPSAhdXRpbC5lcXVhbEFycmF5KGdyb3VwSWRzLCB0aGlzLmdyb3VwSWRzKTtcbiAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgIC8vIGhpZGUgYWxsIGdyb3VwcywgcmVtb3ZlcyB0aGVtIGZyb20gdGhlIERPTVxuICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwcztcbiAgICAgICAgZ3JvdXBJZHMuZm9yRWFjaChncm91cElkID0+IHtcbiAgICAgICAgICBncm91cHNbZ3JvdXBJZF0uaGlkZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzaG93IHRoZSBncm91cHMgYWdhaW4sIGF0dGFjaCB0aGVtIHRvIHRoZSBET00gaW4gY29ycmVjdCBvcmRlclxuICAgICAgICBncm91cElkcy5mb3JFYWNoKGdyb3VwSWQgPT4ge1xuICAgICAgICAgIGdyb3Vwc1tncm91cElkXS5zaG93KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZ3JvdXBJZHMgPSBncm91cElkcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYW5nZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW9yZGVyIHRoZSBuZXN0ZWQgZ3JvdXBzXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGdyb3VwSWRzXG4gICAqIEByZXR1cm5zIHtBcnJheS48bnVtYmVyPn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vcmRlck5lc3RlZEdyb3Vwcyhncm91cElkcykge1xuICAgIC8qKlxuICAgICAqIFJlY3Vyc2l2ZWx5IG9yZGVyIG5lc3RlZCBncm91cHNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SXRlbVNldH0gdFxuICAgICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGdyb3VwSWRzXG4gICAgICogQHJldHVybnMge0FycmF5LjxudW1iZXI+fVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0T3JkZXJlZE5lc3RlZEdyb3Vwcyh0LCBncm91cElkcykge1xuICAgICAgbGV0IHJlc3VsdCA9IFtdO1xuICAgICAgZ3JvdXBJZHMuZm9yRWFjaChncm91cElkID0+IHtcbiAgICAgICAgcmVzdWx0LnB1c2goZ3JvdXBJZCk7XG4gICAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHQuZ3JvdXBzRGF0YS5nZXQoZ3JvdXBJZCk7XG4gICAgICAgIGlmIChncm91cERhdGEubmVzdGVkR3JvdXBzKSB7XG4gICAgICAgICAgY29uc3QgbmVzdGVkR3JvdXBJZHMgPSB0Lmdyb3Vwc0RhdGEuZ2V0KHtcbiAgICAgICAgICAgIGZpbHRlcihuZXN0ZWRHcm91cCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmVzdGVkR3JvdXAubmVzdGVkSW5Hcm91cCA9PSBncm91cElkO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9yZGVyOiB0Lm9wdGlvbnMuZ3JvdXBPcmRlclxuICAgICAgICAgIH0pLm1hcChuZXN0ZWRHcm91cCA9PiBuZXN0ZWRHcm91cC5pZCk7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmNvbmNhdChnZXRPcmRlcmVkTmVzdGVkR3JvdXBzKHQsIG5lc3RlZEdyb3VwSWRzKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIGNvbnN0IHRvcEdyb3VwSWRzID0gZ3JvdXBJZHMuZmlsdGVyKGdyb3VwSWQgPT4gIXRoaXMuZ3JvdXBzRGF0YS5nZXQoZ3JvdXBJZCkubmVzdGVkSW5Hcm91cCk7XG5cbiAgICByZXR1cm4gZ2V0T3JkZXJlZE5lc3RlZEdyb3Vwcyh0aGlzLCB0b3BHcm91cElkcyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbmV3IGl0ZW1cbiAgICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRkSXRlbShpdGVtKSB7XG4gICAgdGhpcy5pdGVtc1tpdGVtLmlkXSA9IGl0ZW07XG5cbiAgICAvLyBhZGQgdG8gZ3JvdXBcbiAgICBjb25zdCBncm91cElkID0gdGhpcy5nZXRHcm91cElkKGl0ZW0uZGF0YSk7XG4gICAgY29uc3QgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkXTtcblxuICAgIGlmICghZ3JvdXApIHtcbiAgICAgIGl0ZW0uZ3JvdXBTaG93aW5nID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChncm91cCAmJiBncm91cC5kYXRhICYmIGdyb3VwLmRhdGEuc2hvd05lc3RlZCkge1xuICAgICAgaXRlbS5ncm91cFNob3dpbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChncm91cCkgZ3JvdXAuYWRkKGl0ZW0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBhbiBleGlzdGluZyBpdGVtXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbURhdGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVJdGVtKGl0ZW0sIGl0ZW1EYXRhKSB7XG4gICAgLy8gdXBkYXRlIHRoZSBpdGVtcyBkYXRhICh3aWxsIHJlZHJhdyB0aGUgaXRlbSB3aGVuIGRpc3BsYXllZClcbiAgICBpdGVtLnNldERhdGEoaXRlbURhdGEpO1xuXG4gICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuZ2V0R3JvdXBJZChpdGVtLmRhdGEpO1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZF07XG4gICAgaWYgKCFncm91cCkge1xuICAgICAgaXRlbS5ncm91cFNob3dpbmcgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGdyb3VwICYmIGdyb3VwLmRhdGEgJiYgZ3JvdXAuZGF0YS5zaG93TmVzdGVkKSB7XG4gICAgICBpdGVtLmdyb3VwU2hvd2luZyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBpdGVtIGZyb20gdGhlIEl0ZW1TZXQ6IHJlbW92ZSBpdCBmcm9tIHRoZSBET00sIGZyb20gdGhlIG1hcFxuICAgKiB3aXRoIGl0ZW1zLCBhbmQgZnJvbSB0aGUgbWFwIHdpdGggdmlzaWJsZSBpdGVtcywgYW5kIGZyb20gdGhlIHNlbGVjdGlvblxuICAgKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZW1vdmVJdGVtKGl0ZW0pIHtcbiAgICAvLyByZW1vdmUgZnJvbSBET01cbiAgICBpdGVtLmhpZGUoKTtcblxuICAgIC8vIHJlbW92ZSBmcm9tIGl0ZW1zXG4gICAgZGVsZXRlIHRoaXMuaXRlbXNbaXRlbS5pZF07XG5cbiAgICAvLyByZW1vdmUgZnJvbSBzZWxlY3Rpb25cbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0aW9uLmluZGV4T2YoaXRlbS5pZCk7XG4gICAgaWYgKGluZGV4ICE9IC0xKSB0aGlzLnNlbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgLy8gcmVtb3ZlIGZyb20gZ3JvdXBcbiAgICBpdGVtLnBhcmVudCAmJiBpdGVtLnBhcmVudC5yZW1vdmUoaXRlbSk7XG5cbiAgICAvLyByZW1vdmUgVG9vbHRpcCBmcm9tIERPTVxuICAgIGlmICh0aGlzLnBvcHVwICE9IG51bGwpIHtcbiAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gYXJyYXkgY29udGFpbmluZyBhbGwgaXRlbXMgYmVpbmcgYSByYW5nZSAoaGF2aW5nIGFuIGVuZCBkYXRlKVxuICAgKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29uc3RydWN0QnlFbmRBcnJheShhcnJheSkge1xuICAgIGNvbnN0IGVuZEFycmF5ID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoYXJyYXlbaV0gaW5zdGFuY2VvZiBSYW5nZUl0ZW0pIHtcbiAgICAgICAgZW5kQXJyYXkucHVzaChhcnJheVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbmRBcnJheTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciB0aGUgY2xpY2tlZCBpdGVtIG9uIHRvdWNoLCBiZWZvcmUgZHJhZ1N0YXJ0IGlzIGluaXRpYXRlZC5cbiAgICpcbiAgICogZHJhZ1N0YXJ0IGlzIGluaXRpYXRlZCBmcm9tIGEgbW91c2Vtb3ZlIGV2ZW50LCBBRlRFUiB0aGUgbW91c2UvdG91Y2ggaXNcbiAgICogYWxyZWFkeSBtb3ZpbmcuIFRoZXJlZm9yZSwgdGhlIG1vdXNlL3RvdWNoIGNhbiBzb21ldGltZXMgYmUgYWJvdmUgYW4gb3RoZXJcbiAgICogRE9NIGVsZW1lbnQgdGhhbiB0aGUgaXRlbSBpdHNlbGYuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Ub3VjaChldmVudCkge1xuICAgIC8vIHN0b3JlIHRoZSB0b3VjaGVkIGl0ZW0sIHVzZWQgaW4gX29uRHJhZ1N0YXJ0XG4gICAgdGhpcy50b3VjaFBhcmFtcy5pdGVtID0gdGhpcy5pdGVtRnJvbVRhcmdldChldmVudCk7XG4gICAgdGhpcy50b3VjaFBhcmFtcy5kcmFnTGVmdEl0ZW0gPSBldmVudC50YXJnZXQuZHJhZ0xlZnRJdGVtIHx8IGZhbHNlO1xuICAgIHRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbSA9IGV2ZW50LnRhcmdldC5kcmFnUmlnaHRJdGVtIHx8IGZhbHNlO1xuICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhbiBncm91cCBpZCwgcmV0dXJucyB0aGUgaW5kZXggaXQgaGFzLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gZ3JvdXBJZFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBpbmRleCAvIGdyb3VwSWRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRHcm91cEluZGV4KGdyb3VwSWQpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ncm91cElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmIChncm91cElkID09IHRoaXMuZ3JvdXBJZHNbaV0pXG4gICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGRyYWdnaW5nIHRoZSBzZWxlY3RlZCBldmVudHNcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkRyYWdTdGFydChldmVudCkge1xuICAgIGlmICh0aGlzLnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nKSB7IHJldHVybjsgfVxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnRvdWNoUGFyYW1zLml0ZW0gfHwgbnVsbDtcbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgbGV0IHByb3BzO1xuXG4gICAgaWYgKGl0ZW0gJiYgKGl0ZW0uc2VsZWN0ZWQgfHwgdGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLml0ZW0pKSB7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyAmJlxuICAgICAgICAgICF0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZSAmJlxuICAgICAgICAgICF0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZSBvcHRpb25zLmVkaXRhYmxlXG4gICAgICBpZiAoKGl0ZW0uZWRpdGFibGUgIT0gbnVsbCAmJiAhaXRlbS5lZGl0YWJsZS51cGRhdGVUaW1lICYmICFpdGVtLmVkaXRhYmxlLnVwZGF0ZUdyb3VwKVxuICAgICAgICAgICYmICF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRyYWdMZWZ0SXRlbSA9IHRoaXMudG91Y2hQYXJhbXMuZHJhZ0xlZnRJdGVtO1xuICAgICAgY29uc3QgZHJhZ1JpZ2h0SXRlbSA9IHRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbTtcbiAgICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xuXG4gICAgICBpZiAoZHJhZ0xlZnRJdGVtKSB7XG4gICAgICAgIHByb3BzID0ge1xuICAgICAgICAgIGl0ZW06IGRyYWdMZWZ0SXRlbSxcbiAgICAgICAgICBpbml0aWFsWDogZXZlbnQuY2VudGVyLngsXG4gICAgICAgICAgZHJhZ0xlZnQ6ICB0cnVlLFxuICAgICAgICAgIGRhdGE6IHRoaXMuX2Nsb25lSXRlbURhdGEoaXRlbS5kYXRhKVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzID0gW3Byb3BzXTtcbiAgICAgIH0gZWxzZSBpZiAoZHJhZ1JpZ2h0SXRlbSkge1xuICAgICAgICBwcm9wcyA9IHtcbiAgICAgICAgICBpdGVtOiBkcmFnUmlnaHRJdGVtLFxuICAgICAgICAgIGluaXRpYWxYOiBldmVudC5jZW50ZXIueCxcbiAgICAgICAgICBkcmFnUmlnaHQ6IHRydWUsXG4gICAgICAgICAgZGF0YTogdGhpcy5fY2xvbmVJdGVtRGF0YShpdGVtLmRhdGEpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMgPSBbcHJvcHNdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkICYmIChldmVudC5zcmNFdmVudC5jdHJsS2V5IHx8IGV2ZW50LnNyY0V2ZW50Lm1ldGFLZXkpKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyByYW5nZSBpdGVtIHdoZW4gZHJhZ2dpbmcgd2l0aCBjdHJsIGtleSBkb3duXG4gICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0QWRkSXRlbShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZih0aGlzLmdyb3VwSWRzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAvLyBNaXRpZ2F0ZXMgYSByYWNlIGNvbmRpdGlvbiBpZiBfb25EcmFnU3RhcnQoKSBpc1xuICAgICAgICAgIC8vIGNhbGxlZCBhZnRlciBtYXJrRGlydHkoKSB3aXRob3V0IHJlZHJhdygpIGJlaW5nIGNhbGxlZCBiZXR3ZWVuLlxuICAgICAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGJhc2VHcm91cEluZGV4ID0gdGhpcy5fZ2V0R3JvdXBJbmRleChpdGVtLmRhdGEuZ3JvdXApO1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zVG9EcmFnID0gKHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5pdGVtICYmICFpdGVtLnNlbGVjdGVkKSA/IFtpdGVtLmlkXSA6IHRoaXMuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICAgICAgdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMgPSBpdGVtc1RvRHJhZy5tYXAoaWQgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBtZS5pdGVtc1tpZF07XG4gICAgICAgICAgY29uc3QgZ3JvdXBJbmRleCA9IG1lLl9nZXRHcm91cEluZGV4KGl0ZW0uZGF0YS5ncm91cCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGl0ZW0sXG4gICAgICAgICAgICBpbml0aWFsWDogZXZlbnQuY2VudGVyLngsXG4gICAgICAgICAgICBncm91cE9mZnNldDogYmFzZUdyb3VwSW5kZXgtZ3JvdXBJbmRleCxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuX2Nsb25lSXRlbURhdGEoaXRlbS5kYXRhKVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQgJiYgKGV2ZW50LnNyY0V2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc3JjRXZlbnQubWV0YUtleSkpIHtcbiAgICAgIC8vIGNyZWF0ZSBhIG5ldyByYW5nZSBpdGVtIHdoZW4gZHJhZ2dpbmcgd2l0aCBjdHJsIGtleSBkb3duXG4gICAgICB0aGlzLl9vbkRyYWdTdGFydEFkZEl0ZW0oZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBjcmVhdGluZyBhIG5ldyByYW5nZSBpdGVtIGJ5IGRyYWdnaW5nLlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRHJhZ1N0YXJ0QWRkSXRlbShldmVudCkge1xuICAgIGNvbnN0IHNuYXAgPSB0aGlzLm9wdGlvbnMuc25hcCB8fCBudWxsO1xuICAgIGNvbnN0IGZyYW1lUmVjdCA9IHRoaXMuZG9tLmZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gcGx1cyAoaWYgcnRsKSAxMCB0byBjb21wZW5zYXRlIGZvciB0aGUgZHJhZyBzdGFydGluZyBhcyBzb29uIGFzIHlvdSd2ZSBtb3ZlZCAxMHB4XG4gICAgY29uc3QgeCA9IHRoaXMub3B0aW9ucy5ydGwgPyBmcmFtZVJlY3QucmlnaHQgLSBldmVudC5jZW50ZXIueCAgKyAxMCA6IGV2ZW50LmNlbnRlci54IC0gZnJhbWVSZWN0LmxlZnQgLSAxMDtcblxuICAgIGNvbnN0IHRpbWUgPSB0aGlzLmJvZHkudXRpbC50b1RpbWUoeCk7XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpO1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmJvZHkudXRpbC5nZXRTdGVwKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBzbmFwID8gc25hcCh0aW1lLCBzY2FsZSwgc3RlcCkgOiB0aW1lO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0O1xuXG4gICAgY29uc3QgaXRlbURhdGEgPSB7XG4gICAgICB0eXBlOiAncmFuZ2UnLFxuICAgICAgc3RhcnQsXG4gICAgICBlbmQsXG4gICAgICBjb250ZW50OiAnbmV3IGl0ZW0nXG4gICAgfTtcblxuICAgIGNvbnN0IGlkID0gdjQoKTtcbiAgICBpdGVtRGF0YVt0aGlzLml0ZW1zRGF0YS5pZFByb3BdID0gaWQ7XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBGcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIGl0ZW1EYXRhLmdyb3VwID0gZ3JvdXAuZ3JvdXBJZDtcbiAgICB9XG4gICAgY29uc3QgbmV3SXRlbSA9IG5ldyBSYW5nZUl0ZW0oaXRlbURhdGEsIHRoaXMuY29udmVyc2lvbiwgdGhpcy5vcHRpb25zKTtcbiAgICBuZXdJdGVtLmlkID0gaWQ7IC8vIFRPRE86IG5vdCBzbyBuaWNlIHNldHRpbmcgaWQgYWZ0ZXJ3YXJkc1xuICAgIG5ld0l0ZW0uZGF0YSA9IHRoaXMuX2Nsb25lSXRlbURhdGEoaXRlbURhdGEpO1xuICAgIHRoaXMuX2FkZEl0ZW0obmV3SXRlbSk7XG4gICAgdGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW0gPSBuZXdJdGVtO1xuICAgIFxuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgaXRlbTogbmV3SXRlbSxcbiAgICAgIGluaXRpYWxYOiBldmVudC5jZW50ZXIueCxcbiAgICAgIGRhdGE6IG5ld0l0ZW0uZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgcHJvcHMuZHJhZ0xlZnQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9wcy5kcmFnUmlnaHQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcyA9IFtwcm9wc107XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFnIHNlbGVjdGVkIGl0ZW1zXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25EcmFnKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucG9wdXAgIT0gbnVsbCAmJiB0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBzICYmICF0aGlzLnBvcHVwLmhpZGRlbikge1xuICAgICAgLy8gdGhpcy5wb3B1cC5oaWRlKCk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lcjtcbiAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLnBvcHVwLnNldFBvc2l0aW9uKFxuICAgICAgICBldmVudC5jZW50ZXIueCAtIGNvbnRhaW5lclJlY3QubGVmdCArIGNvbnRhaW5lci5vZmZzZXRMZWZ0LFxuICAgICAgICBldmVudC5jZW50ZXIueSAtIGNvbnRhaW5lclJlY3QudG9wICsgY29udGFpbmVyLm9mZnNldFRvcFxuICAgICAgKTtcbiAgICAgIHRoaXMucG9wdXAuc2hvdygpOyAvLyByZWRyYXdcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgY29uc3Qgc25hcCA9IHRoaXMub3B0aW9ucy5zbmFwIHx8IG51bGw7XG4gICAgICBjb25zdCBkb21Sb290T2Zmc2V0TGVmdCA9IHRoaXMuYm9keS5kb20ucm9vdC5vZmZzZXRMZWZ0O1xuICAgICAgY29uc3QgeE9mZnNldCA9IHRoaXMub3B0aW9ucy5ydGwgPyBkb21Sb290T2Zmc2V0TGVmdCArIHRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aCA6IGRvbVJvb3RPZmZzZXRMZWZ0ICsgdGhpcy5ib2R5LmRvbVByb3BzLmxlZnQud2lkdGg7XG4gICAgICBjb25zdCBzY2FsZSA9IHRoaXMuYm9keS51dGlsLmdldFNjYWxlKCk7XG4gICAgICBjb25zdCBzdGVwID0gdGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpO1xuXG4gICAgICAvL29ubHkgY2FsY3VsYXRlIHRoZSBuZXcgZ3JvdXAgZm9yIHRoZSBpdGVtIHRoYXQncyBhY3R1YWxseSBkcmFnZ2VkXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLnRvdWNoUGFyYW1zLnNlbGVjdGVkSXRlbTtcbiAgICAgIGNvbnN0IHVwZGF0ZUdyb3VwQWxsb3dlZCA9ICgodGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXMgfHwgc2VsZWN0ZWRJdGVtLmVkaXRhYmxlID09IG51bGwpICYmIHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVHcm91cCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zICYmIHNlbGVjdGVkSXRlbS5lZGl0YWJsZSAhPSBudWxsICYmIHNlbGVjdGVkSXRlbS5lZGl0YWJsZS51cGRhdGVHcm91cCk7XG4gICAgICBsZXQgbmV3R3JvdXBCYXNlID0gbnVsbDtcbiAgICAgIGlmICh1cGRhdGVHcm91cEFsbG93ZWQgJiYgc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0uZGF0YS5ncm91cCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBkcmFnIGZyb20gb25lIGdyb3VwIHRvIGFub3RoZXJcbiAgICAgICAgICBjb25zdCBncm91cCA9IG1lLmdyb3VwRnJvbVRhcmdldChldmVudCk7XG4gICAgICAgICAgaWYgKGdyb3VwKSB7XG4gICAgICAgICAgICAvL3dlIGtub3cgdGhlIG9mZnNldCBmb3IgYWxsIGl0ZW1zLCBzbyB0aGUgbmV3IGdyb3VwIGZvciBhbGwgaXRlbXNcbiAgICAgICAgICAgIC8vd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzIG9uZS5cbiAgICAgICAgICAgIG5ld0dyb3VwQmFzZSA9IHRoaXMuX2dldEdyb3VwSW5kZXgoZ3JvdXAuZ3JvdXBJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG1vdmVcbiAgICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzLmZvckVhY2gocHJvcHMgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gbWUuYm9keS51dGlsLnRvVGltZShldmVudC5jZW50ZXIueCAtIHhPZmZzZXQpO1xuICAgICAgICBjb25zdCBpbml0aWFsID0gbWUuYm9keS51dGlsLnRvVGltZShwcm9wcy5pbml0aWFsWCAtIHhPZmZzZXQpO1xuICAgICAgICBsZXQgb2Zmc2V0O1xuICAgICAgICBsZXQgaW5pdGlhbFN0YXJ0O1xuICAgICAgICBsZXQgaW5pdGlhbEVuZDtcbiAgICAgICAgbGV0IHN0YXJ0O1xuICAgICAgICBsZXQgZW5kO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gLShjdXJyZW50IC0gaW5pdGlhbCk7IC8vIG1zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0ID0gKGN1cnJlbnQgLSBpbml0aWFsKTsgLy8gbXNcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpdGVtRGF0YSA9IHRoaXMuX2Nsb25lSXRlbURhdGEocHJvcHMuaXRlbS5kYXRhKTsgLy8gY2xvbmUgdGhlIGRhdGFcbiAgICAgICAgaWYgKHByb3BzLml0ZW0uZWRpdGFibGUgIT0gbnVsbFxuICAgICAgICAgICYmICFwcm9wcy5pdGVtLmVkaXRhYmxlLnVwZGF0ZVRpbWVcbiAgICAgICAgICAmJiAhcHJvcHMuaXRlbS5lZGl0YWJsZS51cGRhdGVHcm91cFxuICAgICAgICAgICYmICFtZS5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1cGRhdGVUaW1lQWxsb3dlZCA9ICgodGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXMgfHwgc2VsZWN0ZWRJdGVtLmVkaXRhYmxlID09IG51bGwpICYmIHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyAmJiBzZWxlY3RlZEl0ZW0uZWRpdGFibGUgIT0gbnVsbCAmJiBzZWxlY3RlZEl0ZW0uZWRpdGFibGUudXBkYXRlVGltZSk7XG4gICAgICAgIGlmICh1cGRhdGVUaW1lQWxsb3dlZCkge1xuICAgICAgICAgIGlmIChwcm9wcy5kcmFnTGVmdCkge1xuICAgICAgICAgICAgLy8gZHJhZyBsZWZ0IHNpZGUgb2YgYSByYW5nZSBpdGVtXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJ0bCkge1xuICAgICAgICAgICAgICBpZiAoaXRlbURhdGEuZW5kICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGluaXRpYWxFbmQgPSB1dGlsLmNvbnZlcnQocHJvcHMuZGF0YS5lbmQsICdEYXRlJyk7XG4gICAgICAgICAgICAgICAgZW5kID0gbmV3IERhdGUoaW5pdGlhbEVuZC52YWx1ZU9mKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHBhc3MgYSBNb21lbnQgaW5zdGVhZCBvZiBhIERhdGUgdG8gc25hcCgpLiAoQnJlYWtpbmcgY2hhbmdlKVxuICAgICAgICAgICAgICAgIGl0ZW1EYXRhLmVuZCA9IHNuYXAgPyBzbmFwKGVuZCwgc2NhbGUsIHN0ZXApIDogZW5kO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoaXRlbURhdGEuc3RhcnQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaW5pdGlhbFN0YXJ0ID0gdXRpbC5jb252ZXJ0KHByb3BzLmRhdGEuc3RhcnQsICdEYXRlJyk7XG4gICAgICAgICAgICAgICAgc3RhcnQgPSBuZXcgRGF0ZShpbml0aWFsU3RhcnQudmFsdWVPZigpICsgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGEgTW9tZW50IGluc3RlYWQgb2YgYSBEYXRlIHRvIHNuYXAoKS4gKEJyZWFraW5nIGNoYW5nZSlcbiAgICAgICAgICAgICAgICBpdGVtRGF0YS5zdGFydCA9IHNuYXAgPyBzbmFwKHN0YXJ0LCBzY2FsZSwgc3RlcCkgOiBzdGFydDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChwcm9wcy5kcmFnUmlnaHQpIHtcbiAgICAgICAgICAgIC8vIGRyYWcgcmlnaHQgc2lkZSBvZiBhIHJhbmdlIGl0ZW1cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgICAgICAgIGlmIChpdGVtRGF0YS5zdGFydCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpbml0aWFsU3RhcnQgPSB1dGlsLmNvbnZlcnQocHJvcHMuZGF0YS5zdGFydCwgJ0RhdGUnKTtcbiAgICAgICAgICAgICAgICBzdGFydCA9IG5ldyBEYXRlKGluaXRpYWxTdGFydC52YWx1ZU9mKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHBhc3MgYSBNb21lbnQgaW5zdGVhZCBvZiBhIERhdGUgdG8gc25hcCgpLiAoQnJlYWtpbmcgY2hhbmdlKVxuICAgICAgICAgICAgICAgIGl0ZW1EYXRhLnN0YXJ0ID0gc25hcCA/IHNuYXAoc3RhcnQsIHNjYWxlLCBzdGVwKSA6IHN0YXJ0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoaXRlbURhdGEuZW5kICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGluaXRpYWxFbmQgPSB1dGlsLmNvbnZlcnQocHJvcHMuZGF0YS5lbmQsICdEYXRlJyk7XG4gICAgICAgICAgICAgICAgZW5kID0gbmV3IERhdGUoaW5pdGlhbEVuZC52YWx1ZU9mKCkgKyBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IHBhc3MgYSBNb21lbnQgaW5zdGVhZCBvZiBhIERhdGUgdG8gc25hcCgpLiAoQnJlYWtpbmcgY2hhbmdlKVxuICAgICAgICAgICAgICAgIGl0ZW1EYXRhLmVuZCA9IHNuYXAgPyBzbmFwKGVuZCwgc2NhbGUsIHN0ZXApIDogZW5kO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gZHJhZyBib3RoIHN0YXJ0IGFuZCBlbmRcbiAgICAgICAgICAgIGlmIChpdGVtRGF0YS5zdGFydCAhPSB1bmRlZmluZWQpIHtcblxuICAgICAgICAgICAgICBpbml0aWFsU3RhcnQgPSB1dGlsLmNvbnZlcnQocHJvcHMuZGF0YS5zdGFydCwgJ0RhdGUnKS52YWx1ZU9mKCk7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gbmV3IERhdGUoaW5pdGlhbFN0YXJ0ICsgb2Zmc2V0KTtcblxuICAgICAgICAgICAgICBpZiAoaXRlbURhdGEuZW5kICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGluaXRpYWxFbmQgPSB1dGlsLmNvbnZlcnQocHJvcHMuZGF0YS5lbmQsICdEYXRlJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gID0gaW5pdGlhbEVuZC52YWx1ZU9mKCkgLSBpbml0aWFsU3RhcnQudmFsdWVPZigpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIE1vbWVudCBpbnN0ZWFkIG9mIGEgRGF0ZSB0byBzbmFwKCkuIChCcmVha2luZyBjaGFuZ2UpXG4gICAgICAgICAgICAgICAgaXRlbURhdGEuc3RhcnQgPSBzbmFwID8gc25hcChzdGFydCwgc2NhbGUsIHN0ZXApIDogc3RhcnQ7XG4gICAgICAgICAgICAgICAgaXRlbURhdGEuZW5kICAgPSBuZXcgRGF0ZShpdGVtRGF0YS5zdGFydC52YWx1ZU9mKCkgKyBkdXJhdGlvbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcGFzcyBhIE1vbWVudCBpbnN0ZWFkIG9mIGEgRGF0ZSB0byBzbmFwKCkuIChCcmVha2luZyBjaGFuZ2UpXG4gICAgICAgICAgICAgICAgaXRlbURhdGEuc3RhcnQgPSBzbmFwID8gc25hcChzdGFydCwgc2NhbGUsIHN0ZXApIDogc3RhcnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodXBkYXRlR3JvdXBBbGxvd2VkICYmICghcHJvcHMuZHJhZ0xlZnQgJiYgIXByb3BzLmRyYWdSaWdodCkgJiYgbmV3R3JvdXBCYXNlIT1udWxsKSB7XG4gICAgICAgICAgaWYgKGl0ZW1EYXRhLmdyb3VwICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IG5ld09mZnNldCA9IG5ld0dyb3VwQmFzZSAtIHByb3BzLmdyb3VwT2Zmc2V0O1xuXG4gICAgICAgICAgICAvL21ha2Ugc3VyZSB3ZSBzdGF5IGluIGJvdW5kc1xuICAgICAgICAgICAgbmV3T2Zmc2V0ID0gTWF0aC5tYXgoMCwgbmV3T2Zmc2V0KTtcbiAgICAgICAgICAgIG5ld09mZnNldCA9IE1hdGgubWluKG1lLmdyb3VwSWRzLmxlbmd0aC0xLCBuZXdPZmZzZXQpO1xuICAgICAgICAgICAgaXRlbURhdGEuZ3JvdXAgPSBtZS5ncm91cElkc1tuZXdPZmZzZXRdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbmZpcm0gbW92aW5nIHRoZSBpdGVtXG4gICAgICAgIGl0ZW1EYXRhID0gdGhpcy5fY2xvbmVJdGVtRGF0YShpdGVtRGF0YSk7ICAvLyBjb252ZXJ0IHN0YXJ0IGFuZCBlbmQgdG8gdGhlIGNvcnJlY3QgdHlwZVxuICAgICAgICBtZS5vcHRpb25zLm9uTW92aW5nKGl0ZW1EYXRhLCBpdGVtRGF0YSA9PiB7XG4gICAgICAgICAgaWYgKGl0ZW1EYXRhKSB7XG4gICAgICAgICAgICBwcm9wcy5pdGVtLnNldERhdGEodGhpcy5fY2xvbmVJdGVtRGF0YShpdGVtRGF0YSwgJ0RhdGUnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdfY2hhbmdlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYW4gaXRlbSB0byBhbm90aGVyIGdyb3VwXG4gICAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gZ3JvdXBJZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21vdmVUb0dyb3VwKGl0ZW0sIGdyb3VwSWQpIHtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzW2dyb3VwSWRdO1xuICAgIGlmIChncm91cCAmJiBncm91cC5ncm91cElkICE9IGl0ZW0uZGF0YS5ncm91cCkge1xuICAgICAgY29uc3Qgb2xkR3JvdXAgPSBpdGVtLnBhcmVudDtcbiAgICAgIG9sZEdyb3VwLnJlbW92ZShpdGVtKTtcbiAgICAgIG9sZEdyb3VwLm9yZGVyKCk7XG4gICAgICBcbiAgICAgIGl0ZW0uZGF0YS5ncm91cCA9IGdyb3VwLmdyb3VwSWQ7XG4gICAgICBcbiAgICAgIGdyb3VwLmFkZChpdGVtKTtcbiAgICAgIGdyb3VwLm9yZGVyKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVuZCBvZiBkcmFnZ2luZyBzZWxlY3RlZCBpdGVtc1xuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uRHJhZ0VuZChldmVudCkge1xuICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICBjb25zdCBpdGVtUHJvcHMgPSB0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcztcbiAgICAgIHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzID0gbnVsbDtcblxuICAgICAgaXRlbVByb3BzLmZvckVhY2gocHJvcHMgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IHByb3BzLml0ZW0uaWQ7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG1lLml0ZW1zRGF0YS5nZXQoaWQpICE9IG51bGw7XG5cbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAvLyBhZGQgYSBuZXcgaXRlbVxuICAgICAgICAgIG1lLm9wdGlvbnMub25BZGQocHJvcHMuaXRlbS5kYXRhLCBpdGVtRGF0YSA9PiB7XG4gICAgICAgICAgICBtZS5fcmVtb3ZlSXRlbShwcm9wcy5pdGVtKTsgLy8gcmVtb3ZlIHRlbXBvcmFyeSBpdGVtXG4gICAgICAgICAgICBpZiAoaXRlbURhdGEpIHtcbiAgICAgICAgICAgICAgbWUuaXRlbXNEYXRhLmFkZChpdGVtRGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGZvcmNlIHJlLXN0YWNraW5nIG9mIGFsbCBpdGVtcyBuZXh0IHJlZHJhd1xuICAgICAgICAgICAgbWUuYm9keS5lbWl0dGVyLmVtaXQoJ19jaGFuZ2UnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgZXhpc3RpbmcgaXRlbVxuICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhID0gdGhpcy5fY2xvbmVJdGVtRGF0YShwcm9wcy5pdGVtLmRhdGEpOyAvLyBjb252ZXJ0IHN0YXJ0IGFuZCBlbmQgdG8gdGhlIGNvcnJlY3QgdHlwZVxuICAgICAgICAgIG1lLm9wdGlvbnMub25Nb3ZlKGl0ZW1EYXRhLCBpdGVtRGF0YSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbURhdGEpIHtcbiAgICAgICAgICAgICAgLy8gYXBwbHkgY2hhbmdlc1xuICAgICAgICAgICAgICBpdGVtRGF0YVt0aGlzLml0ZW1zRGF0YS5pZFByb3BdID0gaWQ7IC8vIGVuc3VyZSB0aGUgaXRlbSBjb250YWlucyBpdHMgaWQgKGNhbiBiZSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgIHRoaXMuaXRlbXNEYXRhLnVwZGF0ZShpdGVtRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gcmVzdG9yZSBvcmlnaW5hbCB2YWx1ZXNcbiAgICAgICAgICAgICAgcHJvcHMuaXRlbS5zZXREYXRhKHByb3BzLmRhdGEpO1xuXG4gICAgICAgICAgICAgIG1lLmJvZHkuZW1pdHRlci5lbWl0KCdfY2hhbmdlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBncm91cCBjbGlja1xuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uR3JvdXBDbGljayhldmVudCkge1xuICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cEZyb21UYXJnZXQoZXZlbnQpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50b2dnbGVHcm91cFNob3dOZXN0ZWQoZ3JvdXApO1xuICAgIH0sIDEpO1xuICB9XG4gIFxuICAvKipcbiAgICogVG9nZ2xlIHNob3cgbmVzdGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBncm91cFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlXG4gICAqL1xuICB0b2dnbGVHcm91cFNob3dOZXN0ZWQoZ3JvdXAsIGZvcmNlID0gdW5kZWZpbmVkKSB7XG5cbiAgICBpZiAoIWdyb3VwIHx8ICFncm91cC5uZXN0ZWRHcm91cHMpIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3Vwc0RhdGEgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpO1xuXG4gICAgaWYgKGZvcmNlICE9IHVuZGVmaW5lZCkge1xuICAgICAgZ3JvdXAuc2hvd05lc3RlZCA9ICEhZm9yY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwLnNob3dOZXN0ZWQgPSAhZ3JvdXAuc2hvd05lc3RlZDtcbiAgICB9XG5cbiAgICBsZXQgbmVzdGluZ0dyb3VwID0gZ3JvdXBzRGF0YS5nZXQoZ3JvdXAuZ3JvdXBJZCk7XG4gICAgbmVzdGluZ0dyb3VwLnNob3dOZXN0ZWQgPSBncm91cC5zaG93TmVzdGVkO1xuXG4gICAgbGV0IGZ1bGxOZXN0ZWRHcm91cHMgPSBncm91cC5uZXN0ZWRHcm91cHM7XG4gICAgbGV0IG5leHRMZXZlbCA9IGZ1bGxOZXN0ZWRHcm91cHM7XG4gICAgd2hpbGUgKG5leHRMZXZlbC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgY3VycmVudCA9IG5leHRMZXZlbDtcbiAgICAgIG5leHRMZXZlbCA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjdXJyZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCBub2RlID0gZ3JvdXBzRGF0YS5nZXQoY3VycmVudFtpXSk7XG4gICAgICAgIGlmIChub2RlLm5lc3RlZEdyb3Vwcykge1xuICAgICAgICAgIG5leHRMZXZlbCA9IG5leHRMZXZlbC5jb25jYXQobm9kZS5uZXN0ZWRHcm91cHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobmV4dExldmVsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZnVsbE5lc3RlZEdyb3VwcyA9IGZ1bGxOZXN0ZWRHcm91cHMuY29uY2F0KG5leHRMZXZlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBuZXN0ZWRHcm91cHMgPSBncm91cHNEYXRhLmdldChmdWxsTmVzdGVkR3JvdXBzKS5tYXAoZnVuY3Rpb24gKG5lc3RlZEdyb3VwKSB7XG4gICAgICAgIGlmIChuZXN0ZWRHcm91cC52aXNpYmxlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG5lc3RlZEdyb3VwLnZpc2libGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIG5lc3RlZEdyb3VwLnZpc2libGUgPSAhIW5lc3RpbmdHcm91cC5zaG93TmVzdGVkO1xuICAgICAgICByZXR1cm4gbmVzdGVkR3JvdXA7XG4gICAgICB9KTtcblxuICAgIGdyb3Vwc0RhdGEudXBkYXRlKG5lc3RlZEdyb3Vwcy5jb25jYXQobmVzdGluZ0dyb3VwKSk7XG5cbiAgICBpZiAobmVzdGluZ0dyb3VwLnNob3dOZXN0ZWQpIHtcbiAgICAgIHV0aWwucmVtb3ZlQ2xhc3NOYW1lKGdyb3VwLmRvbS5sYWJlbCwgJ2NvbGxhcHNlZCcpO1xuICAgICAgdXRpbC5hZGRDbGFzc05hbWUoZ3JvdXAuZG9tLmxhYmVsLCAnZXhwYW5kZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5yZW1vdmVDbGFzc05hbWUoZ3JvdXAuZG9tLmxhYmVsLCAnZXhwYW5kZWQnKTtcbiAgICAgIHV0aWwuYWRkQ2xhc3NOYW1lKGdyb3VwLmRvbS5sYWJlbCwgJ2NvbGxhcHNlZCcpO1xuICAgIH1cbiAgfVxuICBcbiAgLyoqXG4gICAqIFRvZ2dsZSBncm91cCBkcmFnIGNsYXNzbmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JvdXBcbiAgICovXG4gIHRvZ2dsZUdyb3VwRHJhZ0NsYXNzTmFtZShncm91cCkge1xuICAgIGdyb3VwLmRvbS5sYWJlbC5jbGFzc0xpc3QudG9nZ2xlKCd2aXMtZ3JvdXAtaXMtZHJhZ2dpbmcnKTtcbiAgICBncm91cC5kb20uZm9yZWdyb3VuZC5jbGFzc0xpc3QudG9nZ2xlKCd2aXMtZ3JvdXAtaXMtZHJhZ2dpbmcnKTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIG9uIGRyYWcgc3RhcnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHJldHVybiB7dm9pZH0gICBcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkdyb3VwRHJhZ1N0YXJ0KGV2ZW50KSB7XG4gICAgaWYgKHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXIpIHtcbiAgICAgIHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCA9IHRoaXMuZ3JvdXBGcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgICAgICBcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2dnbGVHcm91cERyYWdDbGFzc05hbWUodGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyID0gdGhpcy5ncm91cHNEYXRhLmdldElkcyh7XG4gICAgICAgICAgb3JkZXI6IHRoaXMub3B0aW9ucy5ncm91cE9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbiBkcmFnXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Hcm91cERyYWcoZXZlbnQpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlciAmJiB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBcbiAgICAgIGNvbnN0IGdyb3Vwc0RhdGEgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpO1xuICAgICAgICAgIC8vIGRyYWcgZnJvbSBvbmUgZ3JvdXAgdG8gYW5vdGhlclxuICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5ncm91cEZyb21UYXJnZXQoZXZlbnQpO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIHRyeSB0byBhdm9pZCB0b2dnbGluZyB3aGVuIGdyb3VwcyBkaWZmZXIgaW4gaGVpZ2h0XG4gICAgICAgICAgaWYgKGdyb3VwICYmIGdyb3VwLmhlaWdodCAhPSB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1vdmluZ1VwID0gKGdyb3VwLnRvcCA8IHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC50b3ApO1xuICAgICAgICAgICAgICBjb25zdCBjbGllbnRZID0gZXZlbnQuY2VudGVyID8gZXZlbnQuY2VudGVyLnkgOiBldmVudC5jbGllbnRZO1xuICAgICAgICAgICAgICBjb25zdCB0YXJnZXRHcm91cCA9IGdyb3VwLmRvbS5mb3JlZ3JvdW5kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICBjb25zdCBkcmFnZ2VkR3JvdXBIZWlnaHQgPSB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuaGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAobW92aW5nVXApIHtcbiAgICAgICAgICAgICAgICAgIC8vIHNraXAgc3dhcHBpbmcgdGhlIGdyb3VwcyB3aGVuIHRoZSBkcmFnZ2VkIGdyb3VwIGlzIG5vdCBiZWxvdyBjbGllbnRZIGFmdGVyd2FyZHNcbiAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRHcm91cC50b3AgKyBkcmFnZ2VkR3JvdXBIZWlnaHQgPCBjbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0R3JvdXBIZWlnaHQgPSBncm91cC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAvLyBza2lwIHN3YXBwaW5nIHRoZSBncm91cHMgd2hlbiB0aGUgZHJhZ2dlZCBncm91cCBpcyBub3QgYmVsb3cgY2xpZW50WSBhZnRlcndhcmRzXG4gICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0R3JvdXAudG9wICsgdGFyZ2V0R3JvdXBIZWlnaHQgLSBkcmFnZ2VkR3JvdXBIZWlnaHQgPiBjbGllbnRZKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFxuICAgICAgICAgIGlmIChncm91cCAmJiBncm91cCAhPSB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApIHtcbiAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0R3JvdXAgPSBncm91cHNEYXRhLmdldChncm91cC5ncm91cElkKTtcbiAgICAgICAgICAgICAgY29uc3QgZHJhZ2dlZEdyb3VwID0gZ3JvdXBzRGF0YS5nZXQodGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQpO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgLy8gc3dpdGNoIGdyb3Vwc1xuICAgICAgICAgICAgICBpZiAoZHJhZ2dlZEdyb3VwICYmIHRhcmdldEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAoZHJhZ2dlZEdyb3VwLCB0YXJnZXRHcm91cCwgZ3JvdXBzRGF0YSk7XG4gICAgICAgICAgICAgICAgICBncm91cHNEYXRhLnVwZGF0ZShkcmFnZ2VkR3JvdXApO1xuICAgICAgICAgICAgICAgICAgZ3JvdXBzRGF0YS51cGRhdGUodGFyZ2V0R3JvdXApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAvLyBmZXRjaCBjdXJyZW50IG9yZGVyIG9mIGdyb3Vwc1xuICAgICAgICAgICAgICBjb25zdCBuZXdPcmRlciA9IGdyb3Vwc0RhdGEuZ2V0SWRzKHtcbiAgICAgICAgICAgICAgICBvcmRlcjogdGhpcy5vcHRpb25zLmdyb3VwT3JkZXJcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgY2hhbmdlcyBzaW5jZSBfb25Hcm91cERyYWdTdGFydFxuICAgICAgICAgICAgICBpZiAoIXV0aWwuZXF1YWxBcnJheShuZXdPcmRlciwgdGhpcy5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXIpKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBvcmlnT3JkZXIgPSB0aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRyYWdnZWRJZCA9IHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5ncm91cElkO1xuICAgICAgICAgICAgICAgICAgY29uc3QgbnVtR3JvdXBzID0gTWF0aC5taW4ob3JpZ09yZGVyLmxlbmd0aCwgbmV3T3JkZXIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgIGxldCBjdXJQb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgbGV0IG5ld09mZnNldCA9IDA7XG4gICAgICAgICAgICAgICAgICBsZXQgb3JnT2Zmc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJQb3MgPCBudW1Hcm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSBncm91cHMgYXJlIHdoZXJlIHRoZXkgc2hvdWxkIGJlIHN0ZXAgZG93biBhbG9uZyB0aGUgZ3JvdXBzIG9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjdXJQb3MrbmV3T2Zmc2V0KSA8IG51bUdyb3VwcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGN1clBvcytvcmdPZmZzZXQpIDwgbnVtR3JvdXBzIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBuZXdPcmRlcltjdXJQb3MrbmV3T2Zmc2V0XSA9PSBvcmlnT3JkZXJbY3VyUG9zK29yZ09mZnNldF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBva1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJQb3MrbmV3T2Zmc2V0ID49IG51bUdyb3Vwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFsbCBva1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGRyYWdnZWQgZ3JvdXAgd2FzIG1vdmUgdXB3YXJkcyBldmVyeXRoaW5nIGJlbG93IHNob3VsZCBoYXZlIGFuIG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdPcmRlcltjdXJQb3MrbmV3T2Zmc2V0XSA9PSBkcmFnZ2VkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gMTtcblxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkcmFnZ2VkIGdyb3VwIHdhcyBtb3ZlIGRvd253YXJkcyBldmVyeXRoaW5nIGFib3ZlIHNob3VsZCBoYXZlIGFuIG9mZnNldFxuICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG9yaWdPcmRlcltjdXJQb3Mrb3JnT2Zmc2V0XSA9PSBkcmFnZ2VkSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnT2Zmc2V0ID0gMTtcblxuICAgICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYSBncm91cCAoYXBhcnQgZnJvbSBkcmFnZ2VkIGdyb3VwKSB0aGF0IGhhcyB0aGUgd3JvbmcgcG9zaXRpb24gLT4gc3dpdGNoIHdpdGggdGhlIFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIGF0IHRoZSBwb3NpdGlvbiB3aGVyZSBvdGhlciBvbmUgc2hvdWxkIGJlLCBmaXggaW5kZXggYXJyYXlzIGFuZCBjb250aW51ZVxuICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbGlwcGVkUG9zaXRpb24gPSBuZXdPcmRlci5pbmRleE9mKG9yaWdPcmRlcltjdXJQb3Mrb3JnT2Zmc2V0XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN3aXRjaEdyb3VwID0gZ3JvdXBzRGF0YS5nZXQobmV3T3JkZXJbY3VyUG9zK25ld09mZnNldF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRCZUdyb3VwID0gZ3JvdXBzRGF0YS5nZXQob3JpZ09yZGVyW2N1clBvcytvcmdPZmZzZXRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmdyb3VwT3JkZXJTd2FwKHN3aXRjaEdyb3VwLCBzaG91bGRCZUdyb3VwLCBncm91cHNEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzRGF0YS51cGRhdGUoc3dpdGNoR3JvdXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNEYXRhLnVwZGF0ZShzaG91bGRCZUdyb3VwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN3aXRjaEdyb3VwSWQgPSBuZXdPcmRlcltjdXJQb3MrbmV3T2Zmc2V0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T3JkZXJbY3VyUG9zK25ld09mZnNldF0gPSBvcmlnT3JkZXJbY3VyUG9zK29yZ09mZnNldF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yZGVyW3NsaXBwZWRQb3NpdGlvbl0gPSBzd2l0Y2hHcm91cElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBvbiBkcmFnIGVuZFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uR3JvdXBEcmFnRW5kKGV2ZW50KSB7XG4gICAgdGhpcy5ncm91cFRvdWNoUGFyYW1zLmlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlciAmJiB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIFxuICAgICAgLy8gdXBkYXRlIGV4aXN0aW5nIGdyb3VwXG4gICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICBjb25zdCBpZCA9IG1lLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuZ3JvdXBJZDtcbiAgICAgIGNvbnN0IGRhdGFzZXQgPSBtZS5ncm91cHNEYXRhLmdldERhdGFTZXQoKTtcbiAgICAgIGNvbnN0IGdyb3VwRGF0YSA9IHV0aWwuZXh0ZW5kKHt9LCBkYXRhc2V0LmdldChpZCkpOyAvLyBjbG9uZSB0aGUgZGF0YVxuICAgICAgbWUub3B0aW9ucy5vbk1vdmVHcm91cChncm91cERhdGEsIGdyb3VwRGF0YSA9PiB7XG4gICAgICAgIGlmIChncm91cERhdGEpIHtcbiAgICAgICAgICAvLyBhcHBseSBjaGFuZ2VzXG4gICAgICAgICAgZ3JvdXBEYXRhW2RhdGFzZXQuX2lkUHJvcF0gPSBpZDsgLy8gZW5zdXJlIHRoZSBncm91cCBjb250YWlucyBpdHMgaWQgKGNhbiBiZSB1bmRlZmluZWQpXG4gICAgICAgICAgZGF0YXNldC51cGRhdGUoZ3JvdXBEYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcblxuICAgICAgICAgIC8vIGZldGNoIGN1cnJlbnQgb3JkZXIgb2YgZ3JvdXBzXG4gICAgICAgICAgY29uc3QgbmV3T3JkZXIgPSBkYXRhc2V0LmdldElkcyh7XG4gICAgICAgICAgICAgIG9yZGVyOiBtZS5vcHRpb25zLmdyb3VwT3JkZXJcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIHJlc3RvcmUgb3JpZ2luYWwgb3JkZXJcbiAgICAgICAgICBpZiAoIXV0aWwuZXF1YWxBcnJheShuZXdPcmRlciwgbWUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyKSkge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ09yZGVyID0gbWUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyO1xuICAgICAgICAgICAgY29uc3QgbnVtR3JvdXBzID0gTWF0aC5taW4ob3JpZ09yZGVyLmxlbmd0aCwgbmV3T3JkZXIubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBjdXJQb3MgPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGN1clBvcyA8IG51bUdyb3Vwcykge1xuICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSBncm91cHMgYXJlIHdoZXJlIHRoZXkgc2hvdWxkIGJlIHN0ZXAgZG93biBhbG9uZyB0aGUgZ3JvdXBzIG9yZGVyXG4gICAgICAgICAgICAgIHdoaWxlIChjdXJQb3MgPCBudW1Hcm91cHMgJiYgbmV3T3JkZXJbY3VyUG9zXSA9PSBvcmlnT3JkZXJbY3VyUG9zXSkge1xuICAgICAgICAgICAgICAgIGN1clBvcysrO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gYWxsIG9rXG4gICAgICAgICAgICAgIGlmIChjdXJQb3MgPj0gbnVtR3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBmb3VuZCBhIGdyb3VwIHRoYXQgaGFzIHRoZSB3cm9uZyBwb3NpdGlvbiAtPiBzd2l0Y2ggd2l0aCB0aGVcbiAgICAgICAgICAgICAgLy8gZ3JvdXAgYXQgdGhlIHBvc2l0aW9uIHdoZXJlIG90aGVyIG9uZSBzaG91bGQgYmUsIGZpeCBpbmRleCBhcnJheXMgYW5kIGNvbnRpbnVlXG4gICAgICAgICAgICAgIGNvbnN0IHNsaXBwZWRQb3NpdGlvbiA9IG5ld09yZGVyLmluZGV4T2Yob3JpZ09yZGVyW2N1clBvc10pO1xuICAgICAgICAgICAgICBjb25zdCBzd2l0Y2hHcm91cCA9IGRhdGFzZXQuZ2V0KG5ld09yZGVyW2N1clBvc10pO1xuICAgICAgICAgICAgICBjb25zdCBzaG91bGRCZUdyb3VwID0gZGF0YXNldC5nZXQob3JpZ09yZGVyW2N1clBvc10pO1xuICAgICAgICAgICAgICBtZS5vcHRpb25zLmdyb3VwT3JkZXJTd2FwKHN3aXRjaEdyb3VwLCBzaG91bGRCZUdyb3VwLCBkYXRhc2V0KTtcbiAgICAgICAgICAgICAgZGF0YXNldC51cGRhdGUoc3dpdGNoR3JvdXApO1xuICAgICAgICAgICAgICBkYXRhc2V0LnVwZGF0ZShzaG91bGRCZUdyb3VwKTtcblxuICAgICAgICAgICAgICBjb25zdCBzd2l0Y2hHcm91cElkID0gbmV3T3JkZXJbY3VyUG9zXTtcbiAgICAgICAgICAgICAgbmV3T3JkZXJbY3VyUG9zXSA9IG9yaWdPcmRlcltjdXJQb3NdO1xuICAgICAgICAgICAgICBuZXdPcmRlcltzbGlwcGVkUG9zaXRpb25dID0gc3dpdGNoR3JvdXBJZDtcblxuICAgICAgICAgICAgICBjdXJQb3MrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBtZS5ib2R5LmVtaXR0ZXIuZW1pdCgnZ3JvdXBEcmFnZ2VkJywgeyBncm91cElkOiBpZCB9KTtcbiAgICAgIHRoaXMudG9nZ2xlR3JvdXBEcmFnQ2xhc3NOYW1lKHRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCk7XG4gICAgICB0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW5nL2Rlc2VsZWN0aW5nIGFuIGl0ZW0gd2hlbiB0YXBwaW5nIGl0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25TZWxlY3RJdGVtKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY3RybEtleSAgPSBldmVudC5zcmNFdmVudCAmJiAoZXZlbnQuc3JjRXZlbnQuY3RybEtleSB8fCBldmVudC5zcmNFdmVudC5tZXRhS2V5KTtcbiAgICBjb25zdCBzaGlmdEtleSA9IGV2ZW50LnNyY0V2ZW50ICYmIGV2ZW50LnNyY0V2ZW50LnNoaWZ0S2V5O1xuICAgIGlmIChjdHJsS2V5IHx8IHNoaWZ0S2V5KSB7XG4gICAgICB0aGlzLl9vbk11bHRpU2VsZWN0SXRlbShldmVudCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkU2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcblxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Gcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSBpdGVtICYmIGl0ZW0uc2VsZWN0YWJsZSA/IFtpdGVtLmlkXSA6IFtdO1xuICAgIHRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7XG5cbiAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpO1xuXG4gICAgLy8gZW1pdCBhIHNlbGVjdCBldmVudCxcbiAgICAvLyBleGNlcHQgd2hlbiBvbGQgc2VsZWN0aW9uIGlzIGVtcHR5IGFuZCBuZXcgc2VsZWN0aW9uIGlzIHN0aWxsIGVtcHR5XG4gICAgaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAwIHx8IG9sZFNlbGVjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdzZWxlY3QnLCB7XG4gICAgICAgIGl0ZW1zOiBuZXdTZWxlY3Rpb24sXG4gICAgICAgIGV2ZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGhvdmVyaW5nIGFuIGl0ZW1cbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbk1vdXNlT3ZlcihldmVudCkge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1Gcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgIC8vIEl0ZW0gd2UganVzdCBsZWZ0XG4gICAgY29uc3QgcmVsYXRlZCA9IHRoaXMuaXRlbUZyb21SZWxhdGVkVGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAoaXRlbSA9PT0gcmVsYXRlZCkge1xuICAgICAgLy8gV2UgaGF2ZW4ndCBjaGFuZ2VkIGl0ZW0sIGp1c3QgZWxlbWVudCBpbiB0aGUgaXRlbVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRpdGxlID0gaXRlbS5nZXRUaXRsZSgpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd1Rvb2x0aXBzICYmIHRpdGxlKSB7XG4gICAgICBpZiAodGhpcy5wb3B1cCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucG9wdXAgPSBuZXcgUG9wdXAodGhpcy5ib2R5LmRvbS5yb290LFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRvb2x0aXAub3ZlcmZsb3dNZXRob2QgfHwgJ2ZsaXAnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb3B1cC5zZXRUZXh0KHRpdGxlKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucG9wdXAuc2V0UG9zaXRpb24oXG4gICAgICAgIGV2ZW50LmNsaWVudFggLSBjb250YWluZXJSZWN0LmxlZnQgKyBjb250YWluZXIub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIGNvbnRhaW5lclJlY3QudG9wICsgY29udGFpbmVyLm9mZnNldFRvcFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0UG9wdXBUaW1lcih0aGlzLnBvcHVwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSG92ZXJpbmcgb3ZlciBpdGVtIHdpdGhvdXQgYSB0aXRsZSwgaGlkZSBwb3B1cFxuICAgICAgLy8gTmVlZGVkIGluc3RlYWQgb2YgX2p1c3RfIGluIF9vbk1vdXNlT3V0IGR1ZSB0byAjMjU3MlxuICAgICAgdGhpcy5jbGVhclBvcHVwVGltZXIoKTtcbiAgICAgIGlmICh0aGlzLnBvcHVwICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5wb3B1cC5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnaXRlbW92ZXInLCB7XG4gICAgICBpdGVtOiBpdGVtLmlkLFxuICAgICAgZXZlbnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvbiBtb3VzZSBzdGFydFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcmV0dXJuIHt2b2lkfSAgIFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uTW91c2VPdXQoZXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtRnJvbVRhcmdldChldmVudCk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAvLyBJdGVtIHdlIGFyZSBnb2luZyB0b1xuICAgIGNvbnN0IHJlbGF0ZWQgPSB0aGlzLml0ZW1Gcm9tUmVsYXRlZFRhcmdldChldmVudCk7XG4gICAgaWYgKGl0ZW0gPT09IHJlbGF0ZWQpIHtcbiAgICAgIC8vIFdlIGFyZW4ndCBjaGFuZ2luZyBpdGVtLCBqdXN0IGVsZW1lbnQgaW4gdGhlIGl0ZW1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyUG9wdXBUaW1lcigpO1xuICAgIGlmICh0aGlzLnBvcHVwICE9IG51bGwpIHtcbiAgICAgIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoJ2l0ZW1vdXQnLCB7XG4gICAgICBpdGVtOiBpdGVtLmlkLFxuICAgICAgZXZlbnRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvbiBtb3VzZSBtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge3ZvaWR9ICAgXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtRnJvbVRhcmdldChldmVudCk7XG4gICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICBpZiAodGhpcy5wb3B1cFRpbWVyICE9IG51bGwpIHtcbiAgICAgIC8vIHJlc3RhcnQgdGltZXJcbiAgICAgIHRoaXMuc2V0UG9wdXBUaW1lcih0aGlzLnBvcHVwKTtcbiAgICB9XG4gICAgXG4gICAgaWYgKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcHMgJiYgdGhpcy5vcHRpb25zLnRvb2x0aXAuZm9sbG93TW91c2UgJiYgdGhpcy5wb3B1cCAmJiAhdGhpcy5wb3B1cC5oaWRkZW4pIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyO1xuICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucG9wdXAuc2V0UG9zaXRpb24oXG4gICAgICAgIGV2ZW50LmNsaWVudFggLSBjb250YWluZXJSZWN0LmxlZnQgKyBjb250YWluZXIub2Zmc2V0TGVmdCxcbiAgICAgICAgZXZlbnQuY2xpZW50WSAtIGNvbnRhaW5lclJlY3QudG9wICsgY29udGFpbmVyLm9mZnNldFRvcFxuICAgICAgKTtcbiAgICAgIHRoaXMucG9wdXAuc2hvdygpOyAvLyBSZWRyYXdcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNld2hlZWxcbiAgICogQHBhcmFtIHtFdmVudH0gIGV2ZW50ICAgVGhlIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Nb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcpIHtcbiAgICAgIHRoaXMuX29uRHJhZ0VuZChldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSB1cGRhdGVzIG9mIGFuIGl0ZW0gb24gZG91YmxlIHRhcFxuICAgKiBAcGFyYW0ge3RpbWVsaW5lLkl0ZW19ICBpdGVtICAgVGhlIGl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vblVwZGF0ZUl0ZW0oaXRlbSkge1xuICAgIGlmICghdGhpcy5vcHRpb25zLnNlbGVjdGFibGUpIHJldHVybjtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lICYmICF0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXApIHJldHVybjtcblxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgIFxuICAgIGlmIChpdGVtKSB7XG4gICAgICAvLyBleGVjdXRlIGFzeW5jIGhhbmRsZXIgdG8gdXBkYXRlIHRoZSBpdGVtIChvciBjYW5jZWwgaXQpXG4gICAgICBjb25zdCBpdGVtRGF0YSA9IG1lLml0ZW1zRGF0YS5nZXQoaXRlbS5pZCk7IC8vIGdldCBhIGNsb25lIG9mIHRoZSBkYXRhIGZyb20gdGhlIGRhdGFzZXRcbiAgICAgIHRoaXMub3B0aW9ucy5vblVwZGF0ZShpdGVtRGF0YSwgaXRlbURhdGEgPT4ge1xuICAgICAgICBpZiAoaXRlbURhdGEpIHtcbiAgICAgICAgICBtZS5pdGVtc0RhdGEudXBkYXRlKGl0ZW1EYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBkcm9wIGV2ZW50IG9mIGRhdGEgb24gaXRlbVxuICAgKiBPbmx5IGNhbGxlZCB3aGVuIGBvYmplY3REYXRhLnRhcmdldCA9PT0gJ2l0ZW0nLlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgZXZlbnQgXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Ecm9wT2JqZWN0T25JdGVtKGV2ZW50KSB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbUZyb21UYXJnZXQoZXZlbnQpO1xuICAgIGNvbnN0IG9iamVjdERhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7XG4gICAgdGhpcy5vcHRpb25zLm9uRHJvcE9iamVjdE9uSXRlbShvYmplY3REYXRhLCBpdGVtKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY3JlYXRpb24gb2YgYW4gaXRlbSBvbiBkb3VibGUgdGFwIG9yIGRyb3Agb2YgYSBkcmFnIGV2ZW50XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50ICAgVGhlIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25BZGRJdGVtKGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSkgcmV0dXJuO1xuICAgIGlmICghdGhpcy5vcHRpb25zLmVkaXRhYmxlLmFkZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgbWUgPSB0aGlzO1xuICAgIGNvbnN0IHNuYXAgPSB0aGlzLm9wdGlvbnMuc25hcCB8fCBudWxsO1xuXG4gICAgLy8gYWRkIGl0ZW1cbiAgICBjb25zdCBmcmFtZVJlY3QgPSB0aGlzLmRvbS5mcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gdGhpcy5vcHRpb25zLnJ0bCA/IGZyYW1lUmVjdC5yaWdodCAtIGV2ZW50LmNlbnRlci54IDogZXZlbnQuY2VudGVyLnggLSBmcmFtZVJlY3QubGVmdDtcbiAgICBjb25zdCBzdGFydCA9IHRoaXMuYm9keS51dGlsLnRvVGltZSh4KTtcbiAgICBjb25zdCBzY2FsZSA9IHRoaXMuYm9keS51dGlsLmdldFNjYWxlKCk7XG4gICAgY29uc3Qgc3RlcCA9IHRoaXMuYm9keS51dGlsLmdldFN0ZXAoKTtcbiAgICBsZXQgZW5kO1xuXG4gICAgbGV0IG5ld0l0ZW1EYXRhO1xuICAgIGlmIChldmVudC50eXBlID09ICdkcm9wJykge1xuICAgICAgbmV3SXRlbURhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7XG4gICAgICBuZXdJdGVtRGF0YS5jb250ZW50ID0gbmV3SXRlbURhdGEuY29udGVudCA/IG5ld0l0ZW1EYXRhLmNvbnRlbnQgOiAnbmV3IGl0ZW0nO1xuICAgICAgbmV3SXRlbURhdGEuc3RhcnQgPSBuZXdJdGVtRGF0YS5zdGFydCA/IG5ld0l0ZW1EYXRhLnN0YXJ0IDogKHNuYXAgPyBzbmFwKHN0YXJ0LCBzY2FsZSwgc3RlcCkgOiBzdGFydCk7XG4gICAgICBuZXdJdGVtRGF0YS50eXBlID0gbmV3SXRlbURhdGEudHlwZSB8fCAnYm94JztcbiAgICAgIG5ld0l0ZW1EYXRhW3RoaXMuaXRlbXNEYXRhLmlkUHJvcF0gPSBuZXdJdGVtRGF0YS5pZCB8fCB2NCgpO1xuXG4gICAgICBpZiAobmV3SXRlbURhdGEudHlwZSA9PSAncmFuZ2UnICYmICFuZXdJdGVtRGF0YS5lbmQpIHtcbiAgICAgICAgZW5kID0gdGhpcy5ib2R5LnV0aWwudG9UaW1lKHggKyB0aGlzLnByb3BzLndpZHRoIC8gNSk7XG4gICAgICAgIG5ld0l0ZW1EYXRhLmVuZCA9IHNuYXAgPyBzbmFwKGVuZCwgc2NhbGUsIHN0ZXApIDogZW5kO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdJdGVtRGF0YSA9IHtcbiAgICAgICAgc3RhcnQ6IHNuYXAgPyBzbmFwKHN0YXJ0LCBzY2FsZSwgc3RlcCkgOiBzdGFydCxcbiAgICAgICAgY29udGVudDogJ25ldyBpdGVtJ1xuICAgICAgfTtcbiAgICAgIG5ld0l0ZW1EYXRhW3RoaXMuaXRlbXNEYXRhLmlkUHJvcF0gPSB2NCgpO1xuXG4gICAgICAvLyB3aGVuIGRlZmF1bHQgdHlwZSBpcyBhIHJhbmdlLCBhZGQgYSBkZWZhdWx0IGVuZCBkYXRlIHRvIHRoZSBuZXcgaXRlbVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50eXBlID09PSAncmFuZ2UnKSB7XG4gICAgICAgIGVuZCA9IHRoaXMuYm9keS51dGlsLnRvVGltZSh4ICsgdGhpcy5wcm9wcy53aWR0aCAvIDUpO1xuICAgICAgICBuZXdJdGVtRGF0YS5lbmQgPSBzbmFwID8gc25hcChlbmQsIHNjYWxlLCBzdGVwKSA6IGVuZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBGcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAoZ3JvdXApIHtcbiAgICAgIG5ld0l0ZW1EYXRhLmdyb3VwID0gZ3JvdXAuZ3JvdXBJZDtcbiAgICB9XG5cbiAgICAvLyBleGVjdXRlIGFzeW5jIGhhbmRsZXIgdG8gY3VzdG9taXplIChvciBjYW5jZWwpIGFkZGluZyBhbiBpdGVtXG4gICAgbmV3SXRlbURhdGEgPSB0aGlzLl9jbG9uZUl0ZW1EYXRhKG5ld0l0ZW1EYXRhKTsgICAgIC8vIGNvbnZlcnQgc3RhcnQgYW5kIGVuZCB0byB0aGUgY29ycmVjdCB0eXBlXG4gICAgdGhpcy5vcHRpb25zLm9uQWRkKG5ld0l0ZW1EYXRhLCBpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgIG1lLml0ZW1zRGF0YS5hZGQoaXRlbSk7XG4gICAgICAgIGlmIChldmVudC50eXBlID09ICdkcm9wJykge1xuICAgICAgICAgIG1lLnNldFNlbGVjdGlvbihbaXRlbS5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IG5lZWQgdG8gdHJpZ2dlciBhIHJlZHJhdz9cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW5nL2Rlc2VsZWN0aW5nIG11bHRpcGxlIGl0ZW1zIHdoZW4gaG9sZGluZyBhbiBpdGVtXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25NdWx0aVNlbGVjdEl0ZW0oZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKSByZXR1cm47XG5cbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtRnJvbVRhcmdldChldmVudCk7XG5cbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gbXVsdGkgc2VsZWN0IGl0ZW1zIChpZiBhbGxvd2VkKVxuXG4gICAgICBsZXQgc2VsZWN0aW9uID0gdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0XG4gICAgICAgID8gdGhpcy5nZXRTZWxlY3Rpb24oKSAvLyB0YWtlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgIDogW107ICAgICAgICAgICAgICAgICAvLyBkZXNlbGVjdCBjdXJyZW50IHNlbGVjdGlvblxuXG4gICAgICBjb25zdCBzaGlmdEtleSA9IGV2ZW50LnNyY0V2ZW50ICYmIGV2ZW50LnNyY0V2ZW50LnNoaWZ0S2V5IHx8IGZhbHNlO1xuXG4gICAgICBpZiAoKHNoaWZ0S2V5IHx8IHRoaXMub3B0aW9ucy5zZXF1ZW50aWFsU2VsZWN0aW9uKSAmJiB0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgLy8gc2VsZWN0IGFsbCBpdGVtcyBiZXR3ZWVuIHRoZSBvbGQgc2VsZWN0aW9uIGFuZCB0aGUgdGFwcGVkIGl0ZW1cbiAgICAgICAgY29uc3QgaXRlbUdyb3VwID0gdGhpcy5pdGVtc0RhdGEuZ2V0KGl0ZW0uaWQpLmdyb3VwO1xuXG4gICAgICAgIC8vIHdoZW4gZmlsdGVyaW5nIGdldCB0aGUgZ3JvdXAgb2YgdGhlIGxhc3Qgc2VsZWN0ZWQgaXRlbVxuICAgICAgICBsZXQgbGFzdFNlbGVjdGVkR3JvdXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCkge1xuICAgICAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGFzdFNlbGVjdGVkR3JvdXAgPSB0aGlzLml0ZW1zRGF0YS5nZXQoc2VsZWN0aW9uWzBdKS5ncm91cDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIHNlbGVjdGlvbiByYW5nZVxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXNlbGVjdFBlckdyb3VwIHx8IGxhc3RTZWxlY3RlZEdyb3VwID09IHVuZGVmaW5lZCB8fCBsYXN0U2VsZWN0ZWRHcm91cCA9PSBpdGVtR3JvdXApIHtcbiAgICAgICAgICBzZWxlY3Rpb24ucHVzaChpdGVtLmlkKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByYW5nZSA9IEl0ZW1TZXQuX2dldEl0ZW1SYW5nZSh0aGlzLml0ZW1zRGF0YS5nZXQoc2VsZWN0aW9uKSk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5tdWx0aXNlbGVjdFBlckdyb3VwIHx8IGxhc3RTZWxlY3RlZEdyb3VwID09IGl0ZW1Hcm91cCkge1xuICAgICAgICAgIC8vIHNlbGVjdCBhbGwgaXRlbXMgd2l0aGluIHRoZSBzZWxlY3Rpb24gcmFuZ2VcbiAgICAgICAgICBzZWxlY3Rpb24gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGlkIGluIHRoaXMuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgICAgICAgICAgICBjb25zdCBfaXRlbSA9IHRoaXMuaXRlbXNbaWRdO1xuICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IF9pdGVtLmRhdGEuc3RhcnQ7XG4gICAgICAgICAgICAgIGNvbnN0IGVuZCA9IChfaXRlbS5kYXRhLmVuZCAhPT0gdW5kZWZpbmVkKSA/IF9pdGVtLmRhdGEuZW5kIDogc3RhcnQ7XG5cbiAgICAgICAgICAgICAgaWYgKHN0YXJ0ID49IHJhbmdlLm1pbiAmJlxuICAgICAgICAgICAgICAgICAgZW5kIDw9IHJhbmdlLm1heCAmJlxuICAgICAgICAgICAgICAgICAgKCF0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCB8fCBsYXN0U2VsZWN0ZWRHcm91cCA9PSB0aGlzLml0ZW1zRGF0YS5nZXQoX2l0ZW0uaWQpLmdyb3VwKSAmJlxuICAgICAgICAgICAgICAgICAgIShfaXRlbSBpbnN0YW5jZW9mIEJhY2tncm91bmRJdGVtKSkge1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKF9pdGVtLmlkKTsgLy8gZG8gbm90IHVzZSBpZCBidXQgaXRlbS5pZCwgaWQgaXRzZWxmIGlzIHN0cmluZ2lmaWVkXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBhZGQvcmVtb3ZlIHRoaXMgaXRlbSBmcm9tIHRoZSBjdXJyZW50IHNlbGVjdGlvblxuICAgICAgICBjb25zdCBpbmRleCA9IHNlbGVjdGlvbi5pbmRleE9mKGl0ZW0uaWQpO1xuICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHtcbiAgICAgICAgICAvLyBpdGVtIGlzIG5vdCB5ZXQgc2VsZWN0ZWQgLT4gc2VsZWN0IGl0XG4gICAgICAgICAgc2VsZWN0aW9uLnB1c2goaXRlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gaXRlbSBpcyBhbHJlYWR5IHNlbGVjdGVkIC0+IGRlc2VsZWN0IGl0XG4gICAgICAgICAgc2VsZWN0aW9uLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlsdGVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb24uZmlsdGVyKGl0ZW0gPT4gdGhpcy5nZXRJdGVtQnlJZChpdGVtKS5zZWxlY3RhYmxlKTtcblxuICAgICAgdGhpcy5zZXRTZWxlY3Rpb24oZmlsdGVyZWRTZWxlY3Rpb24pO1xuXG4gICAgICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KCdzZWxlY3QnLCB7XG4gICAgICAgIGl0ZW1zOiB0aGlzLmdldFNlbGVjdGlvbigpLFxuICAgICAgICBldmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgdGltZSByYW5nZSBvZiBhIGxpc3Qgb2YgaXRlbXNcbiAgICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gaXRlbXNEYXRhXG4gICAqIEByZXR1cm4ge3ttaW46IERhdGUsIG1heDogRGF0ZX19IFJldHVybnMgdGhlIHJhbmdlIG9mIHRoZSBwcm92aWRlZCBpdGVtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc3RhdGljIF9nZXRJdGVtUmFuZ2UoaXRlbXNEYXRhKSB7XG4gICAgbGV0IG1heCA9IG51bGw7XG4gICAgbGV0IG1pbiA9IG51bGw7XG5cbiAgICBpdGVtc0RhdGEuZm9yRWFjaChkYXRhID0+IHtcbiAgICAgIGlmIChtaW4gPT0gbnVsbCB8fCBkYXRhLnN0YXJ0IDwgbWluKSB7XG4gICAgICAgIG1pbiA9IGRhdGEuc3RhcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmVuZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKG1heCA9PSBudWxsIHx8IGRhdGEuZW5kID4gbWF4KSB7XG4gICAgICAgICAgbWF4ID0gZGF0YS5lbmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAobWF4ID09IG51bGwgfHwgZGF0YS5zdGFydCA+IG1heCkge1xuICAgICAgICAgIG1heCA9IGRhdGEuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBtaW4sXG4gICAgICBtYXhcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbiBpdGVtIGZyb20gYW4gZWxlbWVudDpcbiAgICogc2VhcmNoZXMgZm9yIHRoZSBhdHRyaWJ1dGUgJ3Zpcy1pdGVtJyBpbiB0aGUgZWxlbWVudCdzIHRyZWVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtJdGVtIHwgbnVsbH0gaXRlbVxuICAgKi9cbiAgaXRlbUZyb21FbGVtZW50KGVsZW1lbnQpIHtcbiAgICBsZXQgY3VyID0gZWxlbWVudDtcbiAgICB3aGlsZSAoY3VyKSB7XG4gICAgICBpZiAoY3VyLmhhc093blByb3BlcnR5KCd2aXMtaXRlbScpKSB7XG4gICAgICAgIHJldHVybiBjdXJbJ3Zpcy1pdGVtJ107XG4gICAgICB9XG4gICAgICBjdXIgPSBjdXIucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGl0ZW0gZnJvbSBhbiBldmVudCB0YXJnZXQ6XG4gICAqIHNlYXJjaGVzIGZvciB0aGUgYXR0cmlidXRlICd2aXMtaXRlbScgaW4gdGhlIGV2ZW50IHRhcmdldCdzIGVsZW1lbnQgdHJlZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcmV0dXJuIHtJdGVtIHwgbnVsbH0gaXRlbVxuICAgKi9cbiAgaXRlbUZyb21UYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtRnJvbUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFuIGl0ZW0gZnJvbSBhbiBldmVudCdzIHJlbGF0ZWQgdGFyZ2V0OlxuICAgKiBzZWFyY2hlcyBmb3IgdGhlIGF0dHJpYnV0ZSAndmlzLWl0ZW0nIGluIHRoZSByZWxhdGVkIHRhcmdldCdzIGVsZW1lbnQgdHJlZVxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcmV0dXJuIHtJdGVtIHwgbnVsbH0gaXRlbVxuICAgKi9cbiAgaXRlbUZyb21SZWxhdGVkVGFyZ2V0KGV2ZW50KSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbUZyb21FbGVtZW50KGV2ZW50LnJlbGF0ZWRUYXJnZXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIEdyb3VwIGZyb20gYW4gZXZlbnQgdGFyZ2V0OlxuICAgKiBzZWFyY2hlcyBmb3IgdGhlIGF0dHJpYnV0ZSAndmlzLWdyb3VwJyBpbiB0aGUgZXZlbnQgdGFyZ2V0J3MgZWxlbWVudCB0cmVlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge0dyb3VwIHwgbnVsbH0gZ3JvdXBcbiAgICovXG4gIGdyb3VwRnJvbVRhcmdldChldmVudCkge1xuICAgIGNvbnN0IGNsaWVudFkgPSBldmVudC5jZW50ZXIgPyBldmVudC5jZW50ZXIueSA6IGV2ZW50LmNsaWVudFk7XG4gICAgbGV0IGdyb3VwSWRzID0gdGhpcy5ncm91cElkcztcbiAgICBcbiAgICBpZiAoZ3JvdXBJZHMubGVuZ3RoIDw9IDAgJiYgdGhpcy5ncm91cHNEYXRhKSB7XG4gICAgICBncm91cElkcyA9IHRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoe1xuICAgICAgICBvcmRlcjogdGhpcy5vcHRpb25zLmdyb3VwT3JkZXJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBncm91cElkID0gZ3JvdXBJZHNbaV07XG4gICAgICBjb25zdCBncm91cCA9IHRoaXMuZ3JvdXBzW2dyb3VwSWRdO1xuICAgICAgY29uc3QgZm9yZWdyb3VuZCA9IGdyb3VwLmRvbS5mb3JlZ3JvdW5kO1xuICAgICAgY29uc3QgZm9yZWdyb3VuZFJlY3QgPSBmb3JlZ3JvdW5kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKGNsaWVudFkgPj0gZm9yZWdyb3VuZFJlY3QudG9wICYmIGNsaWVudFkgPCBmb3JlZ3JvdW5kUmVjdC50b3AgKyBmb3JlZ3JvdW5kLm9mZnNldEhlaWdodCkge1xuICAgICAgICByZXR1cm4gZ3JvdXA7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSA9PT0gJ3RvcCcpIHtcbiAgICAgICAgaWYgKGkgPT09IHRoaXMuZ3JvdXBJZHMubGVuZ3RoIC0gMSAmJiBjbGllbnRZID4gZm9yZWdyb3VuZFJlY3QudG9wKSB7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPT09IDAgJiYgY2xpZW50WSA8IGZvcmVncm91bmRSZWN0LnRvcCArIGZvcmVncm91bmQub2Zmc2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgSXRlbVNldCBmcm9tIGFuIGV2ZW50IHRhcmdldDpcbiAgICogc2VhcmNoZXMgZm9yIHRoZSBhdHRyaWJ1dGUgJ3Zpcy1pdGVtc2V0JyBpbiB0aGUgZXZlbnQgdGFyZ2V0J3MgZWxlbWVudCB0cmVlXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEByZXR1cm4ge0l0ZW1TZXQgfCBudWxsfSBpdGVtXG4gICAqL1xuICBzdGF0aWMgaXRlbVNldEZyb21UYXJnZXQoZXZlbnQpIHtcbiAgICBsZXQgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgIHdoaWxlICh0YXJnZXQpIHtcbiAgICAgIGlmICh0YXJnZXQuaGFzT3duUHJvcGVydHkoJ3Zpcy1pdGVtc2V0JykpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldFsndmlzLWl0ZW1zZXQnXTtcbiAgICAgIH1cbiAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb25lIHRoZSBkYXRhIG9mIGFuIGl0ZW0sIGFuZCBcIm5vcm1hbGl6ZVwiIGl0OiBjb252ZXJ0IHRoZSBzdGFydCBhbmQgZW5kIGRhdGVcbiAgICogdG8gdGhlIHR5cGUgKERhdGUsIE1vbWVudCwgLi4uKSBjb25maWd1cmVkIGluIHRoZSBEYXRhU2V0LiBJZiBub3QgY29uZmlndXJlZCxcbiAgICogc3RhcnQgYW5kIGVuZCBhcmUgY29udmVydGVkIHRvIERhdGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtRGF0YSwgdHlwaWNhbGx5IGBpdGVtLmRhdGFgXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZV0gIE9wdGlvbmFsIERhdGUgdHlwZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgdHlwZSBmcm9tIHRoZSBEYXRhU2V0IGlzIHRha2VuXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGNsb25lZCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jbG9uZUl0ZW1EYXRhKGl0ZW1EYXRhLCB0eXBlKSB7XG4gICAgY29uc3QgY2xvbmUgPSB1dGlsLmV4dGVuZCh7fSwgaXRlbURhdGEpO1xuXG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICAvLyBjb252ZXJ0IHN0YXJ0IGFuZCBlbmQgZGF0ZSB0byB0aGUgdHlwZSAoRGF0ZSwgTW9tZW50LCAuLi4pIGNvbmZpZ3VyZWQgaW4gdGhlIERhdGFTZXRcbiAgICAgIHR5cGUgPSB0aGlzLml0ZW1zRGF0YS50eXBlO1xuICAgIH1cblxuICAgIGlmIChjbG9uZS5zdGFydCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNsb25lLnN0YXJ0ID0gdXRpbC5jb252ZXJ0KGNsb25lLnN0YXJ0LCB0eXBlICYmIHR5cGUuc3RhcnQgfHwgJ0RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGNsb25lLmVuZCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGNsb25lLmVuZCA9IHV0aWwuY29udmVydChjbG9uZS5lbmQgLCB0eXBlICYmIHR5cGUuZW5kIHx8ICdEYXRlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIGNsdXN0ZXIgaXRlbXNcbiAgICogQHJldHVybiB7dm9pZH0gICBcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jbHVzdGVySXRlbXMoKSB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuY2x1c3Rlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2NhbGUgfSA9IHRoaXMuYm9keS5yYW5nZS5jb252ZXJzaW9uKHRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIud2lkdGgpO1xuICAgIGNvbnN0IGNsdXN0ZXJzID0gdGhpcy5jbHVzdGVyR2VuZXJhdG9yLmdldENsdXN0ZXJzKHRoaXMuY2x1c3RlcnMsIHNjYWxlLCB0aGlzLm9wdGlvbnMuY2x1c3Rlcik7XG5cbiAgICBpZiAodGhpcy5jbHVzdGVycyAhPSBjbHVzdGVycykge1xuICAgICAgdGhpcy5fZGV0YWNoQWxsQ2x1c3RlcnMoKTtcblxuICAgICAgaWYgKGNsdXN0ZXJzKSB7XG4gICAgICAgIGZvciAobGV0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgICBjbHVzdGVyLmF0dGFjaCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2x1c3RlcnMgPSBjbHVzdGVycztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdXBkYXRlQ2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZXRhY2ggYWxsIGNsdXN0ZXIgaXRlbXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kZXRhY2hBbGxDbHVzdGVycygpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmNsdXN0ZXIpIHtcbiAgICAgIGlmICh0aGlzLmNsdXN0ZXJzICYmIHRoaXMuY2x1c3RlcnMubGVuZ3RoKSB7XG4gICAgICAgIGZvciAobGV0IGNsdXN0ZXIgb2YgdGhpcy5jbHVzdGVycykge1xuICAgICAgICAgIGNsdXN0ZXIuZGV0YWNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogdXBkYXRlIGNsdXN0ZXJzXG4gICAqIEBwYXJhbSB7YXJyYXl9IGNsdXN0ZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlQ2x1c3RlcnMoY2x1c3RlcnMpIHtcbiAgICBpZiAodGhpcy5jbHVzdGVycyAmJiB0aGlzLmNsdXN0ZXJzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbmV3Q2x1c3RlcnNJZHMgPSBuZXcgU2V0KGNsdXN0ZXJzLm1hcChjbHVzdGVyID0+IGNsdXN0ZXIuaWQpKTtcbiAgICAgIGNvbnN0IGNsdXN0ZXJzVG9VbnNlbGVjdCA9IHRoaXMuY2x1c3RlcnMuZmlsdGVyKGNsdXN0ZXIgPT4gIW5ld0NsdXN0ZXJzSWRzLmhhcyhjbHVzdGVyLmlkKSk7XG4gICAgICBsZXQgc2VsZWN0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgZm9yIChsZXQgY2x1c3RlciBvZiBjbHVzdGVyc1RvVW5zZWxlY3QpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHggPSB0aGlzLnNlbGVjdGlvbi5pbmRleE9mKGNsdXN0ZXIuaWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRJZHggIT09IC0xKSB7XG4gICAgICAgICAgY2x1c3Rlci51bnNlbGVjdCgpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNwbGljZShzZWxlY3RlZElkeCwgMSk7XG4gICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdGlvbkNoYW5nZWQpIHtcbiAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uID0gdGhpcy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdCgnc2VsZWN0Jywge1xuICAgICAgICAgIGl0ZW1zOiBuZXdTZWxlY3Rpb24sXG4gICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuY2x1c3RlcnMgPSBjbHVzdGVycyB8fCBbXTtcbiAgfVxufVxuXG4vLyBhdmFpbGFibGUgaXRlbSB0eXBlcyB3aWxsIGJlIHJlZ2lzdGVyZWQgaGVyZVxuSXRlbVNldC50eXBlcyA9IHtcbiAgYmFja2dyb3VuZDogQmFja2dyb3VuZEl0ZW0sXG4gIGJveDogQm94SXRlbSxcbiAgcmFuZ2U6IFJhbmdlSXRlbSxcbiAgcG9pbnQ6IFBvaW50SXRlbVxufTtcblxuLyoqXG4gKiBIYW5kbGUgYWRkZWQgaXRlbXNcbiAqIEBwYXJhbSB7bnVtYmVyW119IGlkc1xuICogQHByb3RlY3RlZFxuICovXG5JdGVtU2V0LnByb3RvdHlwZS5fb25BZGQgPSBJdGVtU2V0LnByb3RvdHlwZS5fb25VcGRhdGU7XG5cbmxldCBlcnJvckZvdW5kID0gZmFsc2U7XG5sZXQgYWxsT3B0aW9ucztcbmxldCBwcmludFN0eWxlID0gJ2JhY2tncm91bmQ6ICNGRmVlZWU7IGNvbG9yOiAjZGQwMDAwJztcbi8qKlxuICogIFVzZWQgdG8gdmFsaWRhdGUgb3B0aW9ucy5cbiAqL1xuY2xhc3MgVmFsaWRhdG9yIHtcbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICB9XG5cbiAgLyoqXG4gICAqIE1haW4gZnVuY3Rpb24gdG8gYmUgY2FsbGVkXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZWZlcmVuY2VPcHRpb25zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzdWJPYmplY3RcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyB2YWxpZGF0ZShvcHRpb25zLCByZWZlcmVuY2VPcHRpb25zLCBzdWJPYmplY3QpIHtcbiAgICBlcnJvckZvdW5kID0gZmFsc2U7XG4gICAgYWxsT3B0aW9ucyA9IHJlZmVyZW5jZU9wdGlvbnM7XG4gICAgbGV0IHVzZWRPcHRpb25zID0gcmVmZXJlbmNlT3B0aW9ucztcbiAgICBpZiAoc3ViT2JqZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVzZWRPcHRpb25zID0gcmVmZXJlbmNlT3B0aW9uc1tzdWJPYmplY3RdO1xuICAgIH1cbiAgICBWYWxpZGF0b3IucGFyc2Uob3B0aW9ucywgdXNlZE9wdGlvbnMsIFtdKTtcbiAgICByZXR1cm4gZXJyb3JGb3VuZDtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFdpbGwgdHJhdmVyc2UgYW4gb2JqZWN0IHJlY3Vyc2l2ZWx5IGFuZCBjaGVjayBldmVyeSB2YWx1ZVxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdH0gcmVmZXJlbmNlT3B0aW9uc1xuICAgKiBAcGFyYW0ge2FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHBhcnNlKG9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbnMsIHBhdGgpIHtcbiAgICBmb3IgKGxldCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkge1xuICAgICAgICBWYWxpZGF0b3IuY2hlY2sob3B0aW9uLCBvcHRpb25zLCByZWZlcmVuY2VPcHRpb25zLCBwYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDaGVjayBldmVyeSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgY2FsbCB0aGUgcGFyc2UgZnVuY3Rpb24gb24gdGhhdCBvYmplY3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtPYmplY3R9IHJlZmVyZW5jZU9wdGlvbnNcbiAgICogQHBhcmFtIHthcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBjaGVjayhvcHRpb24sIG9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbnMsIHBhdGgpIHtcbiAgICBpZiAocmVmZXJlbmNlT3B0aW9uc1tvcHRpb25dID09PSB1bmRlZmluZWQgJiYgcmVmZXJlbmNlT3B0aW9ucy5fX2FueV9fID09PSB1bmRlZmluZWQpIHtcbiAgICAgIFZhbGlkYXRvci5nZXRTdWdnZXN0aW9uKG9wdGlvbiwgcmVmZXJlbmNlT3B0aW9ucywgcGF0aCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJlZmVyZW5jZU9wdGlvbiA9IG9wdGlvbjtcbiAgICBsZXQgaXNfb2JqZWN0ID0gdHJ1ZTtcblxuICAgIGlmIChyZWZlcmVuY2VPcHRpb25zW29wdGlvbl0gPT09IHVuZGVmaW5lZCAmJiByZWZlcmVuY2VPcHRpb25zLl9fYW55X18gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gTk9URTogVGhpcyBvbmx5IHRyaWdnZXJzIGlmIHRoZSBfX2FueV9fIGlzIGluIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG9wdGlvbnMgb2JqZWN0LlxuICAgICAgLy8gICAgICAgVEhBVCdTIEEgUkVBTExZIEJBRCBQTEFDRSBUTyBBTExPVyBJVCEhISFcbiAgICAgIC8vIFRPRE86IEV4YW1pbmUgaWYgbmVlZGVkLCByZW1vdmUgaWYgcG9zc2libGVcblxuICAgICAgLy8gX19hbnlfXyBpcyBhIHdpbGRjYXJkLiBBbnkgdmFsdWUgaXMgYWNjZXB0ZWQgYW5kIHdpbGwgYmUgZnVydGhlciBhbmFseXNlZCBieSByZWZlcmVuY2UuXG4gICAgICByZWZlcmVuY2VPcHRpb24gPSAnX19hbnlfXyc7XG5cbiAgICAgIC8vIGlmIHRoZSBhbnktc3ViZ3JvdXAgaXMgbm90IGEgcHJlZGVmaW5lZCBvYmplY3QgaW4gdGhlIGNvbmZpZ3VyYXRvcixcbiAgICAgIC8vIHdlIGRvIG5vdCBsb29rIGRlZXBlciBpbnRvIHRoZSBvYmplY3QuXG4gICAgICBpc19vYmplY3QgPSAoVmFsaWRhdG9yLmdldFR5cGUob3B0aW9uc1tvcHRpb25dKSA9PT0gJ29iamVjdCcpO1xuICAgIH1cblxuICAgIGxldCByZWZPcHRpb25PYmogPSByZWZlcmVuY2VPcHRpb25zW3JlZmVyZW5jZU9wdGlvbl07XG4gICAgaWYgKGlzX29iamVjdCAmJiByZWZPcHRpb25PYmouX190eXBlX18gIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVmT3B0aW9uT2JqID0gcmVmT3B0aW9uT2JqLl9fdHlwZV9fO1xuICAgIH1cblxuICAgIFZhbGlkYXRvci5jaGVja0ZpZWxkcyhvcHRpb24sIG9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbnMsIHJlZmVyZW5jZU9wdGlvbiwgcmVmT3B0aW9uT2JqLCBwYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gIG9wdGlvbiAgICAgICAgICAgfCB0aGUgb3B0aW9uIHByb3BlcnR5XG4gICAqIEBwYXJhbSB7T2JqZWN0fSAgb3B0aW9ucyAgICAgICAgICB8IFRoZSBzdXBwbGllZCBvcHRpb25zIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdH0gIHJlZmVyZW5jZU9wdGlvbnMgfCBUaGUgcmVmZXJlbmNlIG9wdGlvbnMgY29udGFpbmluZyBhbGwgb3B0aW9ucyBhbmQgdGhlaXIgYWxsb3dlZCBmb3JtYXRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSAgcmVmZXJlbmNlT3B0aW9uICB8IFVzdWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyBvcHRpb24sIGV4Y2VwdCB3aGVuIGhhbmRsaW5nIGFuIF9fYW55X18gdGFnLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gIHJlZk9wdGlvbk9iaiAgICAgfCBUaGlzIGlzIHRoZSB0eXBlIG9iamVjdCBmcm9tIHRoZSByZWZlcmVuY2Ugb3B0aW9uc1xuICAgKiBAcGFyYW0ge0FycmF5fSAgIHBhdGggICAgICAgICAgICAgfCB3aGVyZSBpbiB0aGUgb2JqZWN0IGlzIHRoZSBvcHRpb25cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGNoZWNrRmllbGRzKG9wdGlvbiwgb3B0aW9ucywgcmVmZXJlbmNlT3B0aW9ucywgcmVmZXJlbmNlT3B0aW9uLCByZWZPcHRpb25PYmosIHBhdGgpIHtcbiAgICBsZXQgbG9nID0gZnVuY3Rpb24obWVzc2FnZSkge1xuICAgICAgY29uc29sZS5sb2coJyVjJyArIG1lc3NhZ2UgKyBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihwYXRoLCBvcHRpb24pLCBwcmludFN0eWxlKTtcbiAgICB9O1xuXG4gICAgbGV0IG9wdGlvblR5cGUgPSBWYWxpZGF0b3IuZ2V0VHlwZShvcHRpb25zW29wdGlvbl0pO1xuICAgIGxldCByZWZPcHRpb25UeXBlID0gcmVmT3B0aW9uT2JqW29wdGlvblR5cGVdO1xuXG4gICAgaWYgKHJlZk9wdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gaWYgdGhlIHR5cGUgaXMgY29ycmVjdCwgd2UgY2hlY2sgaWYgaXQgaXMgc3VwcG9zZWQgdG8gYmUgb25lIG9mIGEgZmV3IHNlbGVjdCB2YWx1ZXNcbiAgICAgIGlmIChWYWxpZGF0b3IuZ2V0VHlwZShyZWZPcHRpb25UeXBlKSA9PT0gJ2FycmF5JyAmJiByZWZPcHRpb25UeXBlLmluZGV4T2Yob3B0aW9uc1tvcHRpb25dKSA9PT0gLTEpIHtcbiAgICAgICAgbG9nKCdJbnZhbGlkIG9wdGlvbiBkZXRlY3RlZCBpbiBcIicgKyBvcHRpb24gKyAnXCIuJyArXG4gICAgICAgICAgJyBBbGxvd2VkIHZhbHVlcyBhcmU6JyArIFZhbGlkYXRvci5wcmludChyZWZPcHRpb25UeXBlKSArXG4gICAgICAgICAgJyBub3QgXCInICsgb3B0aW9uc1tvcHRpb25dICsgJ1wiLiAnKTtcbiAgICAgICAgZXJyb3JGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcHRpb25UeXBlID09PSAnb2JqZWN0JyAmJiByZWZlcmVuY2VPcHRpb24gIT09IFwiX19hbnlfX1wiKSB7XG4gICAgICAgIHBhdGggPSB1dGlsLmNvcHlBbmRFeHRlbmRBcnJheShwYXRoLCBvcHRpb24pO1xuICAgICAgICBWYWxpZGF0b3IucGFyc2Uob3B0aW9uc1tvcHRpb25dLCByZWZlcmVuY2VPcHRpb25zW3JlZmVyZW5jZU9wdGlvbl0sIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChyZWZPcHRpb25PYmpbJ2FueSddID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIHR5cGUgb2YgdGhlIGZpZWxkIGlzIGluY29ycmVjdCBhbmQgdGhlIGZpZWxkIGNhbm5vdCBiZSBhbnlcbiAgICAgIGxvZygnSW52YWxpZCB0eXBlIHJlY2VpdmVkIGZvciBcIicgKyBvcHRpb24gK1xuICAgICAgICAnXCIuIEV4cGVjdGVkOiAnICsgVmFsaWRhdG9yLnByaW50KE9iamVjdC5rZXlzKHJlZk9wdGlvbk9iaikpICtcbiAgICAgICAgJy4gUmVjZWl2ZWQgWycgICsgb3B0aW9uVHlwZSArICddIFwiJyArIG9wdGlvbnNbb3B0aW9uXSArICdcIicpO1xuICAgICAgZXJyb3JGb3VuZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fGJvb2xlYW58bnVtYmVyfHN0cmluZ3xBcnJheS48bnVtYmVyPnxEYXRlfE5vZGV8TW9tZW50fHVuZGVmaW5lZHxudWxsfSBvYmplY3RcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldFR5cGUob2JqZWN0KSB7XG4gICAgdmFyIHR5cGUgPSB0eXBlb2Ygb2JqZWN0O1xuXG4gICAgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAob2JqZWN0ID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgQm9vbGVhbikge1xuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bWJlcikge1xuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgIH1cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuICdhcnJheSc7XG4gICAgICB9XG4gICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfVxuICAgICAgaWYgKG9iamVjdC5ub2RlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAnZG9tJztcbiAgICAgIH1cbiAgICAgIGlmIChvYmplY3QuX2lzQU1vbWVudE9iamVjdCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gJ21vbWVudCc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ29iamVjdCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuICdib29sZWFuJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtBcnJheS48c3RyaW5nPn0gcGF0aFxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0U3VnZ2VzdGlvbihvcHRpb24sIG9wdGlvbnMsIHBhdGgpIHtcbiAgICBsZXQgbG9jYWxTZWFyY2ggPSBWYWxpZGF0b3IuZmluZEluT3B0aW9ucyhvcHRpb24sb3B0aW9ucyxwYXRoLGZhbHNlKTtcbiAgICBsZXQgZ2xvYmFsU2VhcmNoID0gVmFsaWRhdG9yLmZpbmRJbk9wdGlvbnMob3B0aW9uLGFsbE9wdGlvbnMsW10sdHJ1ZSk7XG5cbiAgICBsZXQgbG9jYWxTZWFyY2hUaHJlc2hvbGQgPSA4O1xuICAgIGxldCBnbG9iYWxTZWFyY2hUaHJlc2hvbGQgPSA0O1xuXG4gICAgbGV0IG1zZztcbiAgICBpZiAobG9jYWxTZWFyY2guaW5kZXhNYXRjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtc2cgPSAnIGluICcgKyBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihsb2NhbFNlYXJjaC5wYXRoLCBvcHRpb24sJycpICtcbiAgICAgICAgJ1BlcmhhcHMgaXQgd2FzIGluY29tcGxldGU/IERpZCB5b3UgbWVhbjogXCInICsgbG9jYWxTZWFyY2guaW5kZXhNYXRjaCArICdcIj9cXG5cXG4nO1xuICAgIH1cbiAgICBlbHNlIGlmIChnbG9iYWxTZWFyY2guZGlzdGFuY2UgPD0gZ2xvYmFsU2VhcmNoVGhyZXNob2xkICYmIGxvY2FsU2VhcmNoLmRpc3RhbmNlID4gZ2xvYmFsU2VhcmNoLmRpc3RhbmNlKSB7XG4gICAgICBtc2cgPSAnIGluICcgKyBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihsb2NhbFNlYXJjaC5wYXRoLCBvcHRpb24sJycpICtcbiAgICAgICAgJ1BlcmhhcHMgaXQgd2FzIG1pc3BsYWNlZD8gTWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGF0OiAnICtcbiAgICAgICAgVmFsaWRhdG9yLnByaW50TG9jYXRpb24oZ2xvYmFsU2VhcmNoLnBhdGgsIGdsb2JhbFNlYXJjaC5jbG9zZXN0TWF0Y2gsJycpO1xuICAgIH1cbiAgICBlbHNlIGlmIChsb2NhbFNlYXJjaC5kaXN0YW5jZSA8PSBsb2NhbFNlYXJjaFRocmVzaG9sZCkge1xuICAgICAgbXNnID0gJy4gRGlkIHlvdSBtZWFuIFwiJyArIGxvY2FsU2VhcmNoLmNsb3Nlc3RNYXRjaCArICdcIj8nICtcbiAgICAgICAgVmFsaWRhdG9yLnByaW50TG9jYXRpb24obG9jYWxTZWFyY2gucGF0aCwgb3B0aW9uKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtc2cgPSAnLiBEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlOiAnICsgVmFsaWRhdG9yLnByaW50KE9iamVjdC5rZXlzKG9wdGlvbnMpKSArXG4gICAgICBWYWxpZGF0b3IucHJpbnRMb2NhdGlvbihwYXRoLCBvcHRpb24pO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCclY1Vua25vd24gb3B0aW9uIGRldGVjdGVkOiBcIicgKyBvcHRpb24gKyAnXCInICsgbXNnLCBwcmludFN0eWxlKTtcbiAgICBlcnJvckZvdW5kID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmF2ZXJzZSB0aGUgb3B0aW9ucyBpbiBzZWFyY2ggZm9yIGEgbWF0Y2guXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25cbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtBcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlY3Vyc2l2ZT1mYWxzZV1cbiAgICogQHJldHVybnMge3tjbG9zZXN0TWF0Y2g6IHN0cmluZywgcGF0aDogQXJyYXksIGRpc3RhbmNlOiBudW1iZXJ9fVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZmluZEluT3B0aW9ucyhvcHRpb24sIG9wdGlvbnMsIHBhdGgsIHJlY3Vyc2l2ZSA9IGZhbHNlKSB7XG4gICAgbGV0IG1pbiA9IDFlOTtcbiAgICBsZXQgY2xvc2VzdE1hdGNoID0gJyc7XG4gICAgbGV0IGNsb3Nlc3RNYXRjaFBhdGggPSBbXTtcbiAgICBsZXQgbG93ZXJDYXNlT3B0aW9uID0gb3B0aW9uLnRvTG93ZXJDYXNlKCk7XG4gICAgbGV0IGluZGV4TWF0Y2ggPSB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgb3AgaW4gb3B0aW9ucykgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgIGxldCBkaXN0YW5jZTtcbiAgICAgIGlmIChvcHRpb25zW29wXS5fX3R5cGVfXyAhPT0gdW5kZWZpbmVkICYmIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gVmFsaWRhdG9yLmZpbmRJbk9wdGlvbnMob3B0aW9uLCBvcHRpb25zW29wXSwgdXRpbC5jb3B5QW5kRXh0ZW5kQXJyYXkocGF0aCxvcCkpO1xuICAgICAgICBpZiAobWluID4gcmVzdWx0LmRpc3RhbmNlKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoID0gcmVzdWx0LmNsb3Nlc3RNYXRjaDtcbiAgICAgICAgICBjbG9zZXN0TWF0Y2hQYXRoID0gcmVzdWx0LnBhdGg7XG4gICAgICAgICAgbWluID0gcmVzdWx0LmRpc3RhbmNlO1xuICAgICAgICAgIGluZGV4TWF0Y2ggPSByZXN1bHQuaW5kZXhNYXRjaDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChvcC50b0xvd2VyQ2FzZSgpLmluZGV4T2YobG93ZXJDYXNlT3B0aW9uKSAhPT0gLTEpIHtcbiAgICAgICAgICBpbmRleE1hdGNoID0gb3A7XG4gICAgICAgIH1cbiAgICAgICAgZGlzdGFuY2UgPSBWYWxpZGF0b3IubGV2ZW5zaHRlaW5EaXN0YW5jZShvcHRpb24sIG9wKTtcbiAgICAgICAgaWYgKG1pbiA+IGRpc3RhbmNlKSB7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoID0gb3A7XG4gICAgICAgICAgY2xvc2VzdE1hdGNoUGF0aCA9IHV0aWwuY29weUFycmF5KHBhdGgpO1xuICAgICAgICAgIG1pbiA9IGRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7Y2xvc2VzdE1hdGNoOmNsb3Nlc3RNYXRjaCwgcGF0aDpjbG9zZXN0TWF0Y2hQYXRoLCBkaXN0YW5jZTptaW4sIGluZGV4TWF0Y2g6IGluZGV4TWF0Y2h9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz59IHBhdGhcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwcmludExvY2F0aW9uKHBhdGgsIG9wdGlvbiwgcHJlZml4ID0gJ1Byb2JsZW0gdmFsdWUgZm91bmQgYXQ6IFxcbicpIHtcbiAgICBsZXQgc3RyID0gJ1xcblxcbicgKyBwcmVmaXggKyAnb3B0aW9ucyA9IHtcXG4nO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpICsgMTsgaisrKSB7XG4gICAgICAgIHN0ciArPSAnICAnO1xuICAgICAgfVxuICAgICAgc3RyICs9IHBhdGhbaV0gKyAnOiB7XFxuJztcbiAgICB9XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXRoLmxlbmd0aCArIDE7IGorKykge1xuICAgICAgc3RyICs9ICcgICc7XG4gICAgfVxuICAgIHN0ciArPSBvcHRpb24gKyAnXFxuJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoICsgMTsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhdGgubGVuZ3RoIC0gaTsgaisrKSB7XG4gICAgICAgIHN0ciArPSAnICAnO1xuICAgICAgfVxuICAgICAgc3RyICs9ICd9XFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHN0ciArICdcXG5cXG4nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHtTdHJpbmd9XG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBwcmludChvcHRpb25zKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLnJlcGxhY2UoLyhcXFwiKXwoXFxbKXwoXFxdKXwoLFwiX190eXBlX19cIikvZywgXCJcIikucmVwbGFjZSgvKFxcLCkvZywgJywgJylcbiAgfVxuXG5cbiAgLyoqXG4gICAqICBDb21wdXRlIHRoZSBlZGl0IGRpc3RhbmNlIGJldHdlZW4gdGhlIHR3byBnaXZlbiBzdHJpbmdzXG4gICAqIGh0dHA6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvQWxnb3JpdGhtX0ltcGxlbWVudGF0aW9uL1N0cmluZ3MvTGV2ZW5zaHRlaW5fZGlzdGFuY2UjSmF2YVNjcmlwdFxuICAgKlxuICAgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQW5kcmVpIE1hY2tlbnppZVxuICAgKlxuICAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICAgKlxuICAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAgICpcbiAgICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiXG4gICAqIEByZXR1cm5zIHtBcnJheS48QXJyYXkuPG51bWJlcj4+fX1cbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGxldmVuc2h0ZWluRGlzdGFuY2UoYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGIubGVuZ3RoO1xuICAgIGlmIChiLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGEubGVuZ3RoO1xuXG4gICAgdmFyIG1hdHJpeCA9IFtdO1xuXG4gICAgLy8gaW5jcmVtZW50IGFsb25nIHRoZSBmaXJzdCBjb2x1bW4gb2YgZWFjaCByb3dcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1hdHJpeFtpXSA9IFtpXTtcbiAgICB9XG5cbiAgICAvLyBpbmNyZW1lbnQgZWFjaCBjb2x1bW4gaW4gdGhlIGZpcnN0IHJvd1xuICAgIHZhciBqO1xuICAgIGZvciAoaiA9IDA7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgbWF0cml4WzBdW2pdID0gajtcbiAgICB9XG5cbiAgICAvLyBGaWxsIGluIHRoZSByZXN0IG9mIHRoZSBtYXRyaXhcbiAgICBmb3IgKGkgPSAxOyBpIDw9IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAoaiA9IDE7IGogPD0gYS5sZW5ndGg7IGorKykge1xuICAgICAgICBpZiAoYi5jaGFyQXQoaSAtIDEpID09IGEuY2hhckF0KGogLSAxKSkge1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IG1hdHJpeFtpIC0gMV1baiAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdHJpeFtpXVtqXSA9IE1hdGgubWluKG1hdHJpeFtpIC0gMV1baiAtIDFdICsgMSwgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICBNYXRoLm1pbihtYXRyaXhbaV1baiAtIDFdICsgMSwgLy8gaW5zZXJ0aW9uXG4gICAgICAgICAgICAgIG1hdHJpeFtpIC0gMV1bal0gKyAxKSk7IC8vIGRlbGV0aW9uXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWF0cml4W2IubGVuZ3RoXVthLmxlbmd0aF07XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgcG9zc2libGUgb3B0aW9ucy4gSXQgd2lsbCBjaGVjayBpZiB0aGUgdHlwZXMgYXJlIGNvcnJlY3QsIGlmIHJlcXVpcmVkIGlmIHRoZSBvcHRpb24gaXMgb25lXG4gKiBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMuXG4gKlxuICogX19hbnlfXyBtZWFucyB0aGF0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBtYXR0ZXIuXG4gKiBfX3R5cGVfXyBpcyBhIHJlcXVpcmVkIGZpZWxkIGZvciBhbGwgb2JqZWN0cyBhbmQgY29udGFpbnMgdGhlIGFsbG93ZWQgdHlwZXMgb2YgYWxsIG9iamVjdHNcbiAqL1xubGV0IHN0cmluZyA9ICdzdHJpbmcnO1xubGV0IGJvb2wgPSAnYm9vbGVhbic7XG5sZXQgbnVtYmVyID0gJ251bWJlcic7XG5sZXQgYXJyYXkgPSAnYXJyYXknO1xubGV0IGRhdGUgPSAnZGF0ZSc7XG5sZXQgb2JqZWN0ID0gJ29iamVjdCc7IC8vIHNob3VsZCBvbmx5IGJlIGluIGEgX190eXBlX18gcHJvcGVydHlcbmxldCBkb20gPSAnZG9tJztcbmxldCBtb21lbnQkMSA9ICdtb21lbnQnO1xubGV0IGFueSA9ICdhbnknO1xuXG5sZXQgYWxsT3B0aW9ucyQxID0ge1xuICBjb25maWd1cmU6IHtcbiAgICBlbmFibGVkOiB7ICdib29sZWFuJzogYm9vbH0sXG4gICAgZmlsdGVyOiB7ICdib29sZWFuJzogYm9vbCwnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICBjb250YWluZXI6IHtkb219LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0LCAnYm9vbGVhbic6IGJvb2wsJ2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ31cbiAgfSxcblxuICAvL2dsb2JhbHMgOlxuICBhbGlnbjoge3N0cmluZ30sXG4gIGFsaWduQ3VycmVudFRpbWU6IHtzdHJpbmcsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gIHJ0bDogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gIHJvbGxpbmdNb2RlOiB7XG4gICAgZm9sbG93OiB7ICdib29sZWFuJzogYm9vbCB9LFxuICAgIG9mZnNldDoge251bWJlciwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0fVxuICB9LFxuICBvblRpbWVvdXQ6IHtcbiAgICB0aW1lb3V0TXM6IHtudW1iZXJ9LFxuICAgIGNhbGxiYWNrOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgX190eXBlX186IHtvYmplY3R9XG4gIH0sXG4gIHZlcnRpY2FsU2Nyb2xsOiB7ICdib29sZWFuJzogYm9vbCwgJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgaG9yaXpvbnRhbFNjcm9sbDogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gIGF1dG9SZXNpemU6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgdGhyb3R0bGVSZWRyYXc6IHtudW1iZXJ9LCAvLyBUT0RPOiBERVBSSUNBVEVEIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXMvaXNzdWVzLzI1MTFcbiAgY2xpY2tUb1VzZTogeyAnYm9vbGVhbic6IGJvb2x9LFxuICBkYXRhQXR0cmlidXRlczoge3N0cmluZywgYXJyYXl9LFxuICBlZGl0YWJsZToge1xuICAgIGFkZDogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgcmVtb3ZlOiB7ICdib29sZWFuJzogYm9vbCwgJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICB1cGRhdGVHcm91cDogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgdXBkYXRlVGltZTogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgb3ZlcnJpZGVJdGVtczogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgX190eXBlX186IHsgJ2Jvb2xlYW4nOiBib29sLCBvYmplY3R9XG4gIH0sXG4gIGVuZDoge251bWJlciwgZGF0ZSwgc3RyaW5nLCBtb21lbnQ6IG1vbWVudCQxfSxcbiAgZm9ybWF0OiB7XG4gICAgbWlub3JMYWJlbHM6IHtcbiAgICAgIG1pbGxpc2Vjb25kOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBzZWNvbmQ6IHtzdHJpbmcsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIG1pbnV0ZToge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgaG91cjoge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgd2Vla2RheToge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgZGF5OiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICB3ZWVrOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBtb250aDoge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgeWVhcjoge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgX190eXBlX186IHtvYmplY3QsICdmdW5jdGlvbic6ICdmdW5jdGlvbid9XG4gICAgfSxcbiAgICBtYWpvckxhYmVsczoge1xuICAgICAgbWlsbGlzZWNvbmQ6IHtzdHJpbmcsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHNlY29uZDoge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgbWludXRlOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBob3VyOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICB3ZWVrZGF5OiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBkYXk6IHtzdHJpbmcsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHdlZWs6IHtzdHJpbmcsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIG1vbnRoOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICB5ZWFyOiB7c3RyaW5nLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBfX3R5cGVfXzoge29iamVjdCwgJ2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ31cbiAgICB9LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0fVxuICB9LFxuICBtb21lbnQ6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgZ3JvdXBIZWlnaHRNb2RlOiB7c3RyaW5nfSxcbiAgZ3JvdXBPcmRlcjoge3N0cmluZywgJ2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIGdyb3VwRWRpdGFibGU6IHtcbiAgICBhZGQ6IHsgJ2Jvb2xlYW4nOiBib29sLCAndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIHJlbW92ZTogeyAnYm9vbGVhbic6IGJvb2wsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgb3JkZXI6IHsgJ2Jvb2xlYW4nOiBib29sLCAndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIF9fdHlwZV9fOiB7ICdib29sZWFuJzogYm9vbCwgb2JqZWN0fVxuICB9LFxuICBncm91cE9yZGVyU3dhcDogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICBoZWlnaHQ6IHtzdHJpbmcsIG51bWJlcn0sXG4gIGhpZGRlbkRhdGVzOiB7XG4gICAgc3RhcnQ6IHtkYXRlLCBudW1iZXIsIHN0cmluZywgbW9tZW50OiBtb21lbnQkMX0sXG4gICAgZW5kOiB7ZGF0ZSwgbnVtYmVyLCBzdHJpbmcsIG1vbWVudDogbW9tZW50JDF9LFxuICAgIHJlcGVhdDoge3N0cmluZ30sXG4gICAgX190eXBlX186IHtvYmplY3QsIGFycmF5fVxuICB9LFxuICBpdGVtc0Fsd2F5c0RyYWdnYWJsZToge1xuICAgIGl0ZW06IHsgJ2Jvb2xlYW4nOiBib29sLCAndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIHJhbmdlOiB7ICdib29sZWFuJzogYm9vbCwgJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICBfX3R5cGVfXzogeyAnYm9vbGVhbic6IGJvb2wsIG9iamVjdH1cbiAgfSxcbiAgbGltaXRTaXplOiB7J2Jvb2xlYW4nOiBib29sfSxcbiAgbG9jYWxlOntzdHJpbmd9LFxuICBsb2NhbGVzOntcbiAgICBfX2FueV9fOiB7YW55fSxcbiAgICBfX3R5cGVfXzoge29iamVjdH1cbiAgfSxcbiAgbG9uZ1NlbGVjdFByZXNzVGltZToge251bWJlcn0sXG4gIG1hcmdpbjoge1xuICAgIGF4aXM6IHtudW1iZXJ9LFxuICAgIGl0ZW06IHtcbiAgICAgIGhvcml6b250YWw6IHtudW1iZXIsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHZlcnRpY2FsOiB7bnVtYmVyLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBfX3R5cGVfXzoge29iamVjdCxudW1iZXJ9XG4gICAgfSxcbiAgICBfX3R5cGVfXzoge29iamVjdCxudW1iZXJ9XG4gIH0sXG4gIG1heDoge2RhdGUsIG51bWJlciwgc3RyaW5nLCBtb21lbnQ6IG1vbWVudCQxfSxcbiAgbWF4SGVpZ2h0OiB7bnVtYmVyLCBzdHJpbmd9LFxuICBtYXhNaW5vckNoYXJzOiB7bnVtYmVyfSxcbiAgbWluOiB7ZGF0ZSwgbnVtYmVyLCBzdHJpbmcsIG1vbWVudDogbW9tZW50JDF9LFxuICBtaW5IZWlnaHQ6IHtudW1iZXIsIHN0cmluZ30sXG4gIG1vdmVhYmxlOiB7ICdib29sZWFuJzogYm9vbH0sXG4gIG11bHRpc2VsZWN0OiB7ICdib29sZWFuJzogYm9vbH0sXG4gIG11bHRpc2VsZWN0UGVyR3JvdXA6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgb25BZGQ6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgb25Ecm9wT2JqZWN0T25JdGVtOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9uVXBkYXRlOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9uTW92ZTogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICBvbk1vdmluZzogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICBvblJlbW92ZTogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICBvbkFkZEdyb3VwOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9uTW92ZUdyb3VwOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9uUmVtb3ZlR3JvdXA6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgb25Jbml0aWFsRHJhd0NvbXBsZXRlOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9yZGVyOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIG9yaWVudGF0aW9uOiB7XG4gICAgYXhpczoge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIGl0ZW06IHtzdHJpbmcsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICBfX3R5cGVfXzoge3N0cmluZywgb2JqZWN0fVxuICB9LFxuICBzZWxlY3RhYmxlOiB7ICdib29sZWFuJzogYm9vbH0sXG4gIHNlcXVlbnRpYWxTZWxlY3Rpb246IHsgJ2Jvb2xlYW4nOiBib29sIH0sXG4gIHNob3dDdXJyZW50VGltZTogeyAnYm9vbGVhbic6IGJvb2x9LFxuICBzaG93TWFqb3JMYWJlbHM6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgc2hvd01pbm9yTGFiZWxzOiB7ICdib29sZWFuJzogYm9vbH0sXG4gIHNob3dXZWVrU2NhbGU6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgc3RhY2s6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgc3RhY2tTdWJncm91cHM6IHsgJ2Jvb2xlYW4nOiBib29sfSxcbiAgY2x1c3RlcjogeyBcbiAgICBtYXhJdGVtczogeydudW1iZXInOiBudW1iZXIsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgdGl0bGVUZW1wbGF0ZTogeydzdHJpbmcnOiBzdHJpbmcsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgY2x1c3RlckNyaXRlcmlhOiB7ICdmdW5jdGlvbic6ICdmdW5jdGlvbicsICd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgc2hvd1N0aXBlczogeydib29sZWFuJzogYm9vbCwgJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICBmaXRPbkRvdWJsZUNsaWNrOiB7J2Jvb2xlYW4nOiBib29sLCAndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIF9fdHlwZV9fOiB7J2Jvb2xlYW4nOiBib29sLCBvYmplY3R9XG4gIH0sXG4gIHNuYXA6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nLCAnbnVsbCc6ICdudWxsJ30sXG4gIHN0YXJ0OiB7ZGF0ZSwgbnVtYmVyLCBzdHJpbmcsIG1vbWVudDogbW9tZW50JDF9LFxuICB0ZW1wbGF0ZTogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICBsb2FkaW5nU2NyZWVuVGVtcGxhdGU6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgZ3JvdXBUZW1wbGF0ZTogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICB2aXNpYmxlRnJhbWVUZW1wbGF0ZToge3N0cmluZywgJ2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gIHNob3dUb29sdGlwczogeyAnYm9vbGVhbic6IGJvb2x9LFxuICB0b29sdGlwOiB7XG4gICAgZm9sbG93TW91c2U6IHsgJ2Jvb2xlYW4nOiBib29sIH0sXG4gICAgb3ZlcmZsb3dNZXRob2Q6IHsgJ3N0cmluZyc6IFsnY2FwJywgJ2ZsaXAnLCAnbm9uZSddIH0sXG4gICAgZGVsYXk6IHtudW1iZXJ9LFxuICAgIHRlbXBsYXRlOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgX190eXBlX186IHtvYmplY3R9XG4gIH0sXG4gIHRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lOiB7XG4gICAgdGVtcGxhdGU6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICBfX3R5cGVfXzogeyAnYm9vbGVhbic6IGJvb2wsIG9iamVjdH1cbiAgfSxcbiAgdGltZUF4aXM6IHtcbiAgICBzY2FsZToge3N0cmluZywndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIHN0ZXA6IHtudW1iZXIsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICBfX3R5cGVfXzoge29iamVjdH1cbiAgfSxcbiAgdHlwZToge3N0cmluZ30sXG4gIHdpZHRoOiB7c3RyaW5nLCBudW1iZXJ9LFxuICBwcmVmZXJab29tOiB7ICdib29sZWFuJzogYm9vbH0sXG4gIHpvb21hYmxlOiB7ICdib29sZWFuJzogYm9vbH0sXG4gIHpvb21LZXk6IHtzdHJpbmc6IFsnY3RybEtleScsICdhbHRLZXknLCAnc2hpZnRLZXknLCAnbWV0YUtleScsICcnXX0sXG4gIHpvb21GcmljdGlvbjoge251bWJlcn0sXG4gIHpvb21NYXg6IHtudW1iZXJ9LFxuICB6b29tTWluOiB7bnVtYmVyfSxcblxuICBfX3R5cGVfXzoge29iamVjdH1cbn07XG5cbmxldCBjb25maWd1cmVPcHRpb25zID0ge1xuICBnbG9iYWw6IHtcbiAgICBhbGlnbjogIFsnY2VudGVyJywgJ2xlZnQnLCAncmlnaHQnXSxcbiAgICBhbGlnbkN1cnJlbnRUaW1lOiBbJ25vbmUnLCAneWVhcicsICdtb250aCcsICdxdWFydGVyJywgJ3dlZWsnLCAnaXNvV2VlaycsICdkYXknLCAnZGF0ZScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXSxcbiAgICBkaXJlY3Rpb246ICBmYWxzZSxcbiAgICBhdXRvUmVzaXplOiB0cnVlLFxuICAgIGNsaWNrVG9Vc2U6IGZhbHNlLFxuICAgIC8vIGRhdGFBdHRyaWJ1dGVzOiBbJ2FsbCddLCAvLyBGSVhNRTogY2FuIGJlICdhbGwnIG9yIHN0cmluZ1tdXG4gICAgICBlZGl0YWJsZToge1xuICAgICAgYWRkOiBmYWxzZSxcbiAgICAgIHJlbW92ZTogZmFsc2UsXG4gICAgICB1cGRhdGVHcm91cDogZmFsc2UsXG4gICAgICB1cGRhdGVUaW1lOiBmYWxzZVxuICAgIH0sXG4gICAgZW5kOiAnJyxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIG1pbm9yTGFiZWxzOiB7XG4gICAgICAgIG1pbGxpc2Vjb25kOidTU1MnLFxuICAgICAgICBzZWNvbmQ6ICAgICAncycsXG4gICAgICAgIG1pbnV0ZTogICAgICdISDptbScsXG4gICAgICAgIGhvdXI6ICAgICAgICdISDptbScsXG4gICAgICAgIHdlZWtkYXk6ICAgICdkZGQgRCcsXG4gICAgICAgIGRheTogICAgICAgICdEJyxcbiAgICAgICAgd2VlazogICAgICAgJ3cnLFxuICAgICAgICBtb250aDogICAgICAnTU1NJyxcbiAgICAgICAgeWVhcjogICAgICAgJ1lZWVknXG4gICAgICB9LFxuICAgICAgbWFqb3JMYWJlbHM6IHtcbiAgICAgICAgbWlsbGlzZWNvbmQ6J0hIOm1tOnNzJyxcbiAgICAgICAgc2Vjb25kOiAgICAgJ0QgTU1NTSBISDptbScsXG4gICAgICAgIG1pbnV0ZTogICAgICdkZGQgRCBNTU1NJyxcbiAgICAgICAgaG91cjogICAgICAgJ2RkZCBEIE1NTU0nLFxuICAgICAgICB3ZWVrZGF5OiAgICAnTU1NTSBZWVlZJyxcbiAgICAgICAgZGF5OiAgICAgICAgJ01NTU0gWVlZWScsXG4gICAgICAgIHdlZWs6ICAgICAgICdNTU1NIFlZWVknLFxuICAgICAgICBtb250aDogICAgICAnWVlZWScsXG4gICAgICAgIHllYXI6ICAgICAgICcnXG4gICAgICB9XG4gICAgfSxcbiAgICBncm91cEhlaWdodE1vZGU6IFsnYXV0bycsICdmaXhlZCcsICdmaXRJdGVtcyddLFxuICAgIC8vZ3JvdXBPcmRlcjoge3N0cmluZywgJ2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgZ3JvdXBzRHJhZ2dhYmxlOiBmYWxzZSxcbiAgICBoZWlnaHQ6ICcnLFxuICAgIC8vaGlkZGVuRGF0ZXM6IHtvYmplY3QsIGFycmF5fSxcbiAgICBsb2NhbGU6ICcnLFxuICAgIGxvbmdTZWxlY3RQcmVzc1RpbWU6IDI1MSxcbiAgICBtYXJnaW46IHtcbiAgICAgIGF4aXM6IFsyMCwgMCwgMTAwLCAxXSxcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgaG9yaXpvbnRhbDogWzEwLCAwLCAxMDAsIDFdLFxuICAgICAgICB2ZXJ0aWNhbDogWzEwLCAwLCAxMDAsIDFdXG4gICAgICB9XG4gICAgfSxcbiAgICBtYXg6ICcnLFxuICAgIG1heEhlaWdodDogJycsXG4gICAgbWF4TWlub3JDaGFyczogWzcsIDAsIDIwLCAxXSxcbiAgICBtaW46ICcnLFxuICAgIG1pbkhlaWdodDogJycsXG4gICAgbW92ZWFibGU6IGZhbHNlLFxuICAgIG11bHRpc2VsZWN0OiBmYWxzZSxcbiAgICBtdWx0aXNlbGVjdFBlckdyb3VwOiBmYWxzZSxcbiAgICAvL29uQWRkOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgLy9vblVwZGF0ZTogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICAgIC8vb25Nb3ZlOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgLy9vbk1vdmluZzogeydmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICAgIC8vb25SZW5hbWU6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICAvL29yZGVyOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJ30sXG4gICAgb3JpZW50YXRpb246IHtcbiAgICAgIGF4aXM6IFsnYm90aCcsICdib3R0b20nLCAndG9wJ10sXG4gICAgICBpdGVtOiBbJ2JvdHRvbScsICd0b3AnXVxuICAgIH0sXG4gICAgcHJlZmVyWm9vbTogZmFsc2UsXG4gICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICBzaG93Q3VycmVudFRpbWU6IGZhbHNlLFxuICAgIHNob3dNYWpvckxhYmVsczogdHJ1ZSxcbiAgICBzaG93TWlub3JMYWJlbHM6IHRydWUsXG4gICAgc3RhY2s6IHRydWUsXG4gICAgc3RhY2tTdWJncm91cHM6IHRydWUsXG4gICAgY2x1c3RlcjogZmFsc2UsXG4gICAgLy9zbmFwOiB7J2Z1bmN0aW9uJzogJ2Z1bmN0aW9uJywgbmFkYX0sXG4gICAgc3RhcnQ6ICcnLFxuICAgIC8vdGVtcGxhdGU6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICAvL3RpbWVBeGlzOiB7XG4gICAgLy8gIHNjYWxlOiBbJ21pbGxpc2Vjb25kJywgJ3NlY29uZCcsICdtaW51dGUnLCAnaG91cicsICd3ZWVrZGF5JywgJ2RheScsICd3ZWVrJywgJ21vbnRoJywgJ3llYXInXSxcbiAgICAvLyAgc3RlcDogWzEsIDEsIDEwLCAxXVxuICAgIC8vfSxcbiAgICBzaG93VG9vbHRpcHM6IHRydWUsXG4gICAgdG9vbHRpcDoge1xuICAgICAgZm9sbG93TW91c2U6IGZhbHNlLFxuICAgICAgb3ZlcmZsb3dNZXRob2Q6ICdmbGlwJyxcbiAgICAgIGRlbGF5OiBbNTAwLCAwLCA5OTk5OSwgMTAwXSxcbiAgICB9LFxuICAgIHRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lOiBmYWxzZSxcbiAgICB0eXBlOiBbJ2JveCcsICdwb2ludCcsICdyYW5nZScsICdiYWNrZ3JvdW5kJ10sXG4gICAgd2lkdGg6ICcxMDAlJyxcbiAgICB6b29tYWJsZTogdHJ1ZSxcbiAgICB6b29tS2V5OiBbJ2N0cmxLZXknLCAnYWx0S2V5JywgJ3NoaWZ0S2V5JywgJ21ldGFLZXknLCAnJ10sXG4gICAgem9vbU1heDogWzMxNTM2MDAwMDAwMDAwMCwgMTAsIDMxNTM2MDAwMDAwMDAwMCwgMV0sXG4gICAgem9vbU1pbjogWzEwLCAxMCwgMzE1MzYwMDAwMDAwMDAwLCAxXVxuICB9XG59O1xuXG52YXIgaHRtbENvbG9ycyA9IHtibGFjazogJyMwMDAwMDAnLCBuYXZ5OiAnIzAwMDA4MCcsIGRhcmtibHVlOiAnIzAwMDA4QicsIG1lZGl1bWJsdWU6ICcjMDAwMENEJywgYmx1ZTogJyMwMDAwRkYnLCBkYXJrZ3JlZW46ICcjMDA2NDAwJywgZ3JlZW46ICcjMDA4MDAwJywgdGVhbDogJyMwMDgwODAnLCBkYXJrY3lhbjogJyMwMDhCOEInLCBkZWVwc2t5Ymx1ZTogJyMwMEJGRkYnLCBkYXJrdHVycXVvaXNlOiAnIzAwQ0VEMScsIG1lZGl1bXNwcmluZ2dyZWVuOiAnIzAwRkE5QScsIGxpbWU6ICcjMDBGRjAwJywgc3ByaW5nZ3JlZW46ICcjMDBGRjdGJywgYXF1YTogJyMwMEZGRkYnLCBjeWFuOiAnIzAwRkZGRicsIG1pZG5pZ2h0Ymx1ZTogJyMxOTE5NzAnLCBkb2RnZXJibHVlOiAnIzFFOTBGRicsIGxpZ2h0c2VhZ3JlZW46ICcjMjBCMkFBJywgZm9yZXN0Z3JlZW46ICcjMjI4QjIyJywgc2VhZ3JlZW46ICcjMkU4QjU3JywgZGFya3NsYXRlZ3JheTogJyMyRjRGNEYnLCBsaW1lZ3JlZW46ICcjMzJDRDMyJywgbWVkaXVtc2VhZ3JlZW46ICcjM0NCMzcxJywgdHVycXVvaXNlOiAnIzQwRTBEMCcsIHJveWFsYmx1ZTogJyM0MTY5RTEnLCBzdGVlbGJsdWU6ICcjNDY4MkI0JywgZGFya3NsYXRlYmx1ZTogJyM0ODNEOEInLCBtZWRpdW10dXJxdW9pc2U6ICcjNDhEMUNDJywgaW5kaWdvOiAnIzRCMDA4MicsIGRhcmtvbGl2ZWdyZWVuOiAnIzU1NkIyRicsIGNhZGV0Ymx1ZTogJyM1RjlFQTAnLCBjb3JuZmxvd2VyYmx1ZTogJyM2NDk1RUQnLCBtZWRpdW1hcXVhbWFyaW5lOiAnIzY2Q0RBQScsIGRpbWdyYXk6ICcjNjk2OTY5Jywgc2xhdGVibHVlOiAnIzZBNUFDRCcsIG9saXZlZHJhYjogJyM2QjhFMjMnLCBzbGF0ZWdyYXk6ICcjNzA4MDkwJywgbGlnaHRzbGF0ZWdyYXk6ICcjNzc4ODk5JywgbWVkaXVtc2xhdGVibHVlOiAnIzdCNjhFRScsIGxhd25ncmVlbjogJyM3Q0ZDMDAnLCBjaGFydHJldXNlOiAnIzdGRkYwMCcsIGFxdWFtYXJpbmU6ICcjN0ZGRkQ0JywgbWFyb29uOiAnIzgwMDAwMCcsIHB1cnBsZTogJyM4MDAwODAnLCBvbGl2ZTogJyM4MDgwMDAnLCBncmF5OiAnIzgwODA4MCcsIHNreWJsdWU6ICcjODdDRUVCJywgbGlnaHRza3libHVlOiAnIzg3Q0VGQScsIGJsdWV2aW9sZXQ6ICcjOEEyQkUyJywgZGFya3JlZDogJyM4QjAwMDAnLCBkYXJrbWFnZW50YTogJyM4QjAwOEInLCBzYWRkbGVicm93bjogJyM4QjQ1MTMnLCBkYXJrc2VhZ3JlZW46ICcjOEZCQzhGJywgbGlnaHRncmVlbjogJyM5MEVFOTAnLCBtZWRpdW1wdXJwbGU6ICcjOTM3MEQ4JywgZGFya3Zpb2xldDogJyM5NDAwRDMnLCBwYWxlZ3JlZW46ICcjOThGQjk4JywgZGFya29yY2hpZDogJyM5OTMyQ0MnLCB5ZWxsb3dncmVlbjogJyM5QUNEMzInLCBzaWVubmE6ICcjQTA1MjJEJywgYnJvd246ICcjQTUyQTJBJywgZGFya2dyYXk6ICcjQTlBOUE5JywgbGlnaHRibHVlOiAnI0FERDhFNicsIGdyZWVueWVsbG93OiAnI0FERkYyRicsIHBhbGV0dXJxdW9pc2U6ICcjQUZFRUVFJywgbGlnaHRzdGVlbGJsdWU6ICcjQjBDNERFJywgcG93ZGVyYmx1ZTogJyNCMEUwRTYnLCBmaXJlYnJpY2s6ICcjQjIyMjIyJywgZGFya2dvbGRlbnJvZDogJyNCODg2MEInLCBtZWRpdW1vcmNoaWQ6ICcjQkE1NUQzJywgcm9zeWJyb3duOiAnI0JDOEY4RicsIGRhcmtraGFraTogJyNCREI3NkInLCBzaWx2ZXI6ICcjQzBDMEMwJywgbWVkaXVtdmlvbGV0cmVkOiAnI0M3MTU4NScsIGluZGlhbnJlZDogJyNDRDVDNUMnLCBwZXJ1OiAnI0NEODUzRicsIGNob2NvbGF0ZTogJyNEMjY5MUUnLCB0YW46ICcjRDJCNDhDJywgbGlnaHRncmV5OiAnI0QzRDNEMycsIHBhbGV2aW9sZXRyZWQ6ICcjRDg3MDkzJywgdGhpc3RsZTogJyNEOEJGRDgnLCBvcmNoaWQ6ICcjREE3MEQ2JywgZ29sZGVucm9kOiAnI0RBQTUyMCcsIGNyaW1zb246ICcjREMxNDNDJywgZ2FpbnNib3JvOiAnI0RDRENEQycsIHBsdW06ICcjRERBMEREJywgYnVybHl3b29kOiAnI0RFQjg4NycsIGxpZ2h0Y3lhbjogJyNFMEZGRkYnLCBsYXZlbmRlcjogJyNFNkU2RkEnLCBkYXJrc2FsbW9uOiAnI0U5OTY3QScsIHZpb2xldDogJyNFRTgyRUUnLCBwYWxlZ29sZGVucm9kOiAnI0VFRThBQScsIGxpZ2h0Y29yYWw6ICcjRjA4MDgwJywga2hha2k6ICcjRjBFNjhDJywgYWxpY2VibHVlOiAnI0YwRjhGRicsIGhvbmV5ZGV3OiAnI0YwRkZGMCcsIGF6dXJlOiAnI0YwRkZGRicsIHNhbmR5YnJvd246ICcjRjRBNDYwJywgd2hlYXQ6ICcjRjVERUIzJywgYmVpZ2U6ICcjRjVGNURDJywgd2hpdGVzbW9rZTogJyNGNUY1RjUnLCBtaW50Y3JlYW06ICcjRjVGRkZBJywgZ2hvc3R3aGl0ZTogJyNGOEY4RkYnLCBzYWxtb246ICcjRkE4MDcyJywgYW50aXF1ZXdoaXRlOiAnI0ZBRUJENycsIGxpbmVuOiAnI0ZBRjBFNicsIGxpZ2h0Z29sZGVucm9keWVsbG93OiAnI0ZBRkFEMicsIG9sZGxhY2U6ICcjRkRGNUU2JywgcmVkOiAnI0ZGMDAwMCcsIGZ1Y2hzaWE6ICcjRkYwMEZGJywgbWFnZW50YTogJyNGRjAwRkYnLCBkZWVwcGluazogJyNGRjE0OTMnLCBvcmFuZ2VyZWQ6ICcjRkY0NTAwJywgdG9tYXRvOiAnI0ZGNjM0NycsIGhvdHBpbms6ICcjRkY2OUI0JywgY29yYWw6ICcjRkY3RjUwJywgZGFya29yYW5nZTogJyNGRjhDMDAnLCBsaWdodHNhbG1vbjogJyNGRkEwN0EnLCBvcmFuZ2U6ICcjRkZBNTAwJywgbGlnaHRwaW5rOiAnI0ZGQjZDMScsIHBpbms6ICcjRkZDMENCJywgZ29sZDogJyNGRkQ3MDAnLCBwZWFjaHB1ZmY6ICcjRkZEQUI5JywgbmF2YWpvd2hpdGU6ICcjRkZERUFEJywgbW9jY2FzaW46ICcjRkZFNEI1JywgYmlzcXVlOiAnI0ZGRTRDNCcsIG1pc3R5cm9zZTogJyNGRkU0RTEnLCBibGFuY2hlZGFsbW9uZDogJyNGRkVCQ0QnLCBwYXBheWF3aGlwOiAnI0ZGRUZENScsIGxhdmVuZGVyYmx1c2g6ICcjRkZGMEY1Jywgc2Vhc2hlbGw6ICcjRkZGNUVFJywgY29ybnNpbGs6ICcjRkZGOERDJywgbGVtb25jaGlmZm9uOiAnI0ZGRkFDRCcsIGZsb3JhbHdoaXRlOiAnI0ZGRkFGMCcsIHNub3c6ICcjRkZGQUZBJywgeWVsbG93OiAnI0ZGRkYwMCcsIGxpZ2h0eWVsbG93OiAnI0ZGRkZFMCcsIGl2b3J5OiAnI0ZGRkZGMCcsIHdoaXRlOiAnI0ZGRkZGRid9O1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGl4ZWxSYXRpbz0xXVxuICovXG5jbGFzcyBDb2xvclBpY2tlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge251bWJlcn0gW3BpeGVsUmF0aW89MV1cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBpeGVsUmF0aW8gPSAxKSB7XG4gICAgdGhpcy5waXhlbFJhdGlvID0gcGl4ZWxSYXRpbztcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMgPSB7eDoyODkvMiwgeToyODkvMn07XG4gICAgdGhpcy5yID0gMjg5ICogMC40OTtcbiAgICB0aGlzLmNvbG9yID0ge3I6MjU1LGc6MjU1LGI6MjU1LGE6MS4wfTtcbiAgICB0aGlzLmh1ZUNpcmNsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmluaXRpYWxDb2xvciA9IHtyOjI1NSxnOjI1NSxiOjI1NSxhOjEuMH07XG4gICAgdGhpcy5wcmV2aW91c0NvbG9yPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5hcHBsaWVkID0gZmFsc2U7XG5cbiAgICAvLyBib3VuZCBieVxuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgPSAoKSA9PiB7fTtcbiAgICB0aGlzLmNsb3NlQ2FsbGJhY2sgPSAoKSA9PiB7fTtcblxuICAgIC8vIGNyZWF0ZSBhbGwgRE9NIGVsZW1lbnRzXG4gICAgdGhpcy5fY3JlYXRlKCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiB0aGlzIGluc2VydHMgdGhlIGNvbG9yUGlja2VyIGludG8gYSBkaXYgZnJvbSB0aGUgRE9NXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gY29udGFpbmVyXG4gICAqL1xuICBpbnNlcnRUbyhjb250YWluZXIpIHtcbiAgICBpZiAodGhpcy5oYW1tZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5oYW1tZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5oYW1tZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xuICAgIHRoaXMuX2JpbmRIYW1tZXIoKTtcblxuICAgIHRoaXMuX3NldFNpemUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiB0aGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQgb24gYXBwbHkgYW5kIHNhdmUuIEJpbmQgaXQgdG8gdGhlIGFwcGxpY2F0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBzZXRVcGRhdGVDYWxsYmFjayhjYWxsYmFjaykge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIHVwZGF0ZSBjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbi5cIik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBvbiBhcHBseSBhbmQgc2F2ZS4gQmluZCBpdCB0byB0aGUgYXBwbGljYXRpb25cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIHNldENsb3NlQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmNsb3NlQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGdW5jdGlvbiBhdHRlbXB0ZWQgdG8gc2V0IGFzIGNvbG9yUGlja2VyIGNsb3NpbmcgY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24uXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29sb3JcbiAgICogQHJldHVybnMge1N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9pc0NvbG9yU3RyaW5nKGNvbG9yKSB7XG4gICAgaWYgKHR5cGVvZiBjb2xvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBodG1sQ29sb3JzW2NvbG9yXTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbG9yIG9mIHRoZSBjb2xvclBpY2tlclxuICAgKiBTdXBwb3J0ZWQgZm9ybWF0czpcbiAgICogJ3JlZCcgICAgICAgICAgICAgICAgICAgLS0+IEhUTUwgY29sb3Igc3RyaW5nXG4gICAqICcjZmZmZmZmJyAgICAgICAgICAgICAgIC0tPiBoZXggc3RyaW5nXG4gICAqICdyZ2IoMjU1LDI1NSwyNTUpJyAgICAgIC0tPiByZ2Igc3RyaW5nXG4gICAqICdyZ2JhKDI1NSwyNTUsMjU1LDEuMCknIC0tPiByZ2JhIHN0cmluZ1xuICAgKiB7cjoyNTUsZzoyNTUsYjoyNTV9ICAgICAtLT4gcmdiIG9iamVjdFxuICAgKiB7cjoyNTUsZzoyNTUsYjoyNTUsYToxLjB9IC0tPiByZ2JhIG9iamVjdFxuICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGNvbG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NldEluaXRpYWw9dHJ1ZV1cbiAgICovXG4gIHNldENvbG9yKGNvbG9yLCBzZXRJbml0aWFsID0gdHJ1ZSkge1xuICAgIGlmIChjb2xvciA9PT0gJ25vbmUnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJnYmE7XG5cbiAgICAvLyBpZiBhIGh0bWwgY29sb3Igc2hvcnRoYW5kIGlzIHVzZWQsIGNvbnZlcnQgdG8gaGV4XG4gICAgdmFyIGh0bWxDb2xvciA9IHRoaXMuX2lzQ29sb3JTdHJpbmcoY29sb3IpO1xuICAgIGlmIChodG1sQ29sb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29sb3IgPSBodG1sQ29sb3I7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9ybWF0XG4gICAgaWYgKHV0aWwuaXNTdHJpbmcoY29sb3IpID09PSB0cnVlKSB7XG4gICAgICBpZiAodXRpbC5pc1ZhbGlkUkdCKGNvbG9yKSA9PT0gdHJ1ZSkge1xuICAgICAgICBsZXQgcmdiYUFycmF5ID0gY29sb3Iuc3Vic3RyKDQpLnN1YnN0cigwLCBjb2xvci5sZW5ndGggLSA1KS5zcGxpdCgnLCcpO1xuICAgICAgICByZ2JhID0ge3I6cmdiYUFycmF5WzBdLCBnOnJnYmFBcnJheVsxXSwgYjpyZ2JhQXJyYXlbMl0sIGE6MS4wfTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHV0aWwuaXNWYWxpZFJHQkEoY29sb3IpID09PSB0cnVlKSB7XG4gICAgICAgIGxldCByZ2JhQXJyYXkgPSBjb2xvci5zdWJzdHIoNSkuc3Vic3RyKDAsIGNvbG9yLmxlbmd0aCAtIDYpLnNwbGl0KCcsJyk7XG4gICAgICAgIHJnYmEgPSB7cjpyZ2JhQXJyYXlbMF0sIGc6cmdiYUFycmF5WzFdLCBiOnJnYmFBcnJheVsyXSwgYTpyZ2JhQXJyYXlbM119O1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodXRpbC5pc1ZhbGlkSGV4KGNvbG9yKSA9PT0gdHJ1ZSkge1xuICAgICAgICBsZXQgcmdiT2JqID0gdXRpbC5oZXhUb1JHQihjb2xvcik7XG4gICAgICAgIHJnYmEgPSB7cjpyZ2JPYmouciwgZzpyZ2JPYmouZywgYjpyZ2JPYmouYiwgYToxLjB9O1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjb2xvciBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICBpZiAoY29sb3IuciAhPT0gdW5kZWZpbmVkICYmIGNvbG9yLmcgIT09IHVuZGVmaW5lZCAmJiBjb2xvci5iICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsZXQgYWxwaGEgPSBjb2xvci5hICE9PSB1bmRlZmluZWQgPyBjb2xvci5hIDogJzEuMCc7XG4gICAgICAgICAgcmdiYSA9IHtyOmNvbG9yLnIsIGc6Y29sb3IuZywgYjpjb2xvci5iLCBhOmFscGhhfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCBjb2xvclxuICAgIGlmIChyZ2JhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gY29sb3IgcGFzc2VkIHRvIHRoZSBjb2xvclBpY2tlci4gU3VwcG9ydGVkIGFyZSBzdHJpbmdzOiByZ2IsIGhleCwgcmdiYS4gT2JqZWN0OiByZ2IgKHtyOnIsZzpnLGI6YixbYTphXX0pLiBTdXBwbGllZDogXCIgKyBKU09OLnN0cmluZ2lmeShjb2xvcikpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuX3NldENvbG9yKHJnYmEsIHNldEluaXRpYWwpO1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIHRoaXMgc2hvd3MgdGhlIGNvbG9yIHBpY2tlci5cbiAgICogVGhlIGh1ZSBjaXJjbGUgaXMgY29uc3RydWN0ZWQgb25jZSBhbmQgc3RvcmVkLlxuICAgKi9cbiAgc2hvdygpIHtcbiAgICBpZiAodGhpcy5jbG9zZUNhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY2xvc2VDYWxsYmFjaygpO1xuICAgICAgdGhpcy5jbG9zZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuYXBwbGllZCA9IGZhbHNlO1xuICAgIHRoaXMuZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgdGhpcy5fZ2VuZXJhdGVIdWVDaXJjbGUoKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQUklWQVRFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIEhpZGUgdGhlIHBpY2tlci4gSXMgY2FsbGVkIGJ5IHRoZSBjYW5jZWwgYnV0dG9uLlxuICAgKiBPcHRpb25hbCBib29sZWFuIHRvIHN0b3JlIHRoZSBwcmV2aW91cyBjb2xvciBmb3IgZWFzeSBhY2Nlc3MgbGF0ZXIgb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0b3JlUHJldmlvdXM9dHJ1ZV1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9oaWRlKHN0b3JlUHJldmlvdXMgPSB0cnVlKSB7XG4gICAgLy8gc3RvcmUgdGhlIHByZXZpb3VzIGNvbG9yIGZvciBuZXh0IHRpbWU7XG4gICAgaWYgKHN0b3JlUHJldmlvdXMgPT09IHRydWUpIHtcbiAgICAgIHRoaXMucHJldmlvdXNDb2xvciA9IHV0aWwuZXh0ZW5kKHt9LCB0aGlzLmNvbG9yKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5hcHBsaWVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuaW5pdGlhbENvbG9yKTtcbiAgICB9XG5cbiAgICB0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBjYWxsIHRoZSBjbG9zaW5nIGNhbGxiYWNrLCByZXN0b3JpbmcgdGhlIG9uY2xpY2sgbWV0aG9kLlxuICAgIC8vIHRoaXMgaXMgaW4gYSBzZXRUaW1lb3V0IGJlY2F1c2UgaXQgd2lsbCB0cmlnZ2VyIHRoZSBzaG93IGFnYWluIGJlZm9yZSB0aGUgY2xpY2sgaXMgZG9uZS5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNsb3NlQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNsb3NlQ2FsbGJhY2soKTtcbiAgICAgICAgdGhpcy5jbG9zZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sMCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBib3VuZCB0byB0aGUgc2F2ZSBidXR0b24uIFNhdmVzIGFuZCBoaWRlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zYXZlKCkge1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sodGhpcy5jb2xvcik7XG4gICAgdGhpcy5hcHBsaWVkID0gZmFsc2U7XG4gICAgdGhpcy5faGlkZSgpO1xuICB9XG5cblxuICAvKipcbiAgICogQm91bmQgdG8gYXBwbHkgYnV0dG9uLiBTYXZlcyBidXQgZG9lcyBub3QgY2xvc2UuIElzIHVuZG9uZSBieSB0aGUgY2FuY2VsIGJ1dHRvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hcHBseSgpIHtcbiAgICB0aGlzLmFwcGxpZWQgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlQ2FsbGJhY2sodGhpcy5jb2xvcik7XG4gICAgdGhpcy5fdXBkYXRlUGlja2VyKHRoaXMuY29sb3IpO1xuICB9XG5cblxuICAvKipcbiAgICogbG9hZCB0aGUgY29sb3IgZnJvbSB0aGUgcHJldmlvdXMgc2Vzc2lvbi5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9sb2FkTGFzdCgpIHtcbiAgICBpZiAodGhpcy5wcmV2aW91c0NvbG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc2V0Q29sb3IodGhpcy5wcmV2aW91c0NvbG9yLCBmYWxzZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgYWxlcnQoXCJUaGVyZSBpcyBubyBsYXN0IGNvbG9yIHRvIGxvYWQuLi5cIik7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogc2V0IHRoZSBjb2xvciwgcGxhY2UgdGhlIHBpY2tlclxuICAgKiBAcGFyYW0ge09iamVjdH0gcmdiYVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXRJbml0aWFsPXRydWVdXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0Q29sb3IocmdiYSwgc2V0SW5pdGlhbCA9IHRydWUpIHtcbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCBjb2xvclxuICAgIGlmIChzZXRJbml0aWFsID09PSB0cnVlKSB7XG4gICAgICB0aGlzLmluaXRpYWxDb2xvciA9IHV0aWwuZXh0ZW5kKHt9LCByZ2JhKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbG9yID0gcmdiYTtcbiAgICBsZXQgaHN2ID0gdXRpbC5SR0JUb0hTVihyZ2JhLnIsIHJnYmEuZywgcmdiYS5iKTtcblxuICAgIGxldCBhbmdsZUNvbnZlcnQgPSAyICogTWF0aC5QSTtcbiAgICBsZXQgcmFkaXVzID0gdGhpcy5yICogaHN2LnM7XG4gICAgbGV0IHggPSB0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnggKyByYWRpdXMgKiBNYXRoLnNpbihhbmdsZUNvbnZlcnQgKiBoc3YuaCk7XG4gICAgbGV0IHkgPSB0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnkgKyByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZUNvbnZlcnQgKiBoc3YuaCk7XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUubGVmdCA9IHggLSAwLjUgKiB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xpZW50V2lkdGggKyAncHgnO1xuICAgIHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS50b3AgPSB5IC0gMC41ICogdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCArICdweCc7XG5cbiAgICB0aGlzLl91cGRhdGVQaWNrZXIocmdiYSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBib3VuZCB0byBvcGFjaXR5IGNvbnRyb2xcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0T3BhY2l0eSh2YWx1ZSkge1xuICAgIHRoaXMuY29sb3IuYSA9IHZhbHVlIC8gMTAwO1xuICAgIHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGJvdW5kIHRvIGJyaWdodG5lc3MgY29udHJvbFxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRCcmlnaHRuZXNzKHZhbHVlKSB7XG4gICAgbGV0IGhzdiA9IHV0aWwuUkdCVG9IU1YodGhpcy5jb2xvci5yLCB0aGlzLmNvbG9yLmcsIHRoaXMuY29sb3IuYik7XG4gICAgaHN2LnYgPSB2YWx1ZSAvIDEwMDtcbiAgICBsZXQgcmdiYSA9IHV0aWwuSFNWVG9SR0IoaHN2LmgsIGhzdi5zLCBoc3Yudik7XG4gICAgcmdiYVsnYSddID0gdGhpcy5jb2xvci5hO1xuICAgIHRoaXMuY29sb3IgPSByZ2JhO1xuICAgIHRoaXMuX3VwZGF0ZVBpY2tlcigpO1xuICB9XG5cblxuICAvKipcbiAgICogdXBkYXRlIHRoZSBjb2xvciBwaWNrZXIuIEEgYmxhY2sgY2lyY2xlIG92ZXJsYXlzIHRoZSBodWUgY2lyY2xlIHRvIG1pbWljIHRoZSBicmlnaHRuZXNzIGRlY3JlYXNpbmcuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZ2JhXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlUGlja2VyKHJnYmEgPSB0aGlzLmNvbG9yKSB7XG4gICAgbGV0IGhzdiA9IHV0aWwuUkdCVG9IU1YocmdiYS5yLCByZ2JhLmcsIHJnYmEuYik7XG4gICAgbGV0IGN0eCA9IHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAodGhpcy5waXhlbFJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnBpeGVsUmF0aW8gPSAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkgLyAoY3R4LndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgIGN0eC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICBjdHgubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICBjdHgub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgIGN0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDEpO1xuICAgIH1cbiAgICBjdHguc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywgMCwgMCwgdGhpcy5waXhlbFJhdGlvLCAwLCAwKTtcblxuICAgIC8vIGNsZWFyIHRoZSBjYW52YXNcbiAgICBsZXQgdyA9IHRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGg7XG4gICAgbGV0IGggPSB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG4gICAgY3R4LnB1dEltYWdlRGF0YSh0aGlzLmh1ZUNpcmNsZSwgMCwwKTtcbiAgICBjdHguZmlsbFN0eWxlID0gJ3JnYmEoMCwwLDAsJyArICgxLSBoc3YudikgKyAnKSc7XG4gICAgY3R4LmNpcmNsZSh0aGlzLmNlbnRlckNvb3JkaW5hdGVzLngsIHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSwgdGhpcy5yKTtcbiAgICBjdHguZmlsbCgpO1xuXG4gICAgdGhpcy5icmlnaHRuZXNzUmFuZ2UudmFsdWUgPSAxMDAgKiBoc3YudjtcbiAgICB0aGlzLm9wYWNpdHlSYW5nZS52YWx1ZSAgICA9IDEwMCAqIHJnYmEuYTtcblxuICAgIHRoaXMuaW5pdGlhbENvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2JhKCcgKyB0aGlzLmluaXRpYWxDb2xvci5yICsgJywnICsgdGhpcy5pbml0aWFsQ29sb3IuZyArICcsJyArIHRoaXMuaW5pdGlhbENvbG9yLmIgKyAnLCcgKyB0aGlzLmluaXRpYWxDb2xvci5hICsgJyknO1xuICAgIHRoaXMubmV3Q29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3JnYmEoJyArIHRoaXMuY29sb3IuciArICcsJyArIHRoaXMuY29sb3IuZyArICcsJyArIHRoaXMuY29sb3IuYiArICcsJyArIHRoaXMuY29sb3IuYSArICcpJztcbiAgfVxuXG5cbiAgLyoqXG4gICAqIHVzZWQgYnkgY3JlYXRlIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgY2FudmFzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NldFNpemUoKSB7XG4gICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcy5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblxuICAgIHRoaXMuY29sb3JQaWNrZXJDYW52YXMud2lkdGggPSAyODkgKiB0aGlzLnBpeGVsUmF0aW87XG4gICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcy5oZWlnaHQgPSAyODkgKiB0aGlzLnBpeGVsUmF0aW87XG4gIH1cblxuXG4gIC8qKlxuICAgKiBjcmVhdGUgYWxsIGRvbSBlbGVtZW50c1xuICAgKiBUT0RPOiBjbGVhbnVwLCBsb3RzIG9mIHNpbWlsYXIgZG9tIGVsZW1lbnRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY3JlYXRlKCkge1xuICAgIHRoaXMuZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtY29sb3ItcGlja2VyJztcblxuICAgIHRoaXMuY29sb3JQaWNrZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IuY2xhc3NOYW1lID0gJ3Zpcy1zZWxlY3Rvcic7XG4gICAgdGhpcy5jb2xvclBpY2tlckRpdi5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3IpO1xuXG4gICAgdGhpcy5jb2xvclBpY2tlckNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIHRoaXMuY29sb3JQaWNrZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckNhbnZhcyk7XG5cbiAgICBpZiAoIXRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCkge1xuICAgICAgbGV0IG5vQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ0RJVicgKTtcbiAgICAgIG5vQ2FudmFzLnN0eWxlLmNvbG9yID0gJ3JlZCc7XG4gICAgICBub0NhbnZhcy5zdHlsZS5mb250V2VpZ2h0ID0gICdib2xkJyA7XG4gICAgICBub0NhbnZhcy5zdHlsZS5wYWRkaW5nID0gICcxMHB4JztcbiAgICAgIG5vQ2FudmFzLmlubmVySFRNTCA9ICAnRXJyb3I6IHlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IEhUTUwgY2FudmFzJztcbiAgICAgIHRoaXMuY29sb3JQaWNrZXJDYW52YXMuYXBwZW5kQ2hpbGQobm9DYW52YXMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGxldCBjdHggPSB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgICAgIHRoaXMucGl4ZWxSYXRpbyA9ICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSAvIChjdHgud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgY3R4Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgIGN0eC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgIGN0eC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpbyB8fFxuICAgICAgY3R4LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgICB0aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKS5zZXRUcmFuc2Zvcm0odGhpcy5waXhlbFJhdGlvLCAwLCAwLCB0aGlzLnBpeGVsUmF0aW8sIDAsIDApO1xuICAgIH1cblxuICAgIHRoaXMuY29sb3JQaWNrZXJEaXYuY2xhc3NOYW1lID0gJ3Zpcy1jb2xvcic7XG5cbiAgICB0aGlzLm9wYWNpdHlEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLm9wYWNpdHlEaXYuY2xhc3NOYW1lID0gJ3Zpcy1vcGFjaXR5JztcblxuICAgIHRoaXMuYnJpZ2h0bmVzc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuYnJpZ2h0bmVzc0Rpdi5jbGFzc05hbWUgPSAndmlzLWJyaWdodG5lc3MnO1xuXG4gICAgdGhpcy5hcnJvd0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuYXJyb3dEaXYuY2xhc3NOYW1lID0gJ3Zpcy1hcnJvdyc7XG5cbiAgICB0aGlzLm9wYWNpdHlSYW5nZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub3BhY2l0eVJhbmdlLnR5cGUgPSAncmFuZ2UnOyAvLyBOb3Qgc3VwcG9ydGVkIG9uIElFOVxuICAgICAgdGhpcy5vcGFjaXR5UmFuZ2UubWluID0gJzAnO1xuICAgICAgdGhpcy5vcGFjaXR5UmFuZ2UubWF4ID0gJzEwMCc7XG4gICAgfVxuICAgIC8vIFRPRE86IEFkZCBzb21lIGVycm9yIGhhbmRsaW5nIGFuZCByZW1vdmUgdGhpcyBsaW50IGV4Y2VwdGlvblxuICAgIGNhdGNoIChlcnIpIHt9ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5XG4gICAgdGhpcy5vcGFjaXR5UmFuZ2UudmFsdWUgPSAnMTAwJztcbiAgICB0aGlzLm9wYWNpdHlSYW5nZS5jbGFzc05hbWUgPSAndmlzLXJhbmdlJztcblxuICAgIHRoaXMuYnJpZ2h0bmVzc1JhbmdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5icmlnaHRuZXNzUmFuZ2UudHlwZSA9ICdyYW5nZSc7IC8vIE5vdCBzdXBwb3J0ZWQgb24gSUU5XG4gICAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5taW4gPSAnMCc7XG4gICAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5tYXggPSAnMTAwJztcbiAgICB9XG4gICAgLy8gVE9ETzogQWRkIHNvbWUgZXJyb3IgaGFuZGxpbmcgYW5kIHJlbW92ZSB0aGlzIGxpbnQgZXhjZXB0aW9uXG4gICAgY2F0Y2ggKGVycikge30gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS52YWx1ZSA9ICcxMDAnO1xuICAgIHRoaXMuYnJpZ2h0bmVzc1JhbmdlLmNsYXNzTmFtZSA9ICd2aXMtcmFuZ2UnO1xuXG4gICAgdGhpcy5vcGFjaXR5RGl2LmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eVJhbmdlKTtcbiAgICB0aGlzLmJyaWdodG5lc3NEaXYuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzUmFuZ2UpO1xuXG4gICAgdmFyIG1lID0gdGhpcztcbiAgICB0aGlzLm9wYWNpdHlSYW5nZS5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHttZS5fc2V0T3BhY2l0eSh0aGlzLnZhbHVlKTt9O1xuICAgIHRoaXMub3BhY2l0eVJhbmdlLm9uaW5wdXQgID0gZnVuY3Rpb24gKCkge21lLl9zZXRPcGFjaXR5KHRoaXMudmFsdWUpO307XG4gICAgdGhpcy5icmlnaHRuZXNzUmFuZ2Uub25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7bWUuX3NldEJyaWdodG5lc3ModGhpcy52YWx1ZSk7fTtcbiAgICB0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmlucHV0ICA9IGZ1bmN0aW9uICgpIHttZS5fc2V0QnJpZ2h0bmVzcyh0aGlzLnZhbHVlKTt9O1xuXG4gICAgdGhpcy5icmlnaHRuZXNzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmNsYXNzTmFtZSA9IFwidmlzLWxhYmVsIHZpcy1icmlnaHRuZXNzXCI7XG4gICAgdGhpcy5icmlnaHRuZXNzTGFiZWwuaW5uZXJIVE1MID0gJ2JyaWdodG5lc3M6JztcblxuICAgIHRoaXMub3BhY2l0eUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLm9wYWNpdHlMYWJlbC5jbGFzc05hbWUgPSBcInZpcy1sYWJlbCB2aXMtb3BhY2l0eVwiO1xuICAgIHRoaXMub3BhY2l0eUxhYmVsLmlubmVySFRNTCA9ICdvcGFjaXR5Oic7XG5cbiAgICB0aGlzLm5ld0NvbG9yRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLm5ld0NvbG9yRGl2LmNsYXNzTmFtZSA9IFwidmlzLW5ldy1jb2xvclwiO1xuICAgIHRoaXMubmV3Q29sb3JEaXYuaW5uZXJIVE1MID0gJ25ldyc7XG5cbiAgICB0aGlzLmluaXRpYWxDb2xvckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5pbml0aWFsQ29sb3JEaXYuY2xhc3NOYW1lID0gXCJ2aXMtaW5pdGlhbC1jb2xvclwiO1xuICAgIHRoaXMuaW5pdGlhbENvbG9yRGl2LmlubmVySFRNTCA9ICdpbml0aWFsJztcblxuICAgIHRoaXMuY2FuY2VsQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmNhbmNlbEJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1idXR0b24gdmlzLWNhbmNlbFwiO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uLmlubmVySFRNTCA9ICdjYW5jZWwnO1xuICAgIHRoaXMuY2FuY2VsQnV0dG9uLm9uY2xpY2sgPSB0aGlzLl9oaWRlLmJpbmQodGhpcywgZmFsc2UpO1xuXG4gICAgdGhpcy5hcHBseUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5hcHBseUJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1idXR0b24gdmlzLWFwcGx5XCI7XG4gICAgdGhpcy5hcHBseUJ1dHRvbi5pbm5lckhUTUwgPSAnYXBwbHknO1xuICAgIHRoaXMuYXBwbHlCdXR0b24ub25jbGljayA9IHRoaXMuX2FwcGx5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnNhdmVCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRoaXMuc2F2ZUJ1dHRvbi5jbGFzc05hbWUgPSBcInZpcy1idXR0b24gdmlzLXNhdmVcIjtcbiAgICB0aGlzLnNhdmVCdXR0b24uaW5uZXJIVE1MID0gJ3NhdmUnO1xuICAgIHRoaXMuc2F2ZUJ1dHRvbi5vbmNsaWNrID0gdGhpcy5fc2F2ZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5sb2FkQnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmxvYWRCdXR0b24uY2xhc3NOYW1lID0gXCJ2aXMtYnV0dG9uIHZpcy1sb2FkXCI7XG4gICAgdGhpcy5sb2FkQnV0dG9uLmlubmVySFRNTCA9ICdsb2FkIGxhc3QnO1xuICAgIHRoaXMubG9hZEJ1dHRvbi5vbmNsaWNrID0gdGhpcy5fbG9hZExhc3QuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckRpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmFycm93RGl2KTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0xhYmVsKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYnJpZ2h0bmVzc0Rpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlMYWJlbCk7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm9wYWNpdHlEaXYpO1xuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uZXdDb2xvckRpdik7XG4gICAgdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmluaXRpYWxDb2xvckRpdik7XG5cbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuY2FuY2VsQnV0dG9uKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXBwbHlCdXR0b24pO1xuICAgIHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zYXZlQnV0dG9uKTtcbiAgICB0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubG9hZEJ1dHRvbik7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBiaW5kIGhhbW1lciB0byB0aGUgY29sb3IgcGlja2VyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYmluZEhhbW1lcigpIHtcbiAgICB0aGlzLmRyYWcgPSB7fTtcbiAgICB0aGlzLnBpbmNoID0ge307XG4gICAgdGhpcy5oYW1tZXIgPSBuZXcgSGFtbWVyKHRoaXMuY29sb3JQaWNrZXJDYW52YXMpO1xuICAgIHRoaXMuaGFtbWVyLmdldCgncGluY2gnKS5zZXQoe2VuYWJsZTogdHJ1ZX0pO1xuXG4gICAgb25Ub3VjaCh0aGlzLmhhbW1lciwgKGV2ZW50KSA9PiB7dGhpcy5fbW92ZVNlbGVjdG9yKGV2ZW50KTt9KTtcbiAgICB0aGlzLmhhbW1lci5vbigndGFwJywgICAgICAgKGV2ZW50KSA9PiB7dGhpcy5fbW92ZVNlbGVjdG9yKGV2ZW50KTt9KTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFuc3RhcnQnLCAgKGV2ZW50KSA9PiB7dGhpcy5fbW92ZVNlbGVjdG9yKGV2ZW50KTt9KTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFubW92ZScsICAgKGV2ZW50KSA9PiB7dGhpcy5fbW92ZVNlbGVjdG9yKGV2ZW50KTt9KTtcbiAgICB0aGlzLmhhbW1lci5vbigncGFuZW5kJywgICAgKGV2ZW50KSA9PiB7dGhpcy5fbW92ZVNlbGVjdG9yKGV2ZW50KTt9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGdlbmVyYXRlIHRoZSBodWUgY2lyY2xlLiBUaGlzIGlzIHJlbGF0aXZlbHkgaGVhdnkgKDIwMG1zKSBhbmQgaXMgZG9uZSBvbmx5IG9uY2Ugb24gdGhlIGZpcnN0IHRpbWUgaXQgaXMgc2hvd24uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2VuZXJhdGVIdWVDaXJjbGUoKSB7XG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkID09PSBmYWxzZSkge1xuICAgICAgbGV0IGN0eCA9IHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgIGlmICh0aGlzLnBpeGVsUmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5waXhlbFJhdGlvID0gKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpIC8gKGN0eC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgIGN0eC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgIGN0eC5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW8gfHxcbiAgICAgICAgY3R4Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8XG4gICAgICAgIGN0eC5iYWNraW5nU3RvcmVQaXhlbFJhdGlvIHx8IDEpO1xuICAgICAgfVxuICAgICAgY3R4LnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sIDAsIDAsIHRoaXMucGl4ZWxSYXRpbywgMCwgMCk7XG5cbiAgICAgIC8vIGNsZWFyIHRoZSBjYW52YXNcbiAgICAgIGxldCB3ID0gdGhpcy5jb2xvclBpY2tlckNhbnZhcy5jbGllbnRXaWR0aDtcbiAgICAgIGxldCBoID0gdGhpcy5jb2xvclBpY2tlckNhbnZhcy5jbGllbnRIZWlnaHQ7XG4gICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG5cbiAgICAgIC8vIGRyYXcgaHVlIGNpcmNsZVxuICAgICAgbGV0IHgsIHksIGh1ZSwgc2F0O1xuICAgICAgdGhpcy5jZW50ZXJDb29yZGluYXRlcyA9IHt4OiB3ICogMC41LCB5OiBoICogMC41fTtcbiAgICAgIHRoaXMuciA9IDAuNDkgKiB3O1xuICAgICAgbGV0IGFuZ2xlQ29udmVydCA9ICgyICogTWF0aC5QSSkgLyAzNjA7XG4gICAgICBsZXQgaGZhYyA9IDEgLyAzNjA7XG4gICAgICBsZXQgc2ZhYyA9IDEgLyB0aGlzLnI7XG4gICAgICBsZXQgcmdiO1xuICAgICAgZm9yIChodWUgPSAwOyBodWUgPCAzNjA7IGh1ZSsrKSB7XG4gICAgICAgIGZvciAoc2F0ID0gMDsgc2F0IDwgdGhpcy5yOyBzYXQrKykge1xuICAgICAgICAgIHggPSB0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnggKyBzYXQgKiBNYXRoLnNpbihhbmdsZUNvbnZlcnQgKiBodWUpO1xuICAgICAgICAgIHkgPSB0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnkgKyBzYXQgKiBNYXRoLmNvcyhhbmdsZUNvbnZlcnQgKiBodWUpO1xuICAgICAgICAgIHJnYiA9IHV0aWwuSFNWVG9SR0IoaHVlICogaGZhYywgc2F0ICogc2ZhYywgMSk7XG4gICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICdyZ2IoJyArIHJnYi5yICsgJywnICsgcmdiLmcgKyAnLCcgKyByZ2IuYiArICcpJztcbiAgICAgICAgICBjdHguZmlsbFJlY3QoeCAtIDAuNSwgeSAtIDAuNSwgMiwgMik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICdyZ2JhKDAsMCwwLDEpJztcbiAgICAgIGN0eC5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LCB0aGlzLmNlbnRlckNvb3JkaW5hdGVzLnksIHRoaXMucik7XG4gICAgICBjdHguc3Ryb2tlKCk7XG5cbiAgICAgIHRoaXMuaHVlQ2lyY2xlID0gY3R4LmdldEltYWdlRGF0YSgwLDAsdyxoKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lcmF0ZWQgPSB0cnVlO1xuICB9XG5cblxuICAvKipcbiAgICogbW92ZSB0aGUgc2VsZWN0b3IuIFRoaXMgaXMgY2FsbGVkIGJ5IGhhbW1lciBmdW5jdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnR9ICBldmVudCAgIFRoZSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21vdmVTZWxlY3RvcihldmVudCkge1xuICAgIGxldCByZWN0ID0gdGhpcy5jb2xvclBpY2tlckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBsZXQgbGVmdCA9IGV2ZW50LmNlbnRlci54IC0gcmVjdC5sZWZ0O1xuICAgIGxldCB0b3AgPSBldmVudC5jZW50ZXIueSAtIHJlY3QudG9wO1xuXG4gICAgbGV0IGNlbnRlclkgPSAwLjUgKiB0aGlzLmNvbG9yUGlja2VyRGl2LmNsaWVudEhlaWdodDtcbiAgICBsZXQgY2VudGVyWCA9IDAuNSAqIHRoaXMuY29sb3JQaWNrZXJEaXYuY2xpZW50V2lkdGg7XG5cbiAgICBsZXQgeCA9IGxlZnQgLSBjZW50ZXJYO1xuICAgIGxldCB5ID0gdG9wIC0gY2VudGVyWTtcblxuICAgIGxldCBhbmdsZSA9IE1hdGguYXRhbjIoeCx5KTtcbiAgICBsZXQgcmFkaXVzID0gMC45OCAqIE1hdGgubWluKE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwgY2VudGVyWCk7XG5cbiAgICBsZXQgbmV3VG9wID0gTWF0aC5jb3MoYW5nbGUpICogcmFkaXVzICsgY2VudGVyWTtcbiAgICBsZXQgbmV3TGVmdCA9IE1hdGguc2luKGFuZ2xlKSAqIHJhZGl1cyArIGNlbnRlclg7XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUudG9wID0gbmV3VG9wIC0gMC41ICogdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCArICdweCc7XG4gICAgdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLmxlZnQgPSBuZXdMZWZ0IC0gMC41ICogdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoICsgJ3B4JztcblxuICAgIC8vIHNldCBjb2xvclxuICAgIGxldCBoID0gYW5nbGUgLyAoMiAqIE1hdGguUEkpO1xuICAgIGggPSBoIDwgMCA/IGggKyAxIDogaDtcbiAgICBsZXQgcyA9IHJhZGl1cyAvIHRoaXMucjtcbiAgICBsZXQgaHN2ID0gdXRpbC5SR0JUb0hTVih0aGlzLmNvbG9yLnIsIHRoaXMuY29sb3IuZywgdGhpcy5jb2xvci5iKTtcbiAgICBoc3YuaCA9IGg7XG4gICAgaHN2LnMgPSBzO1xuICAgIGxldCByZ2JhID0gdXRpbC5IU1ZUb1JHQihoc3YuaCwgaHN2LnMsIGhzdi52KTtcbiAgICByZ2JhWydhJ10gPSB0aGlzLmNvbG9yLmE7XG4gICAgdGhpcy5jb2xvciA9IHJnYmE7XG5cbiAgICAvLyB1cGRhdGUgcHJldmlld3NcbiAgICB0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiYSgnICsgdGhpcy5pbml0aWFsQ29sb3IuciArICcsJyArIHRoaXMuaW5pdGlhbENvbG9yLmcgKyAnLCcgKyB0aGlzLmluaXRpYWxDb2xvci5iICsgJywnICsgdGhpcy5pbml0aWFsQ29sb3IuYSArICcpJztcbiAgICB0aGlzLm5ld0NvbG9yRGl2LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICdyZ2JhKCcgKyB0aGlzLmNvbG9yLnIgKyAnLCcgKyB0aGlzLmNvbG9yLmcgKyAnLCcgKyB0aGlzLmNvbG9yLmIgKyAnLCcgKyB0aGlzLmNvbG9yLmEgKyAnKSc7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgd2F5IHRoaXMgd29ya3MgaXMgZm9yIGFsbCBwcm9wZXJ0aWVzIG9mIHRoaXMucG9zc2libGUgb3B0aW9ucywgeW91IGNhbiBzdXBwbHkgdGhlIHByb3BlcnR5IG5hbWUgaW4gYW55IGZvcm0gdG8gbGlzdCB0aGUgb3B0aW9ucy5cbiAqIEJvb2xlYW4gb3B0aW9ucyBhcmUgcmVjb2duaXNlZCBhcyBCb29sZWFuXG4gKiBOdW1iZXIgb3B0aW9ucyBzaG91bGQgYmUgd3JpdHRlbiBhcyBhcnJheTogW2RlZmF1bHQgdmFsdWUsIG1pbiB2YWx1ZSwgbWF4IHZhbHVlLCBzdGVwc2l6ZV1cbiAqIENvbG9ycyBzaG91bGQgYmUgd3JpdHRlbiBhcyBhcnJheTogWydjb2xvcicsICcjZmZmZmZmJ11cbiAqIFN0cmluZ3Mgd2l0aCBzaG91bGQgYmUgd3JpdHRlbiBhcyBhcnJheTogW29wdGlvbjEsIG9wdGlvbjIsIG9wdGlvbjMsIC4uXVxuICpcbiAqIFRoZSBvcHRpb25zIGFyZSBtYXRjaGVkIHdpdGggdGhlaXIgY291bnRlcnBhcnRzIGluIGVhY2ggb2YgdGhlIG1vZHVsZXMgYW5kIHRoZSB2YWx1ZXMgdXNlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBhcmVcbiAqL1xuY2xhc3MgQ29uZmlndXJhdG9yIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJlbnRNb2R1bGUgICAgICAgIHwgdGhlIGxvY2F0aW9uIHdoZXJlIHBhcmVudE1vZHVsZS5zZXRPcHRpb25zKCkgY2FuIGJlIGNhbGxlZFxuICAgKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbnRhaW5lciAgICB8IHRoZSBkZWZhdWx0IGNvbnRhaW5lciBvZiB0aGUgbW9kdWxlXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWd1cmVPcHRpb25zICAgIHwgdGhlIGZ1bGx5IGNvbmZpZ3VyZWQgYW5kIHByZWRlZmluZWQgb3B0aW9ucyBzZXQgZm91bmQgaW4gYWxsT3B0aW9ucy5qc1xuICAgKiBAcGFyYW0ge251bWJlcn0gcGl4ZWxSYXRpbyAgICAgICAgICB8IGNhbnZhcyBwaXhlbCByYXRpb1xuICAgKi9cbiAgY29uc3RydWN0b3IocGFyZW50TW9kdWxlLCBkZWZhdWx0Q29udGFpbmVyLCBjb25maWd1cmVPcHRpb25zLCBwaXhlbFJhdGlvID0gMSkge1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50TW9kdWxlO1xuICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLmNvbnRhaW5lciA9IGRlZmF1bHRDb250YWluZXI7XG4gICAgdGhpcy5hbGxvd0NyZWF0aW9uID0gZmFsc2U7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgdGhpcy5wb3B1cENvdW50ZXIgPSAwO1xuICAgIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIGZpbHRlcjogdHJ1ZSxcbiAgICAgIGNvbnRhaW5lcjogdW5kZWZpbmVkLFxuICAgICAgc2hvd0J1dHRvbjogdHJ1ZVxuICAgIH07XG4gICAgdXRpbC5leHRlbmQodGhpcy5vcHRpb25zLCB0aGlzLmRlZmF1bHRPcHRpb25zKTtcblxuICAgIHRoaXMuY29uZmlndXJlT3B0aW9ucyA9IGNvbmZpZ3VyZU9wdGlvbnM7XG4gICAgdGhpcy5tb2R1bGVPcHRpb25zID0ge307XG4gICAgdGhpcy5kb21FbGVtZW50cyA9IFtdO1xuICAgIHRoaXMucG9wdXBEaXYgPSB7fTtcbiAgICB0aGlzLnBvcHVwTGltaXQgPSA1O1xuICAgIHRoaXMucG9wdXBIaXN0b3J5ID0ge307XG4gICAgdGhpcy5jb2xvclBpY2tlciA9IG5ldyBDb2xvclBpY2tlcihwaXhlbFJhdGlvKTtcbiAgICB0aGlzLndyYXBwZXIgPSB1bmRlZmluZWQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiByZWZyZXNoIGFsbCBvcHRpb25zLlxuICAgKiBCZWNhdXNlIGFsbCBtb2R1bGVzIHBhcnNlIHRoZWlyIG9wdGlvbnMgYnkgdGhlbXNlbHZlcywgd2UganVzdCB1c2UgdGhlaXIgb3B0aW9ucy4gV2UgY29weSB0aGVtIGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gICAqL1xuICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyByZXNldCB0aGUgcG9wdXAgaGlzdG9yeSBiZWNhdXNlIHRoZSBpbmRpY2VzIG1heSBoYXZlIGJlZW4gY2hhbmdlZC5cbiAgICAgIHRoaXMucG9wdXBIaXN0b3J5ID0ge307XG4gICAgICB0aGlzLl9yZW1vdmVQb3B1cCgpO1xuXG4gICAgICBsZXQgZW5hYmxlZCA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5maWx0ZXIgPSBvcHRpb25zO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZmlsdGVyID0gb3B0aW9ucy5qb2luKCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbnMgY2Fubm90IGJlIG51bGwnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5jb250YWluZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5jb250YWluZXIgPSBvcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5maWx0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5maWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5zaG93QnV0dG9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuc2hvd0J1dHRvbiA9IG9wdGlvbnMuc2hvd0J1dHRvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBlbmFibGVkID0gb3B0aW9ucy5lbmFibGVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5maWx0ZXIgPSB0cnVlO1xuICAgICAgICBlbmFibGVkID0gb3B0aW9ucztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5maWx0ZXIgPSBvcHRpb25zO1xuICAgICAgICBlbmFibGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZmlsdGVyID09PSBmYWxzZSkge1xuICAgICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMub3B0aW9ucy5lbmFibGVkID0gZW5hYmxlZDtcbiAgICB9XG4gICAgdGhpcy5fY2xlYW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gbW9kdWxlT3B0aW9uc1xuICAgKi9cbiAgc2V0TW9kdWxlT3B0aW9ucyhtb2R1bGVPcHRpb25zKSB7XG4gICAgdGhpcy5tb2R1bGVPcHRpb25zID0gbW9kdWxlT3B0aW9ucztcbiAgICBpZiAodGhpcy5vcHRpb25zLmVuYWJsZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuX2NsZWFuKCk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhaW5lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmNvbnRhaW5lcjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NyZWF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYWxsIERPTSBlbGVtZW50c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZSgpIHtcbiAgICB0aGlzLl9jbGVhbigpO1xuICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMgPSBbXTtcblxuICAgIGxldCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZmlsdGVyO1xuICAgIGxldCBjb3VudGVyID0gMDtcbiAgICBsZXQgc2hvdyA9IGZhbHNlO1xuICAgIGZvciAobGV0IG9wdGlvbiBpbiB0aGlzLmNvbmZpZ3VyZU9wdGlvbnMpIHtcbiAgICAgIGlmICh0aGlzLmNvbmZpZ3VyZU9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkge1xuICAgICAgICB0aGlzLmFsbG93Q3JlYXRpb24gPSBmYWxzZTtcbiAgICAgICAgc2hvdyA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNob3cgPSBmaWx0ZXIob3B0aW9uLFtdKTtcbiAgICAgICAgICBzaG93ID0gc2hvdyB8fCB0aGlzLl9oYW5kbGVPYmplY3QodGhpcy5jb25maWd1cmVPcHRpb25zW29wdGlvbl0sIFtvcHRpb25dLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWx0ZXIgPT09IHRydWUgfHwgZmlsdGVyLmluZGV4T2Yob3B0aW9uKSAhPT0gLTEpIHtcbiAgICAgICAgICBzaG93ID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaG93ICE9PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuYWxsb3dDcmVhdGlvbiA9IHRydWU7XG5cbiAgICAgICAgICAvLyBsaW5lYnJlYWsgYmV0d2VlbiBjYXRlZ29yaWVzXG4gICAgICAgICAgaWYgKGNvdW50ZXIgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlSXRlbShbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGEgaGVhZGVyIGZvciB0aGUgY2F0ZWdvcnlcbiAgICAgICAgICB0aGlzLl9tYWtlSGVhZGVyKG9wdGlvbik7XG5cbiAgICAgICAgICAvLyBnZXQgdGhlIHN1YiBvcHRpb25zXG4gICAgICAgICAgdGhpcy5faGFuZGxlT2JqZWN0KHRoaXMuY29uZmlndXJlT3B0aW9uc1tvcHRpb25dLCBbb3B0aW9uXSk7XG4gICAgICAgIH1cbiAgICAgICAgY291bnRlcisrO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9tYWtlQnV0dG9uKCk7XG4gICAgdGhpcy5fcHVzaCgpO1xuICAgIC8vfiB0aGlzLmNvbG9yUGlja2VyLmluc2VydFRvKHRoaXMuY29udGFpbmVyKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGRyYXcgYWxsIERPTSBlbGVtZW50cyBvbiB0aGUgc2NyZWVuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHVzaCgpIHtcbiAgICB0aGlzLndyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLndyYXBwZXIuY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uLXdyYXBwZXInO1xuICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMud3JhcHBlcik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndyYXBwZXIuYXBwZW5kQ2hpbGQodGhpcy5kb21FbGVtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2hvd1BvcHVwSWZOZWVkZWQoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIGRlbGV0ZSBhbGwgRE9NIGVsZW1lbnRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2xlYW4oKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndyYXBwZXIucmVtb3ZlQ2hpbGQodGhpcy5kb21FbGVtZW50c1tpXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMud3JhcHBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLndyYXBwZXIpO1xuICAgICAgdGhpcy53cmFwcGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmRvbUVsZW1lbnRzID0gW107XG5cbiAgICB0aGlzLl9yZW1vdmVQb3B1cCgpO1xuICB9XG5cblxuICAvKipcbiAgICogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBhY3R1YWxPcHRpb25zIGlmIGl0IGV4aXN0c1xuICAgKiBAcGFyYW0ge2FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0VmFsdWUocGF0aCkge1xuICAgIGxldCBiYXNlID0gdGhpcy5tb2R1bGVPcHRpb25zO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGJhc2VbcGF0aFtpXV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBiYXNlID0gYmFzZVtwYXRoW2ldXTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBiYXNlID0gdW5kZWZpbmVkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJhc2U7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBhbGwgb3B0aW9uIGVsZW1lbnRzIGFyZSB3cmFwcGVkIGluIGFuIGl0ZW1cbiAgICogQHBhcmFtIHtBcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXkuPEVsZW1lbnQ+fSBkb21FbGVtZW50c1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VJdGVtKHBhdGgsIC4uLmRvbUVsZW1lbnRzKSB7XG4gICAgaWYgKHRoaXMuYWxsb3dDcmVhdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgbGV0IGl0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGl0ZW0uY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctaXRlbSB2aXMtY29uZmlnLXMnICsgcGF0aC5sZW5ndGg7XG4gICAgICBkb21FbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgIGl0ZW0uYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudHMucHVzaChpdGVtKTtcbiAgICAgIHJldHVybiB0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBoZWFkZXIgZm9yIG1ham9yIHN1YmplY3RzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFrZUhlYWRlcihuYW1lKSB7XG4gICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1oZWFkZXInO1xuICAgIGRpdi5pbm5lckhUTUwgPSB1dGlsLnhzcyhuYW1lKTtcbiAgICB0aGlzLl9tYWtlSXRlbShbXSxkaXYpO1xuICB9XG5cblxuICAvKipcbiAgICogbWFrZSBhIGxhYmVsLCBpZiBpdCBpcyBhbiBvYmplY3QgbGFiZWwsIGl0IGdldHMgZGlmZmVyZW50IHN0eWxpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gb2JqZWN0TGFiZWxcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VMYWJlbChuYW1lLCBwYXRoLCBvYmplY3RMYWJlbCA9IGZhbHNlKSB7XG4gICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRpdi5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1sYWJlbCB2aXMtY29uZmlnLXMnICsgcGF0aC5sZW5ndGg7XG4gICAgaWYgKG9iamVjdExhYmVsID09PSB0cnVlKSB7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gdXRpbC54c3MoJzxpPjxiPicgKyBuYW1lICsgJzo8L2I+PC9pPicpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSB1dGlsLnhzcyhuYW1lICsgJzonKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpdjtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIG1ha2UgYSBkcm9wZG93biBsaXN0IGZvciBtdWx0aXBsZSBwb3NzaWJsZSBzdHJpbmcgb3B0b2luc1xuICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBhcnJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VEcm9wZG93bihhcnIsIHZhbHVlLCBwYXRoKSB7XG4gICAgbGV0IHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICAgIHNlbGVjdC5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1zZWxlY3QnO1xuICAgIGxldCBzZWxlY3RlZFZhbHVlID0gMDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGFyci5pbmRleE9mKHZhbHVlKSAhPT0gLTEpIHtcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZSA9IGFyci5pbmRleE9mKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0aW9uLnZhbHVlID0gYXJyW2ldO1xuICAgICAgaWYgKGkgPT09IHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uLnNlbGVjdGVkID0gJ3NlbGVjdGVkJztcbiAgICAgIH1cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBhcnJbaV07XG4gICAgICBzZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG5cbiAgICBsZXQgbWUgPSB0aGlzO1xuICAgIHNlbGVjdC5vbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHttZS5fdXBkYXRlKHRoaXMudmFsdWUsIHBhdGgpO307XG5cbiAgICBsZXQgbGFiZWwgPSB0aGlzLl9tYWtlTGFiZWwocGF0aFtwYXRoLmxlbmd0aC0xXSwgcGF0aCk7XG4gICAgdGhpcy5fbWFrZUl0ZW0ocGF0aCwgbGFiZWwsIHNlbGVjdCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBtYWtlIGEgcmFuZ2Ugb2JqZWN0IGZvciBudW1lcmljIG9wdGlvbnNcbiAgICogQHBhcmFtIHtBcnJheS48bnVtYmVyPn0gYXJyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlUmFuZ2UoYXJyLCB2YWx1ZSwgcGF0aCkge1xuICAgIGxldCBkZWZhdWx0VmFsdWUgPSBhcnJbMF07XG4gICAgbGV0IG1pbiA9IGFyclsxXTtcbiAgICBsZXQgbWF4ID0gYXJyWzJdO1xuICAgIGxldCBzdGVwID0gYXJyWzNdO1xuICAgIGxldCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgcmFuZ2UuY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctcmFuZ2UnO1xuICAgIHRyeSB7XG4gICAgICByYW5nZS50eXBlID0gJ3JhbmdlJzsgLy8gbm90IHN1cHBvcnRlZCBvbiBJRTlcbiAgICAgIHJhbmdlLm1pbiA9IG1pbjtcbiAgICAgIHJhbmdlLm1heCA9IG1heDtcbiAgICB9XG4gICAgLy8gVE9ETzogQWRkIHNvbWUgZXJyb3IgaGFuZGxpbmcgYW5kIHJlbW92ZSB0aGlzIGxpbnQgZXhjZXB0aW9uXG4gICAgY2F0Y2ggKGVycikge30gIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbiAgICByYW5nZS5zdGVwID0gc3RlcDtcblxuICAgIC8vIHNldCB1cCB0aGUgcG9wdXAgc2V0dGluZ3MgaW4gY2FzZSB0aGV5IGFyZSBuZWVkZWQuXG4gICAgbGV0IHBvcHVwU3RyaW5nID0gJyc7XG4gICAgbGV0IHBvcHVwVmFsdWUgPSAwO1xuXG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBmYWN0b3IgPSAxLjIwO1xuICAgICAgaWYgKHZhbHVlIDwgMCAmJiB2YWx1ZSAqIGZhY3RvciA8IG1pbikge1xuICAgICAgICByYW5nZS5taW4gPSBNYXRoLmNlaWwodmFsdWUgKiBmYWN0b3IpO1xuICAgICAgICBwb3B1cFZhbHVlID0gcmFuZ2UubWluO1xuICAgICAgICBwb3B1cFN0cmluZyA9ICdyYW5nZSBpbmNyZWFzZWQnO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodmFsdWUgLyBmYWN0b3IgPCBtaW4pIHtcbiAgICAgICAgcmFuZ2UubWluID0gTWF0aC5jZWlsKHZhbHVlIC8gZmFjdG9yKTtcbiAgICAgICAgcG9wdXBWYWx1ZSA9IHJhbmdlLm1pbjtcbiAgICAgICAgcG9wdXBTdHJpbmcgPSAncmFuZ2UgaW5jcmVhc2VkJztcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZSAqIGZhY3RvciA+IG1heCAmJiBtYXggIT09IDEpIHtcbiAgICAgICAgcmFuZ2UubWF4ID0gTWF0aC5jZWlsKHZhbHVlICogZmFjdG9yKTtcbiAgICAgICAgcG9wdXBWYWx1ZSA9IHJhbmdlLm1heDtcbiAgICAgICAgcG9wdXBTdHJpbmcgPSAncmFuZ2UgaW5jcmVhc2VkJztcbiAgICAgIH1cbiAgICAgIHJhbmdlLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmFuZ2UudmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBpbnB1dC5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1yYW5nZWlucHV0JztcbiAgICBpbnB1dC52YWx1ZSA9IE51bWJlcihyYW5nZS52YWx1ZSk7XG5cbiAgICB2YXIgbWUgPSB0aGlzO1xuICAgIHJhbmdlLm9uY2hhbmdlID0gZnVuY3Rpb24gKCkge2lucHV0LnZhbHVlID0gdGhpcy52YWx1ZTsgbWUuX3VwZGF0ZShOdW1iZXIodGhpcy52YWx1ZSksIHBhdGgpO307XG4gICAgcmFuZ2Uub25pbnB1dCAgPSBmdW5jdGlvbiAoKSB7aW5wdXQudmFsdWUgPSB0aGlzLnZhbHVlOyB9O1xuXG4gICAgbGV0IGxhYmVsID0gdGhpcy5fbWFrZUxhYmVsKHBhdGhbcGF0aC5sZW5ndGgtMV0sIHBhdGgpO1xuICAgIGxldCBpdGVtSW5kZXggPSB0aGlzLl9tYWtlSXRlbShwYXRoLCBsYWJlbCwgcmFuZ2UsIGlucHV0KTtcblxuICAgIC8vIGlmIGEgcG9wdXAgaXMgbmVlZGVkIEFORCBpdCBoYXMgbm90IGJlZW4gc2hvd24gZm9yIHRoaXMgdmFsdWUsIHNob3cgaXQuXG4gICAgaWYgKHBvcHVwU3RyaW5nICE9PSAnJyAmJiB0aGlzLnBvcHVwSGlzdG9yeVtpdGVtSW5kZXhdICE9PSBwb3B1cFZhbHVlKSB7XG4gICAgICB0aGlzLnBvcHVwSGlzdG9yeVtpdGVtSW5kZXhdID0gcG9wdXBWYWx1ZTtcbiAgICAgIHRoaXMuX3NldHVwUG9wdXAocG9wdXBTdHJpbmcsIGl0ZW1JbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIG1ha2UgYSBidXR0b24gb2JqZWN0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFrZUJ1dHRvbigpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLnNob3dCdXR0b24gPT09IHRydWUpIHtcbiAgICAgIGxldCBnZW5lcmF0ZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZ2VuZXJhdGVCdXR0b24uY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctYnV0dG9uJztcbiAgICAgIGdlbmVyYXRlQnV0dG9uLmlubmVySFRNTCA9ICdnZW5lcmF0ZSBvcHRpb25zJztcbiAgICAgIGdlbmVyYXRlQnV0dG9uLm9uY2xpY2sgPSAgICAgKCkgPT4ge3RoaXMuX3ByaW50T3B0aW9ucygpO307XG4gICAgICBnZW5lcmF0ZUJ1dHRvbi5vbm1vdXNlb3ZlciA9ICgpID0+IHtnZW5lcmF0ZUJ1dHRvbi5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24gaG92ZXInO307XG4gICAgICBnZW5lcmF0ZUJ1dHRvbi5vbm1vdXNlb3V0ID0gICgpID0+IHtnZW5lcmF0ZUJ1dHRvbi5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24nO307XG5cbiAgICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5vcHRpb25zQ29udGFpbmVyLmNsYXNzTmFtZSA9ICd2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLW9wdGlvbi1jb250YWluZXInO1xuXG4gICAgICB0aGlzLmRvbUVsZW1lbnRzLnB1c2godGhpcy5vcHRpb25zQ29udGFpbmVyKTtcbiAgICAgIHRoaXMuZG9tRWxlbWVudHMucHVzaChnZW5lcmF0ZUJ1dHRvbik7XG4gICAgfVxuICB9XG5cblxuICAvKipcbiAgICogcHJlcGFyZSB0aGUgcG9wdXBcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXR1cFBvcHVwKHN0cmluZywgaW5kZXgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSAmJiB0aGlzLmFsbG93Q3JlYXRpb24gPT09IHRydWUgJiYgdGhpcy5wb3B1cENvdW50ZXIgPCB0aGlzLnBvcHVwTGltaXQpIHtcbiAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZGl2LmlkID0gXCJ2aXMtY29uZmlndXJhdGlvbi1wb3B1cFwiO1xuICAgICAgZGl2LmNsYXNzTmFtZSA9IFwidmlzLWNvbmZpZ3VyYXRpb24tcG9wdXBcIjtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSB1dGlsLnhzcyhzdHJpbmcpO1xuICAgICAgZGl2Lm9uY2xpY2sgPSAoKSA9PiB7dGhpcy5fcmVtb3ZlUG9wdXAoKTt9O1xuICAgICAgdGhpcy5wb3B1cENvdW50ZXIgKz0gMTtcbiAgICAgIHRoaXMucG9wdXBEaXYgPSB7aHRtbDpkaXYsIGluZGV4OmluZGV4fTtcbiAgICB9XG4gIH1cblxuXG4gIC8qKlxuICAgKiByZW1vdmUgdGhlIHBvcHVwIGZyb20gdGhlIGRvbVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlbW92ZVBvcHVwKCkge1xuICAgIGlmICh0aGlzLnBvcHVwRGl2Lmh0bWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5wb3B1cERpdi5odG1sLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3B1cERpdi5odG1sKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBvcHVwRGl2LmhpZGVUaW1lb3V0KTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnBvcHVwRGl2LmRlbGV0ZVRpbWVvdXQpO1xuICAgICAgdGhpcy5wb3B1cERpdiA9IHt9O1xuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIHBvcHVwIGlmIGl0IGlzIG5lZWRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zaG93UG9wdXBJZk5lZWRlZCgpIHtcbiAgICBpZiAodGhpcy5wb3B1cERpdi5odG1sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxldCBjb3JyZXNwb25kaW5nRWxlbWVudCA9IHRoaXMuZG9tRWxlbWVudHNbdGhpcy5wb3B1cERpdi5pbmRleF07XG4gICAgICBsZXQgcmVjdCA9IGNvcnJlc3BvbmRpbmdFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLmxlZnQgPSByZWN0LmxlZnQgKyBcInB4XCI7XG4gICAgICB0aGlzLnBvcHVwRGl2Lmh0bWwuc3R5bGUudG9wID0gcmVjdC50b3AgLSAzMCArIFwicHhcIjsgLy8gMzAgaXMgdGhlIGhlaWdodDtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5wb3B1cERpdi5odG1sKTtcbiAgICAgIHRoaXMucG9wdXBEaXYuaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLm9wYWNpdHkgPSAwO1xuICAgICAgfSwxNTAwKTtcbiAgICAgIHRoaXMucG9wdXBEaXYuZGVsZXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9yZW1vdmVQb3B1cCgpO1xuICAgICAgfSwxODAwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogbWFrZSBhIGNoZWNrYm94IGZvciBib29sZWFuIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWZhdWx0VmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VDaGVja2JveChkZWZhdWx0VmFsdWUsIHZhbHVlLCBwYXRoKSB7XG4gICAgdmFyIGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAndmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1jaGVja2JveCc7XG4gICAgY2hlY2tib3guY2hlY2tlZCA9IGRlZmF1bHRWYWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHZhbHVlO1xuICAgICAgaWYgKHZhbHVlICE9PSBkZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSBkZWZhdWx0VmFsdWUuZW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOnBhdGgsIHZhbHVlOnZhbHVlfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDpwYXRoLCB2YWx1ZTp2YWx1ZX0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1lID0gdGhpcztcbiAgICBjaGVja2JveC5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkge21lLl91cGRhdGUodGhpcy5jaGVja2VkLCBwYXRoKTt9O1xuXG4gICAgbGV0IGxhYmVsID0gdGhpcy5fbWFrZUxhYmVsKHBhdGhbcGF0aC5sZW5ndGgtMV0sIHBhdGgpO1xuICAgIHRoaXMuX21ha2VJdGVtKHBhdGgsIGxhYmVsLCBjaGVja2JveCk7XG4gIH1cblxuICAvKipcbiAgICogbWFrZSBhIHRleHQgaW5wdXQgZmllbGQgZm9yIHN0cmluZyBvcHRpb25zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVmYXVsdFZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcGFyYW0ge2FycmF5fSBwYXRoICAgIHwgd2hlcmUgdG8gbG9vayBmb3IgdGhlIGFjdHVhbCBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYWtlVGV4dElucHV0KGRlZmF1bHRWYWx1ZSwgdmFsdWUsIHBhdGgpIHtcbiAgICB2YXIgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAndGV4dCc7XG4gICAgY2hlY2tib3guY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctdGV4dCc7XG4gICAgY2hlY2tib3gudmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgIT09IGRlZmF1bHRWYWx1ZSkge1xuICAgICAgdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOnBhdGgsIHZhbHVlOnZhbHVlfSk7XG4gICAgfVxuXG4gICAgbGV0IG1lID0gdGhpcztcbiAgICBjaGVja2JveC5vbmNoYW5nZSA9IGZ1bmN0aW9uKCkge21lLl91cGRhdGUodGhpcy52YWx1ZSwgcGF0aCk7fTtcblxuICAgIGxldCBsYWJlbCA9IHRoaXMuX21ha2VMYWJlbChwYXRoW3BhdGgubGVuZ3RoLTFdLCBwYXRoKTtcbiAgICB0aGlzLl9tYWtlSXRlbShwYXRoLCBsYWJlbCwgY2hlY2tib3gpO1xuICB9XG5cblxuICAvKipcbiAgICogbWFrZSBhIGNvbG9yIGZpZWxkIHdpdGggYSBjb2xvciBwaWNrZXIgZm9yIGNvbG9yIGZpZWxkc1xuICAgKiBAcGFyYW0ge0FycmF5LjxudW1iZXI+fSBhcnJcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX21ha2VDb2xvckZpZWxkKGFyciwgdmFsdWUsIHBhdGgpIHtcbiAgICBsZXQgZGVmYXVsdENvbG9yID0gYXJyWzFdO1xuICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSB1bmRlZmluZWQgPyBkZWZhdWx0Q29sb3IgOiB2YWx1ZTtcblxuICAgIGlmICh2YWx1ZSAhPT0gJ25vbmUnKSB7XG4gICAgICBkaXYuY2xhc3NOYW1lID0gJ3Zpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY29sb3JCbG9jayc7XG4gICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgZGl2LmNsYXNzTmFtZSA9ICd2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWNvbG9yQmxvY2sgbm9uZSc7XG4gICAgfVxuXG4gICAgdmFsdWUgPSB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdENvbG9yIDogdmFsdWU7XG4gICAgZGl2Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9zaG93Q29sb3JQaWNrZXIodmFsdWUsZGl2LHBhdGgpO1xuICAgIH07XG5cbiAgICBsZXQgbGFiZWwgPSB0aGlzLl9tYWtlTGFiZWwocGF0aFtwYXRoLmxlbmd0aC0xXSwgcGF0aCk7XG4gICAgdGhpcy5fbWFrZUl0ZW0ocGF0aCxsYWJlbCwgZGl2KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIHVzZWQgYnkgdGhlIGNvbG9yIGJ1dHRvbnMgdG8gY2FsbCB0aGUgY29sb3IgcGlja2VyLlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZGl2XG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Nob3dDb2xvclBpY2tlcih2YWx1ZSwgZGl2LCBwYXRoKSB7XG4gICAgLy8gY2xlYXIgdGhlIGNhbGxiYWNrIGZyb20gdGhpcyBkaXZcbiAgICBkaXYub25jbGljayA9IGZ1bmN0aW9uKCkge307XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyLmluc2VydFRvKGRpdik7XG4gICAgdGhpcy5jb2xvclBpY2tlci5zaG93KCk7XG5cbiAgICB0aGlzLmNvbG9yUGlja2VyLnNldENvbG9yKHZhbHVlKTtcbiAgICB0aGlzLmNvbG9yUGlja2VyLnNldFVwZGF0ZUNhbGxiYWNrKChjb2xvcikgPT4ge1xuICAgICAgbGV0IGNvbG9yU3RyaW5nID0gJ3JnYmEoJyArIGNvbG9yLnIgKyAnLCcgKyBjb2xvci5nICsgJywnICsgY29sb3IuYiArICcsJyArIGNvbG9yLmEgKyAnKSc7XG4gICAgICBkaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gY29sb3JTdHJpbmc7XG4gICAgICB0aGlzLl91cGRhdGUoY29sb3JTdHJpbmcscGF0aCk7XG4gICAgfSk7XG5cbiAgICAvLyBvbiBjbG9zZSBvZiB0aGUgY29sb3JwaWNrZXIsIHJlc3RvcmUgdGhlIGNhbGxiYWNrLlxuICAgIHRoaXMuY29sb3JQaWNrZXIuc2V0Q2xvc2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICBkaXYub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5fc2hvd0NvbG9yUGlja2VyKHZhbHVlLGRpdixwYXRoKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBwYXJzZSBhbiBvYmplY3QgYW5kIGRyYXcgdGhlIGNvcnJlY3QgaXRlbXNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9ialxuICAgKiBAcGFyYW0ge2FycmF5fSBbcGF0aD1bXV0gICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjaGVja09ubHk9ZmFsc2VdXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhbmRsZU9iamVjdChvYmosIHBhdGggPSBbXSwgY2hlY2tPbmx5ID0gZmFsc2UpIHtcbiAgICBsZXQgc2hvdyA9IGZhbHNlO1xuICAgIGxldCBmaWx0ZXIgPSB0aGlzLm9wdGlvbnMuZmlsdGVyO1xuICAgIGxldCB2aXNpYmxlSW5TZXQgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBzdWJPYmogaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHN1Yk9iaikpIHtcbiAgICAgICAgc2hvdyA9IHRydWU7XG4gICAgICAgIGxldCBpdGVtID0gb2JqW3N1Yk9ial07XG4gICAgICAgIGxldCBuZXdQYXRoID0gdXRpbC5jb3B5QW5kRXh0ZW5kQXJyYXkocGF0aCwgc3ViT2JqKTtcbiAgICAgICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzaG93ID0gZmlsdGVyKHN1Yk9iaixwYXRoKTtcblxuICAgICAgICAgIC8vIGlmIG5lZWRlZCB3ZSBtdXN0IGdvIGRlZXBlciBpbnRvIHRoZSBvYmplY3QuXG4gICAgICAgICAgaWYgKHNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbSkgJiYgdHlwZW9mIGl0ZW0gIT09ICdzdHJpbmcnICYmIHR5cGVvZiBpdGVtICE9PSAnYm9vbGVhbicgJiYgaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICB0aGlzLmFsbG93Q3JlYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgc2hvdyA9IHRoaXMuX2hhbmRsZU9iamVjdChpdGVtLCBuZXdQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgICAgdGhpcy5hbGxvd0NyZWF0aW9uID0gY2hlY2tPbmx5ID09PSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB2aXNpYmxlSW5TZXQgPSB0cnVlO1xuICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuX2dldFZhbHVlKG5ld1BhdGgpO1xuXG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2hhbmRsZUFycmF5KGl0ZW0sIHZhbHVlLCBuZXdQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLl9tYWtlVGV4dElucHV0KGl0ZW0sIHZhbHVlLCBuZXdQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGl0ZW0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhpcy5fbWFrZUNoZWNrYm94KGl0ZW0sIHZhbHVlLCBuZXdQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgLy8gY29sbGFwc2UgdGhlIHBoeXNpY3Mgb3B0aW9ucyB0aGF0IGFyZSBub3QgZW5hYmxlZFxuICAgICAgICAgICAgbGV0IGRyYXcgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZigncGh5c2ljcycpICE9PSAtMSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5tb2R1bGVPcHRpb25zLnBoeXNpY3Muc29sdmVyICE9PSBzdWJPYmopIHtcbiAgICAgICAgICAgICAgICBkcmF3ID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRyYXcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgLy8gaW5pdGlhbGx5IGNvbGxhcHNlIG9wdGlvbnMgd2l0aCBhbiBkaXNhYmxlZCBlbmFibGVkIG9wdGlvbi5cbiAgICAgICAgICAgICAgaWYgKGl0ZW0uZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVuYWJsZWRQYXRoID0gdXRpbC5jb3B5QW5kRXh0ZW5kQXJyYXkobmV3UGF0aCwgJ2VuYWJsZWQnKTtcbiAgICAgICAgICAgICAgICBsZXQgZW5hYmxlZFZhbHVlID0gdGhpcy5fZ2V0VmFsdWUoZW5hYmxlZFBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChlbmFibGVkVmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IHRoaXMuX21ha2VMYWJlbChzdWJPYmosIG5ld1BhdGgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgdGhpcy5fbWFrZUl0ZW0obmV3UGF0aCwgbGFiZWwpO1xuICAgICAgICAgICAgICAgICAgdmlzaWJsZUluU2V0ID0gdGhpcy5faGFuZGxlT2JqZWN0KGl0ZW0sIG5ld1BhdGgpIHx8IHZpc2libGVJblNldDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLl9tYWtlQ2hlY2tib3goaXRlbSwgZW5hYmxlZFZhbHVlLCBuZXdQYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gdGhpcy5fbWFrZUxhYmVsKHN1Yk9iaiwgbmV3UGF0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFrZUl0ZW0obmV3UGF0aCwgbGFiZWwpO1xuICAgICAgICAgICAgICAgIHZpc2libGVJblNldCA9IHRoaXMuX2hhbmRsZU9iamVjdChpdGVtLCBuZXdQYXRoKSB8fCB2aXNpYmxlSW5TZXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdkb250IGtub3cgaG93IHRvIGhhbmRsZScsIGl0ZW0sIHN1Yk9iaiwgbmV3UGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2aXNpYmxlSW5TZXQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBoYW5kbGUgdGhlIGFycmF5IHR5cGUgb2Ygb3B0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXkuPG51bWJlcj59IGFyclxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAgICogQHBhcmFtIHthcnJheX0gcGF0aCAgICB8IHdoZXJlIHRvIGxvb2sgZm9yIHRoZSBhY3R1YWwgb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlQXJyYXkoYXJyLCB2YWx1ZSwgcGF0aCkge1xuICAgIGlmICh0eXBlb2YgYXJyWzBdID09PSAnc3RyaW5nJyAmJiBhcnJbMF0gPT09ICdjb2xvcicpIHtcbiAgICAgIHRoaXMuX21ha2VDb2xvckZpZWxkKGFyciwgdmFsdWUsIHBhdGgpO1xuICAgICAgaWYgKGFyclsxXSAhPT0gdmFsdWUpIHt0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2goe3BhdGg6cGF0aCwgdmFsdWU6dmFsdWV9KTt9XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBhcnJbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9tYWtlRHJvcGRvd24oYXJyLCB2YWx1ZSwgcGF0aCk7XG4gICAgICBpZiAoYXJyWzBdICE9PSB2YWx1ZSkge3RoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDpwYXRoLCB2YWx1ZTp2YWx1ZX0pO31cbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIGFyclswXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuX21ha2VSYW5nZShhcnIsIHZhbHVlLCBwYXRoKTtcbiAgICAgIGlmIChhcnJbMF0gIT09IHZhbHVlKSB7dGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOnBhdGgsIHZhbHVlOk51bWJlcih2YWx1ZSl9KTt9XG4gICAgfVxuICB9XG5cblxuXG4gIC8qKlxuICAgKiBjYWxsZWQgdG8gdXBkYXRlIHRoZSBuZXR3b3JrIHdpdGggdGhlIG5ldyBzZXR0aW5ncy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEBwYXJhbSB7YXJyYXl9IHBhdGggICAgfCB3aGVyZSB0byBsb29rIGZvciB0aGUgYWN0dWFsIG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZSh2YWx1ZSwgcGF0aCkge1xuICAgIGxldCBvcHRpb25zID0gdGhpcy5fY29uc3RydWN0T3B0aW9ucyh2YWx1ZSxwYXRoKTtcblxuICAgIGlmICh0aGlzLnBhcmVudC5ib2R5ICYmIHRoaXMucGFyZW50LmJvZHkuZW1pdHRlciAmJiB0aGlzLnBhcmVudC5ib2R5LmVtaXR0ZXIuZW1pdCkge1xuICAgICAgdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXQoXCJjb25maWdDaGFuZ2VcIiwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHRoaXMucGFyZW50LnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ3xCb29sZWFufSB2YWx1ZVxuICAgKiBAcGFyYW0ge0FycmF5LjxzdHJpbmc+fSBwYXRoXG4gICAqIEBwYXJhbSB7e319IG9wdGlvbnNPYmpcbiAgICogQHJldHVybnMge3t9fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbnN0cnVjdE9wdGlvbnModmFsdWUsIHBhdGgsIG9wdGlvbnNPYmogPSB7fSkge1xuICAgIGxldCBwb2ludGVyID0gb3B0aW9uc09iajtcblxuICAgIC8vIHdoZW4gZHJvcGRvd24gYm94ZXMgY2FuIGJlIHN0cmluZyBvciBib29sZWFuLCB3ZSB0eXBlY2FzdCBpdCBpbnRvIGNvcnJlY3QgdHlwZXNcbiAgICB2YWx1ZSA9IHZhbHVlID09PSAndHJ1ZScgID8gdHJ1ZSAgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IHZhbHVlID09PSAnZmFsc2UnID8gZmFsc2UgOiB2YWx1ZTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdGhbaV0gIT09ICdnbG9iYWwnKSB7XG4gICAgICAgIGlmIChwb2ludGVyW3BhdGhbaV1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBwb2ludGVyW3BhdGhbaV1dID0ge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgIT09IHBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHBvaW50ZXIgPSBwb2ludGVyW3BhdGhbaV1dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHBvaW50ZXJbcGF0aFtpXV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3B0aW9uc09iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3ByaW50T3B0aW9ucygpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgIHRoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHByZT52YXIgb3B0aW9ucyA9ICcgKyBKU09OLnN0cmluZ2lmeShvcHRpb25zLCBudWxsLCAyKSArICc8L3ByZT4nO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHt7fX0gb3B0aW9uc1xuICAgKi9cbiAgZ2V0T3B0aW9ucygpIHtcbiAgICBsZXQgb3B0aW9ucyA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGFuZ2VkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fY29uc3RydWN0T3B0aW9ucyh0aGlzLmNoYW5nZWRPcHRpb25zW2ldLnZhbHVlLCB0aGlzLmNoYW5nZWRPcHRpb25zW2ldLnBhdGgsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIHRpbWVsaW5lIHZpc3VhbGl6YXRpb25cbiAqIEBleHRlbmRzIENvcmVcbiAqL1xuY2xhc3MgVGltZWxpbmUgZXh0ZW5kcyBDb3JlIHtcbiAgLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjb250YWluZXJcbiAqIEBwYXJhbSB7dmlzLkRhdGFTZXQgfCB2aXMuRGF0YVZpZXcgfCBBcnJheX0gW2l0ZW1zXVxuICogQHBhcmFtIHt2aXMuRGF0YVNldCB8IHZpcy5EYXRhVmlldyB8IEFycmF5fSBbZ3JvdXBzXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgU2VlIFRpbWVsaW5lLnNldE9wdGlvbnMgZm9yIHRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEBjb25zdHJ1Y3RvciBUaW1lbGluZVxuICovXG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgaXRlbXMsIGdyb3Vwcywgb3B0aW9ucykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5pbml0VGltZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5pdGVtc0RvbmUgPSBmYWxzZTtcblxuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBUaW1lbGluZSkpIHtcbiAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQ29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yJyk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIHRoaXJkIGVsZW1lbnQgaXMgb3B0aW9ucywgdGhlIGZvcnRoIGlzIGdyb3VwcyAob3B0aW9uYWxseSk7XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheShncm91cHMpIHx8IGlzRGF0YVZpZXdMaWtlKFwiaWRcIiwgZ3JvdXBzKSkgJiYgZ3JvdXBzIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICBjb25zdCBmb3J0aEFyZ3VtZW50ID0gb3B0aW9ucztcbiAgICAgIG9wdGlvbnMgPSBncm91cHM7XG4gICAgICBncm91cHMgPSBmb3J0aEFyZ3VtZW50O1xuICAgIH1cblxuICAgIC8vIFRPRE86IFJFTU9WRSBUSElTIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2VcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FsbWVuZGUvdmlzL2lzc3Vlcy8yNTExXG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50aHJvdHRsZVJlZHJhdykge1xuICAgICAgY29uc29sZS53YXJuKFwiVGltZWxpbmUgb3B0aW9uIFxcXCJ0aHJvdHRsZVJlZHJhd1xcXCIgaXMgREVQUklDQVRFRCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2UuXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgYXV0b1Jlc2l6ZTogdHJ1ZSxcbiAgICAgIGxvbmdTZWxlY3RQcmVzc1RpbWU6IDI1MSxcbiAgICAgIG9yaWVudGF0aW9uOiB7XG4gICAgICAgIGF4aXM6ICdib3R0b20nLCAgIC8vIGF4aXMgb3JpZW50YXRpb246ICdib3R0b20nLCAndG9wJywgb3IgJ2JvdGgnXG4gICAgICAgIGl0ZW06ICdib3R0b20nICAgIC8vIG5vdCByZWxldmFudFxuICAgICAgfSxcbiAgICAgIG1vbWVudCxcbiAgICB9O1xuICAgIHRoaXMub3B0aW9ucyA9IHV0aWwuZGVlcEV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0T3B0aW9ucyk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIERPTSwgcHJvcHMsIGFuZCBlbWl0dGVyXG4gICAgdGhpcy5fY3JlYXRlKGNvbnRhaW5lcik7XG4gICAgaWYgKCFvcHRpb25zIHx8IChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJ0bCA9PSBcInVuZGVmaW5lZFwiKSkge1xuICAgICAgdGhpcy5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICBsZXQgZGlyZWN0aW9uRnJvbURvbTtcbiAgICAgIGxldCBkb21Ob2RlID0gdGhpcy5kb20ucm9vdDtcbiAgICAgIHdoaWxlICghZGlyZWN0aW9uRnJvbURvbSAmJiBkb21Ob2RlKSB7XG4gICAgICAgIGRpcmVjdGlvbkZyb21Eb20gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb21Ob2RlLCBudWxsKS5kaXJlY3Rpb247XG4gICAgICAgIGRvbU5vZGUgPSBkb21Ob2RlLnBhcmVudEVsZW1lbnQ7XG4gICAgICB9XG4gICAgICB0aGlzLm9wdGlvbnMucnRsID0gKGRpcmVjdGlvbkZyb21Eb20gJiYgKGRpcmVjdGlvbkZyb21Eb20udG9Mb3dlckNhc2UoKSA9PSBcInJ0bFwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ydGwgPSBvcHRpb25zLnJ0bDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMucm9sbGluZ01vZGUpIHsgdGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlID0gb3B0aW9ucy5yb2xsaW5nTW9kZTsgfVxuICAgICAgaWYgKG9wdGlvbnMub25Jbml0aWFsRHJhd0NvbXBsZXRlKSB7IHRoaXMub3B0aW9ucy5vbkluaXRpYWxEcmF3Q29tcGxldGUgPSBvcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZTsgfVxuICAgICAgaWYgKG9wdGlvbnMub25UaW1lb3V0KSB7IHRoaXMub3B0aW9ucy5vblRpbWVvdXQgPSBvcHRpb25zLm9uVGltZW91dDsgfVxuICAgICAgaWYgKG9wdGlvbnMubG9hZGluZ1NjcmVlblRlbXBsYXRlKSB7IHRoaXMub3B0aW9ucy5sb2FkaW5nU2NyZWVuVGVtcGxhdGUgPSBvcHRpb25zLmxvYWRpbmdTY3JlZW5UZW1wbGF0ZTsgfVxuICAgIH1cblxuICAgIC8vIFByZXBhcmUgbG9hZGluZyBzY3JlZW5cbiAgICBjb25zdCBsb2FkaW5nU2NyZWVuRnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLmxvYWRpbmdTY3JlZW5UZW1wbGF0ZSkge1xuICAgICAgY29uc3QgdGVtcGxhdGVGdW5jdGlvbiA9IHRoaXMub3B0aW9ucy5sb2FkaW5nU2NyZWVuVGVtcGxhdGUuYmluZCh0aGlzKTtcbiAgICAgIGNvbnN0IGxvYWRpbmdTY3JlZW4gPSB0ZW1wbGF0ZUZ1bmN0aW9uKHRoaXMuZG9tLmxvYWRpbmdTY3JlZW4pO1xuICAgICAgaWYgKChsb2FkaW5nU2NyZWVuIGluc3RhbmNlb2YgT2JqZWN0KSAmJiAhKGxvYWRpbmdTY3JlZW4gaW5zdGFuY2VvZiBFbGVtZW50KSkge1xuICAgICAgICB0ZW1wbGF0ZUZ1bmN0aW9uKGxvYWRpbmdTY3JlZW5GcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobG9hZGluZ1NjcmVlbiBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICBsb2FkaW5nU2NyZWVuRnJhZ21lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgbG9hZGluZ1NjcmVlbkZyYWdtZW50LmFwcGVuZENoaWxkKGxvYWRpbmdTY3JlZW4pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxvYWRpbmdTY3JlZW4gIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbG9hZGluZ1NjcmVlbkZyYWdtZW50LmlubmVySFRNTCA9IHV0aWwueHNzKGxvYWRpbmdTY3JlZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZG9tLmxvYWRpbmdTY3JlZW4uYXBwZW5kQ2hpbGQobG9hZGluZ1NjcmVlbkZyYWdtZW50KTtcblxuICAgIC8vIGFsbCBjb21wb25lbnRzIGxpc3RlZCBoZXJlIHdpbGwgYmUgcmVwYWludGVkIGF1dG9tYXRpY2FsbHlcbiAgICB0aGlzLmNvbXBvbmVudHMgPSBbXTtcblxuICAgIHRoaXMuYm9keSA9IHtcbiAgICAgIGRvbTogdGhpcy5kb20sXG4gICAgICBkb21Qcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGVtaXR0ZXI6IHtcbiAgICAgICAgb246IHRoaXMub24uYmluZCh0aGlzKSxcbiAgICAgICAgb2ZmOiB0aGlzLm9mZi5iaW5kKHRoaXMpLFxuICAgICAgICBlbWl0OiB0aGlzLmVtaXQuYmluZCh0aGlzKVxuICAgICAgfSxcbiAgICAgIGhpZGRlbkRhdGVzOiBbXSxcbiAgICAgIHV0aWw6IHtcbiAgICAgICAgZ2V0U2NhbGUoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lLnRpbWVBeGlzLnN0ZXAuc2NhbGU7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFN0ZXAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lLnRpbWVBeGlzLnN0ZXAuc3RlcDtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1NjcmVlbjogbWUuX3RvU2NyZWVuLmJpbmQobWUpLFxuICAgICAgICB0b0dsb2JhbFNjcmVlbjogbWUuX3RvR2xvYmFsU2NyZWVuLmJpbmQobWUpLCAvLyB0aGlzIHJlZmVycyB0byB0aGUgcm9vdC53aWR0aFxuICAgICAgICB0b1RpbWU6IG1lLl90b1RpbWUuYmluZChtZSksXG4gICAgICAgIHRvR2xvYmFsVGltZSA6IG1lLl90b0dsb2JhbFRpbWUuYmluZChtZSlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gcmFuZ2VcbiAgICB0aGlzLnJhbmdlID0gbmV3IFJhbmdlKHRoaXMuYm9keSwgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLnJhbmdlKTtcbiAgICB0aGlzLmJvZHkucmFuZ2UgPSB0aGlzLnJhbmdlO1xuXG4gICAgLy8gdGltZSBheGlzXG4gICAgdGhpcy50aW1lQXhpcyA9IG5ldyBUaW1lQXhpcyh0aGlzLmJvZHksIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy50aW1lQXhpczIgPSBudWxsOyAvLyB1c2VkIGluIGNhc2Ugb2Ygb3JpZW50YXRpb24gb3B0aW9uICdib3RoJ1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpO1xuXG4gICAgLy8gY3VycmVudCB0aW1lIGJhclxuICAgIHRoaXMuY3VycmVudFRpbWUgPSBuZXcgQ3VycmVudFRpbWUodGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMuY3VycmVudFRpbWUpO1xuXG4gICAgLy8gaXRlbSBzZXRcbiAgICB0aGlzLml0ZW1TZXQgPSBuZXcgSXRlbVNldCh0aGlzLmJvZHksIHRoaXMub3B0aW9ucyk7XG4gICAgdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5pdGVtU2V0KTtcblxuICAgIHRoaXMuaXRlbXNEYXRhID0gbnVsbDsgICAgICAvLyBEYXRhU2V0XG4gICAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDsgICAgIC8vIERhdGFTZXRcblxuICAgIGZ1bmN0aW9uIGVtaXQoZXZlbnROYW1lLCBldmVudCkge1xuICAgICAgaWYgKCFtZS5oYXNMaXN0ZW5lcnMoZXZlbnROYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1lLmVtaXQoZXZlbnROYW1lLCBtZS5nZXRFdmVudFByb3BlcnRpZXMoZXZlbnQpKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvbS5yb290Lm9uY2xpY2sgPSBldmVudCA9PiB7XG4gICAgICBlbWl0KCdjbGljaycsIGV2ZW50KTtcbiAgICB9O1xuICAgIHRoaXMuZG9tLnJvb3Qub25kYmxjbGljayA9IGV2ZW50ID0+IHtcbiAgICAgIGVtaXQoJ2RvdWJsZUNsaWNrJywgZXZlbnQpO1xuICAgIH07XG4gICAgdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51ID0gZXZlbnQgPT4ge1xuICAgICAgZW1pdCgnY29udGV4dG1lbnUnLCBldmVudCk7XG4gICAgfTtcbiAgICB0aGlzLmRvbS5yb290Lm9ubW91c2VvdmVyID0gZXZlbnQgPT4ge1xuICAgICAgZW1pdCgnbW91c2VPdmVyJywgZXZlbnQpO1xuICAgIH07XG4gICAgaWYod2luZG93LlBvaW50ZXJFdmVudCkge1xuICAgICAgdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJkb3duID0gZXZlbnQgPT4ge1xuICAgICAgICBlbWl0KCdtb3VzZURvd24nLCBldmVudCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJtb3ZlID0gZXZlbnQgPT4ge1xuICAgICAgICBlbWl0KCdtb3VzZU1vdmUnLCBldmVudCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJ1cCA9IGV2ZW50ID0+IHtcbiAgICAgICAgZW1pdCgnbW91c2VVcCcsIGV2ZW50KTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9tLnJvb3Qub25tb3VzZW1vdmUgPSBldmVudCA9PiB7XG4gICAgICAgIGVtaXQoJ21vdXNlTW92ZScsIGV2ZW50KTtcbiAgICAgIH07XG4gICAgICB0aGlzLmRvbS5yb290Lm9ubW91c2Vkb3duID0gZXZlbnQgPT4ge1xuICAgICAgICBlbWl0KCdtb3VzZURvd24nLCBldmVudCk7XG4gICAgICB9O1xuICAgICAgdGhpcy5kb20ucm9vdC5vbm1vdXNldXAgPSBldmVudCA9PiB7XG4gICAgICAgIGVtaXQoJ21vdXNlVXAnLCBldmVudCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vU2luZ2xlIHRpbWUgYXV0b3NjYWxlL2ZpdFxuICAgIHRoaXMuaW5pdGlhbEZpdERvbmUgPSBmYWxzZTtcbiAgICB0aGlzLm9uKCdjaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgaWYgKG1lLml0ZW1zRGF0YSA9PSBudWxsKSByZXR1cm47XG4gICAgICBpZiAoIW1lLmluaXRpYWxGaXREb25lICYmICFtZS5vcHRpb25zLnJvbGxpbmdNb2RlKSB7XG4gICAgICAgIG1lLmluaXRpYWxGaXREb25lID0gdHJ1ZTtcbiAgICAgICAgaWYgKG1lLm9wdGlvbnMuc3RhcnQgIT0gdW5kZWZpbmVkIHx8IG1lLm9wdGlvbnMuZW5kICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChtZS5vcHRpb25zLnN0YXJ0ID09IHVuZGVmaW5lZCB8fCBtZS5vcHRpb25zLmVuZCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHZhciByYW5nZSA9IG1lLmdldEl0ZW1SYW5nZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbWUub3B0aW9ucy5zdGFydCAhPSB1bmRlZmluZWQgPyBtZS5vcHRpb25zLnN0YXJ0IDogcmFuZ2UubWluO1xuICAgICAgICAgIGNvbnN0IGVuZCAgID0gbWUub3B0aW9ucy5lbmQgICAhPSB1bmRlZmluZWQgPyBtZS5vcHRpb25zLmVuZCAgIDogcmFuZ2UubWF4O1xuICAgICAgICAgIG1lLnNldFdpbmRvdyhzdGFydCwgZW5kLCB7YW5pbWF0aW9uOiBmYWxzZX0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1lLmZpdCh7YW5pbWF0aW9uOiBmYWxzZX0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghbWUuaW5pdGlhbERyYXdEb25lICYmIChtZS5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lIHx8ICghbWUub3B0aW9ucy5zdGFydCAmJiAhbWUub3B0aW9ucy5lbmQpIFxuICAgICAgICB8fCBtZS5vcHRpb25zLnJvbGxpbmdNb2RlKSkge1xuICAgICAgICBtZS5pbml0aWFsRHJhd0RvbmUgPSB0cnVlO1xuICAgICAgICBtZS5pdGVtU2V0LmluaXRpYWxEcmF3RG9uZSA9IHRydWU7XG4gICAgICAgIG1lLmRvbS5yb290LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIG1lLmRvbS5sb2FkaW5nU2NyZWVuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobWUuZG9tLmxvYWRpbmdTY3JlZW4pO1xuICAgICAgICBpZiAobWUub3B0aW9ucy5vbkluaXRpYWxEcmF3Q29tcGxldGUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBtZS5vcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZSgpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCdkZXN0cm95VGltZWxpbmUnLCAoKSA9PiB7XG4gICAgICBtZS5kZXN0cm95KCk7XG4gICAgfSk7XG5cbiAgICAvLyBhcHBseSBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmJvZHkuZW1pdHRlci5vbignZml0JywgKGFyZ3MpID0+IHtcbiAgICAgIHRoaXMuX29uRml0KGFyZ3MpO1xuICAgICAgdGhpcy5yZWRyYXcoKTtcbiAgICB9KTtcblxuICAgIC8vIElNUE9SVEFOVDogVEhJUyBIQVBQRU5TIEJFRk9SRSBTRVQgSVRFTVMhXG4gICAgaWYgKGdyb3Vwcykge1xuICAgICAgdGhpcy5zZXRHcm91cHMoZ3JvdXBzKTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgaXRlbXNldFxuICAgIGlmIChpdGVtcykge1xuICAgICAgdGhpcy5zZXRJdGVtcyhpdGVtcyk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICB0aGlzLl9yZWRyYXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGEgY29uZmlndXJhdG9yXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVDb25maWd1cmF0b3IoKSB7XG4gICAgcmV0dXJuIG5ldyBDb25maWd1cmF0b3IodGhpcywgdGhpcy5kb20uY29udGFpbmVyLCBjb25maWd1cmVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhIHJlZHJhdy4gVGhlIHNpemUgb2YgYWxsIGl0ZW1zIHdpbGwgYmUgcmVjYWxjdWxhdGVkLlxuICAgKiBDYW4gYmUgdXNlZnVsIHRvIG1hbnVhbGx5IHJlZHJhdyB3aGVuIG9wdGlvbiBhdXRvUmVzaXplPWZhbHNlIGFuZCB0aGUgd2luZG93XG4gICAqIGhhcyBiZWVuIHJlc2l6ZWQsIG9yIHdoZW4gdGhlIGl0ZW1zIENTUyBoYXMgYmVlbiBjaGFuZ2VkLlxuICAgKlxuICAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBvbiBjb25zdHJ1Y3Rpb24gd2l0aCBhIHRyb3R0bGVkIHZlcnNpb25cbiAgICovXG4gIHJlZHJhdygpIHtcbiAgICB0aGlzLml0ZW1TZXQgJiYgdGhpcy5pdGVtU2V0Lm1hcmtEaXJ0eSh7cmVmcmVzaEl0ZW1zOiB0cnVlfSk7XG4gICAgdGhpcy5fcmVkcmF3KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgZ3JvdXBcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICovXG4gIHNldE9wdGlvbnMob3B0aW9ucykge1xuICAgIC8vIHZhbGlkYXRlIG9wdGlvbnNcbiAgICBsZXQgZXJyb3JGb3VuZCA9IFZhbGlkYXRvci52YWxpZGF0ZShvcHRpb25zLCBhbGxPcHRpb25zJDEpO1xuXG4gICAgaWYgKGVycm9yRm91bmQgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCclY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LicsIHByaW50U3R5bGUpO1xuICAgIH1cblxuICAgIENvcmUucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICAgIGlmICgndHlwZScgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKG9wdGlvbnMudHlwZSAhPT0gdGhpcy5vcHRpb25zLnR5cGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnR5cGUgPSBvcHRpb25zLnR5cGU7XG5cbiAgICAgICAgLy8gZm9yY2UgcmVjcmVhdGlvbiBvZiBhbGwgaXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNEYXRhID0gdGhpcy5pdGVtc0RhdGE7XG4gICAgICAgIGlmIChpdGVtc0RhdGEpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgIHRoaXMuc2V0SXRlbXMobnVsbCk7ICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbFxuICAgICAgICAgIHRoaXMuc2V0SXRlbXMoaXRlbXNEYXRhLnJhd0RTKTsgLy8gYWRkIGFsbFxuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7ICAgLy8gcmVzdG9yZSBzZWxlY3Rpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaXRlbXNcbiAgICogQHBhcmFtIHt2aXMuRGF0YVNldCB8IEFycmF5IHwgbnVsbH0gaXRlbXNcbiAgICovXG4gIHNldEl0ZW1zKGl0ZW1zKSB7XG4gICAgdGhpcy5pdGVtc0RvbmUgPSBmYWxzZTtcbiAgICBcbiAgICAvLyBjb252ZXJ0IHRvIHR5cGUgRGF0YVNldCB3aGVuIG5lZWRlZFxuICAgIGxldCBuZXdEYXRhU2V0O1xuICAgIGlmICghaXRlbXMpIHtcbiAgICAgIG5ld0RhdGFTZXQgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0RhdGFWaWV3TGlrZShcImlkXCIsIGl0ZW1zKSkge1xuICAgICAgbmV3RGF0YVNldCA9IHR5cGVDb2VyY2VEYXRhU2V0KGl0ZW1zKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyB0dXJuIGFuIGFycmF5IGludG8gYSBkYXRhc2V0XG4gICAgICBuZXdEYXRhU2V0ID0gdHlwZUNvZXJjZURhdGFTZXQobmV3IERhdGFTZXQoaXRlbXMpKTtcbiAgICB9XG5cbiAgICAvLyBzZXQgaXRlbXNcbiAgICBpZiAodGhpcy5pdGVtc0RhdGEpIHtcbiAgICAgIC8vIHN0b3AgbWFpbnRhaW5pbmcgYSBjb2VyY2VkIHZlcnNpb24gb2YgdGhlIG9sZCBkYXRhIHNldFxuICAgICAgdGhpcy5pdGVtc0RhdGEuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zRGF0YSA9IG5ld0RhdGFTZXQ7XG4gICAgdGhpcy5pdGVtU2V0ICYmIHRoaXMuaXRlbVNldC5zZXRJdGVtcyhuZXdEYXRhU2V0ICE9IG51bGwgPyBuZXdEYXRhU2V0LnJhd0RTIDogbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGdyb3Vwc1xuICAgKiBAcGFyYW0ge3Zpcy5EYXRhU2V0IHwgQXJyYXl9IGdyb3Vwc1xuICAgKi9cbiAgc2V0R3JvdXBzKGdyb3Vwcykge1xuICAgIC8vIGNvbnZlcnQgdG8gdHlwZSBEYXRhU2V0IHdoZW4gbmVlZGVkXG4gICAgbGV0IG5ld0RhdGFTZXQ7XG4gICAgY29uc3QgZmlsdGVyID0gZ3JvdXAgPT4gZ3JvdXAudmlzaWJsZSAhPT0gZmFsc2U7XG4gICAgXG4gICAgaWYgKCFncm91cHMpIHtcbiAgICAgIG5ld0RhdGFTZXQgPSBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIElmIGdyb3VwcyBpcyBhcnJheSwgdHVybiB0byBEYXRhU2V0ICYgYnVpbGQgZGF0YXZpZXcgZnJvbSB0aGF0XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShncm91cHMpKSBncm91cHMgPSBuZXcgRGF0YVNldChncm91cHMpO1xuICAgICAgXG4gICAgICBuZXdEYXRhU2V0ID0gbmV3IERhdGFWaWV3KGdyb3Vwcyx7ZmlsdGVyfSk7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBsb29rcyB3ZWlyZCBidXQgaXQncyBuZWNlc3NhcnkgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuXG4gICAgLy9cbiAgICAvLyBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSBEYXRhVmlldyB3aWxsIGV4aXN0IGFzIGxvbmcgYXMgdGhlIERhdGFTZXQgaXQnc1xuICAgIC8vIGNvbm5lY3RlZCB0by4gVGhpcyB3aWxsIGZvcmNlIGl0IHRvIHN3YXAgdGhlIGdyb3VwcyBEYXRhU2V0IGZvciBpdCdzIG93blxuICAgIC8vIERhdGFTZXQuIEluIHRoaXMgYXJyYW5nZW1lbnQgaXQgd2lsbCBiZWNvbWUgdW5yZWZlcmVuY2VkIGZyb20gdGhlIG91dHNpZGVcbiAgICAvLyBhbmQgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gICAgLy9cbiAgICAvLyBJTVBPUlRBTlQgTk9URTogSWYgYHRoaXMuZ3JvdXBzRGF0YWAgaXMgYSBEYXRhVmlldyB3YXMgY3JlYXRlZCBpbiB0aGlzXG4gICAgLy8gbWV0aG9kLiBFdmVuIGlmIHRoZSBvcmlnaW5hbCBpcyBhIERhdGFWaWV3IGFscmVhZHkgYSBuZXcgb25lIGhhcyBiZWVuXG4gICAgLy8gY3JlYXRlZCBhbmQgYXNzaWduZWQgdG8gYHRoaXMuZ3JvdXBzRGF0YWAuIEluIGNhc2UgdGhpcyBjaGFuZ2VzIGluIHRoZVxuICAgIC8vIGZ1dHVyZSBpdCB3aWxsIGJlIG5lY2Vzc2FyeSB0byByZXdvcmsgdGhpcyEhISFcbiAgICBpZiAodGhpcy5ncm91cHNEYXRhICE9IG51bGwgJiYgdHlwZW9mIHRoaXMuZ3JvdXBzRGF0YS5zZXREYXRhID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRoaXMuZ3JvdXBzRGF0YS5zZXREYXRhKG51bGwpO1xuICAgIH1cbiAgICB0aGlzLmdyb3Vwc0RhdGEgPSBuZXdEYXRhU2V0O1xuICAgIHRoaXMuaXRlbVNldC5zZXRHcm91cHMobmV3RGF0YVNldCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGJvdGggaXRlbXMgYW5kIGdyb3VwcyBpbiBvbmUgZ29cbiAgICogQHBhcmFtIHt7aXRlbXM6IChBcnJheSB8IHZpcy5EYXRhU2V0KSwgZ3JvdXBzOiAoQXJyYXkgfCB2aXMuRGF0YVNldCl9fSBkYXRhXG4gICAqL1xuICBzZXREYXRhKGRhdGEpIHtcbiAgICBpZiAoZGF0YSAmJiBkYXRhLmdyb3Vwcykge1xuICAgICAgdGhpcy5zZXRHcm91cHMoZGF0YS5ncm91cHMpO1xuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuaXRlbXMpIHtcbiAgICAgIHRoaXMuc2V0SXRlbXMoZGF0YS5pdGVtcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzZWxlY3RlZCBpdGVtcyBieSB0aGVpciBpZC4gUmVwbGFjZXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAqIFVua25vd24gaWQncyBhcmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICogQHBhcmFtIHtzdHJpbmdbXSB8IHN0cmluZ30gW2lkc10gIEFuIGFycmF5IHdpdGggemVybyBvciBtb3JlIGlkJ3Mgb2YgdGhlIGl0ZW1zIHRvIGJlXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC4gSWYgaWRzIGlzIGFuIGVtcHR5IGFycmF5LCBhbGwgaXRlbXMgd2lsbCBiZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RlZC5cbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvY3VzOiBib29sZWFuYFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRydWUsIGZvY3VzIHdpbGwgYmUgc2V0IHRvIHRoZSBzZWxlY3RlZCBpdGVtKHMpXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYW5pbWF0aW9uOiBib29sZWFuIHwge2R1cmF0aW9uOiBudW1iZXIsIGVhc2luZ0Z1bmN0aW9uOiBzdHJpbmd9YFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpLCB0aGUgcmFuZ2UgaXMgYW5pbWF0ZWRcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhseSB0byB0aGUgbmV3IHdpbmRvdy4gQW4gb2JqZWN0IGNhbiBiZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRvIHNwZWNpZnkgZHVyYXRpb24gYW5kIGVhc2luZyBmdW5jdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGR1cmF0aW9uIGlzIDUwMCBtcywgYW5kIGRlZmF1bHQgZWFzaW5nXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgJ2Vhc2VJbk91dFF1YWQnLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYXBwbGljYWJsZSB3aGVuIG9wdGlvbiBmb2N1cyBpcyB0cnVlLlxuICAgKi9cbiAgc2V0U2VsZWN0aW9uKGlkcywgb3B0aW9ucykge1xuICAgIHRoaXMuaXRlbVNldCAmJiB0aGlzLml0ZW1TZXQuc2V0U2VsZWN0aW9uKGlkcyk7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzKGlkcywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgc2VsZWN0ZWQgaXRlbXMgYnkgdGhlaXIgaWRcbiAgICogQHJldHVybiB7QXJyYXl9IGlkcyAgVGhlIGlkcyBvZiB0aGUgc2VsZWN0ZWQgaXRlbXNcbiAgICovXG4gIGdldFNlbGVjdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtU2V0ICYmIHRoaXMuaXRlbVNldC5nZXRTZWxlY3Rpb24oKSB8fCBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGp1c3QgdGhlIHZpc2libGUgd2luZG93IHN1Y2ggdGhhdCB0aGUgc2VsZWN0ZWQgaXRlbSAob3IgbXVsdGlwbGUgaXRlbXMpXG4gICAqIGFyZSBjZW50ZXJlZCBvbiBzY3JlZW4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgU3RyaW5nW119IGlkICAgICBBbiBpdGVtIGlkIG9yIGFycmF5IHdpdGggaXRlbSBpZHNcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuaW1hdGlvbjogYm9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfWBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlIHJhbmdlIGlzIGFuaW1hdGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RobHkgdG8gdGhlIG5ldyB3aW5kb3cuIEFuIG9iamVjdCBjYW4gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB0byBzcGVjaWZ5IGR1cmF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkdXJhdGlvbiBpcyA1MDAgbXMsIGFuZCBkZWZhdWx0IGVhc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzICdlYXNlSW5PdXRRdWFkJy5cbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGB6b29tOiBib29sZWFuYFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpLCB0aGUgdGltZWxpbmUgd2lsbFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvb20gb24gdGhlIGVsZW1lbnQgYWZ0ZXIgZm9jdXMgaXQuXG4gICAqL1xuICBmb2N1cyhpZCwgb3B0aW9ucykge1xuICAgIGlmICghdGhpcy5pdGVtc0RhdGEgfHwgaWQgPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICBjb25zdCBpZHMgPSBBcnJheS5pc0FycmF5KGlkKSA/IGlkIDogW2lkXTtcblxuICAgIC8vIGdldCB0aGUgc3BlY2lmaWVkIGl0ZW0ocylcbiAgICBjb25zdCBpdGVtc0RhdGEgPSB0aGlzLml0ZW1zRGF0YS5nZXQoaWRzKTtcblxuICAgIC8vIGNhbGN1bGF0ZSBtaW5pbXVtIHN0YXJ0IGFuZCBtYXhpbXVtIGVuZCBvZiBzcGVjaWZpZWQgaXRlbXNcbiAgICBsZXQgc3RhcnQgPSBudWxsO1xuICAgIGxldCBlbmQgPSBudWxsO1xuICAgIGl0ZW1zRGF0YS5mb3JFYWNoKGl0ZW1EYXRhID0+IHtcbiAgICAgIGNvbnN0IHMgPSBpdGVtRGF0YS5zdGFydC52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBlID0gJ2VuZCcgaW4gaXRlbURhdGEgPyBpdGVtRGF0YS5lbmQudmFsdWVPZigpIDogaXRlbURhdGEuc3RhcnQudmFsdWVPZigpO1xuXG4gICAgICBpZiAoc3RhcnQgPT09IG51bGwgfHwgcyA8IHN0YXJ0KSB7XG4gICAgICAgIHN0YXJ0ID0gcztcbiAgICAgIH1cblxuICAgICAgaWYgKGVuZCA9PT0gbnVsbCB8fCBlID4gZW5kKSB7XG4gICAgICAgIGVuZCA9IGU7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIGlmIChzdGFydCAhPT0gbnVsbCAmJiBlbmQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgIC8vIFVzZSB0aGUgZmlyc3QgaXRlbSBmb3IgdGhlIHZlcnRpY2FsIGZvY3VzXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtU2V0Lml0ZW1zW2lkc1swXV07XG4gICAgICBsZXQgc3RhcnRQb3MgPSB0aGlzLl9nZXRTY3JvbGxUb3AoKSAqIC0xO1xuICAgICAgbGV0IGluaXRpYWxWZXJ0aWNhbFNjcm9sbCA9IG51bGw7XG5cbiAgICAgIC8vIFNldHVwIGEgaGFuZGxlciBmb3IgZWFjaCBmcmFtZSBvZiB0aGUgdmVydGljYWwgc2Nyb2xsXG4gICAgICBjb25zdCB2ZXJ0aWNhbEFuaW1hdGlvbkZyYW1lID0gKGVhc2UsIHdpbGxEcmF3LCBkb25lKSA9PiB7XG4gICAgICAgIGNvbnN0IHZlcnRpY2FsU2Nyb2xsID0gZ2V0SXRlbVZlcnRpY2FsU2Nyb2xsKG1lLCBpdGVtKTtcblxuICAgICAgICBpZiAodmVydGljYWxTY3JvbGwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBuZWVkIHRvIHNjcm9sbCwgc28gZG8gbm90aGluZ1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWluaXRpYWxWZXJ0aWNhbFNjcm9sbCkge1xuICAgICAgICAgIGluaXRpYWxWZXJ0aWNhbFNjcm9sbCA9IHZlcnRpY2FsU2Nyb2xsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoaW5pdGlhbFZlcnRpY2FsU2Nyb2xsLml0ZW1Ub3AgPT0gdmVydGljYWxTY3JvbGwuaXRlbVRvcCAmJiAhaW5pdGlhbFZlcnRpY2FsU2Nyb2xsLnNob3VsZFNjcm9sbCkge1xuICAgICAgICAgIHJldHVybjsgLy8gV2UgZG9uJ3QgbmVlZCB0byBzY3JvbGwsIHNvIGRvIG5vdGhpbmdcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKGluaXRpYWxWZXJ0aWNhbFNjcm9sbC5pdGVtVG9wICE9IHZlcnRpY2FsU2Nyb2xsLml0ZW1Ub3AgJiYgdmVydGljYWxTY3JvbGwuc2hvdWxkU2Nyb2xsKSB7XG4gICAgICAgICAgLy8gVGhlIHJlZHJhdyBzaGlmdGVkIGVsZW1lbnRzLCBzbyByZXNldCB0aGUgYW5pbWF0aW9uIHRvIGNvcnJlY3RcbiAgICAgICAgICBpbml0aWFsVmVydGljYWxTY3JvbGwgPSB2ZXJ0aWNhbFNjcm9sbDtcbiAgICAgICAgICBzdGFydFBvcyA9IG1lLl9nZXRTY3JvbGxUb3AoKSAqIC0xO1xuICAgICAgICB9ICAgICAgXG5cbiAgICAgICAgY29uc3QgZnJvbSA9IHN0YXJ0UG9zO1xuICAgICAgICBjb25zdCB0byA9IGluaXRpYWxWZXJ0aWNhbFNjcm9sbC5zY3JvbGxPZmZzZXQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IGRvbmUgPyB0byA6IChmcm9tICsgKHRvIC0gZnJvbSkgKiBlYXNlKTtcblxuICAgICAgICBtZS5fc2V0U2Nyb2xsVG9wKC1zY3JvbGxUb3ApO1xuXG4gICAgICAgIGlmKCF3aWxsRHJhdykge1xuICAgICAgICAgIG1lLl9yZWRyYXcoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gRW5mb3JjZXMgdGhlIGZpbmFsIHZlcnRpY2FsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgY29uc3Qgc2V0RmluYWxWZXJ0aWNhbFBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmaW5hbFZlcnRpY2FsU2Nyb2xsID0gZ2V0SXRlbVZlcnRpY2FsU2Nyb2xsKG1lLCBpdGVtKTtcblxuICAgICAgICBpZiAoZmluYWxWZXJ0aWNhbFNjcm9sbC5zaG91bGRTY3JvbGwgJiYgZmluYWxWZXJ0aWNhbFNjcm9sbC5pdGVtVG9wICE9IGluaXRpYWxWZXJ0aWNhbFNjcm9sbC5pdGVtVG9wKSB7XG4gICAgICAgICAgbWUuX3NldFNjcm9sbFRvcCgtZmluYWxWZXJ0aWNhbFNjcm9sbC5zY3JvbGxPZmZzZXQpO1xuICAgICAgICAgIG1lLl9yZWRyYXcoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gUGVyZm9ybSBvbmUgbGFzdCBjaGVjayBhdCB0aGUgZW5kIHRvIG1ha2Ugc3VyZSB0aGUgZmluYWwgdmVydGljYWxcbiAgICAgIC8vIHBvc2l0aW9uIGlzIGNvcnJlY3RcbiAgICAgIGNvbnN0IGZpbmFsVmVydGljYWxDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgLy8gRG91YmxlIGNoZWNrIHdlIGVuZGVkIGF0IHRoZSBwcm9wZXIgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIHNldEZpbmFsVmVydGljYWxQb3NpdGlvbigpO1xuXG4gICAgICAgIC8vIExldCB0aGUgcmVkcmF3IHNldHRsZSBhbmQgZmluYWxpemUgdGhlIHBvc2l0aW9uLiAgICAgIFxuICAgICAgICBzZXRUaW1lb3V0KHNldEZpbmFsVmVydGljYWxQb3NpdGlvbiwgMTAwKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbmV3IG1pZGRsZSBhbmQgaW50ZXJ2YWwgZm9yIHRoZSB3aW5kb3dcbiAgICAgIGNvbnN0IHpvb20gPSBvcHRpb25zICYmIG9wdGlvbnMuem9vbSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy56b29tIDogdHJ1ZTtcbiAgICAgIGNvbnN0IG1pZGRsZSA9IChzdGFydCArIGVuZCkgLyAyO1xuICAgICAgY29uc3QgaW50ZXJ2YWwgPSB6b29tID8gKGVuZCAtIHN0YXJ0KSAqIDEuMSA6IE1hdGgubWF4KHRoaXMucmFuZ2UuZW5kIC0gdGhpcy5yYW5nZS5zdGFydCwgKGVuZCAtIHN0YXJ0KSAqIDEuMSk7XG5cbiAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hbmltYXRpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYW5pbWF0aW9uIDogdHJ1ZTtcblxuICAgICAgaWYgKCFhbmltYXRpb24pIHtcbiAgICAgICAgLy8gV2UgYXJlbid0IGFuaW1hdGluZyBzbyBzZXQgYSBkZWZhdWx0IHNvIHRoYXQgdGhlIGZpbmFsIGNhbGxiYWNrIGZvcmNlcyB0aGUgdmVydGljYWwgbG9jYXRpb25cbiAgICAgICAgaW5pdGlhbFZlcnRpY2FsU2Nyb2xsID0geyBzaG91bGRTY3JvbGw6IGZhbHNlLCBzY3JvbGxPZmZzZXQ6IC0xLCBpdGVtVG9wOiAtMSB9O1xuICAgICAgfVxuXG4gICAgICB0aGlzLnJhbmdlLnNldFJhbmdlKG1pZGRsZSAtIGludGVydmFsIC8gMiwgbWlkZGxlICsgaW50ZXJ2YWwgLyAyLCB7IGFuaW1hdGlvbiB9LCBmaW5hbFZlcnRpY2FsQ2FsbGJhY2ssIHZlcnRpY2FsQW5pbWF0aW9uRnJhbWUpOyAgXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBUaW1lbGluZSB3aW5kb3cgc3VjaCB0aGF0IGl0IGZpdHMgYWxsIGl0ZW1zXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gIEF2YWlsYWJsZSBvcHRpb25zOlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFuaW1hdGlvbjogYm9vbGVhbiB8IHtkdXJhdGlvbjogbnVtYmVyLCBlYXNpbmdGdW5jdGlvbjogc3RyaW5nfWBcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0cnVlIChkZWZhdWx0KSwgdGhlIHJhbmdlIGlzIGFuaW1hdGVkXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RobHkgdG8gdGhlIG5ldyB3aW5kb3cuIEFuIG9iamVjdCBjYW4gYmVcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCB0byBzcGVjaWZ5IGR1cmF0aW9uIGFuZCBlYXNpbmcgZnVuY3Rpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBkdXJhdGlvbiBpcyA1MDAgbXMsIGFuZCBkZWZhdWx0IGVhc2luZ1xuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzICdlYXNlSW5PdXRRdWFkJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXVxuICAgKi9cbiAgZml0KG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgYW5pbWF0aW9uID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5hbmltYXRpb24gIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmFuaW1hdGlvbiA6IHRydWU7XG4gICAgbGV0IHJhbmdlO1xuXG4gICAgaWYgKHRoaXMuaXRlbXNEYXRhLmxlbmd0aCA9PT0gMSAmJiB0aGlzLml0ZW1zRGF0YS5nZXQoKVswXS5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gYSBzaW5nbGUgaXRlbSAtPiBkb24ndCBmaXQsIGp1c3Qgc2hvdyBhIHJhbmdlIGFyb3VuZCB0aGUgaXRlbSBmcm9tIC00IHRvICszIGRheXNcbiAgICAgIHJhbmdlID0gdGhpcy5nZXREYXRhUmFuZ2UoKTtcbiAgICAgIHRoaXMubW92ZVRvKHJhbmdlLm1pbi52YWx1ZU9mKCksIHthbmltYXRpb259LCBjYWxsYmFjayk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gZXhhY3RseSBmaXQgdGhlIGl0ZW1zIChwbHVzIGEgc21hbGwgbWFyZ2luKVxuICAgICAgcmFuZ2UgPSB0aGlzLmdldEl0ZW1SYW5nZSgpO1xuICAgICAgdGhpcy5yYW5nZS5zZXRSYW5nZShyYW5nZS5taW4sIHJhbmdlLm1heCwgeyBhbmltYXRpb24gfSwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIHJhbmdlIG9mIHRoZSBpdGVtcywgdGFraW5nIGludG8gYWNjb3VudCB0aGVpciBhY3R1YWwgd2lkdGhcbiAgICogYW5kIGEgbWFyZ2luIG9mIDEwIHBpeGVscyBvbiBib3RoIHNpZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7e21pbjogRGF0ZSwgbWF4OiBEYXRlfX1cbiAgICovXG4gIGdldEl0ZW1SYW5nZSgpIHtcbiAgICAvLyBnZXQgYSByb3VnaCBhcHByb3hpbWF0aW9uIGZvciB0aGUgcmFuZ2UgYmFzZWQgb24gdGhlIGl0ZW1zIHN0YXJ0IGFuZCBlbmQgZGF0ZXNcbiAgICBjb25zdCByYW5nZSA9IHRoaXMuZ2V0RGF0YVJhbmdlKCk7XG4gICAgbGV0IG1pbiA9IHJhbmdlLm1pbiAhPT0gbnVsbCA/IHJhbmdlLm1pbi52YWx1ZU9mKCkgOiBudWxsO1xuICAgIGxldCBtYXggPSByYW5nZS5tYXggIT09IG51bGwgPyByYW5nZS5tYXgudmFsdWVPZigpIDogbnVsbDtcbiAgICBsZXQgbWluSXRlbSA9IG51bGw7XG4gICAgbGV0IG1heEl0ZW0gPSBudWxsO1xuXG4gICAgaWYgKG1pbiAhPSBudWxsICYmIG1heCAhPSBudWxsKSB7XG4gICAgICBsZXQgaW50ZXJ2YWwgPSAobWF4IC0gbWluKTsgLy8gbXNcbiAgICAgIGlmIChpbnRlcnZhbCA8PSAwKSB7XG4gICAgICAgIGludGVydmFsID0gMTA7XG4gICAgICB9XG4gICAgICBjb25zdCBmYWN0b3IgPSBpbnRlcnZhbCAvIHRoaXMucHJvcHMuY2VudGVyLndpZHRoO1xuXG4gICAgICBjb25zdCByZWRyYXdRdWV1ZSA9IHt9O1xuICAgICAgbGV0IHJlZHJhd1F1ZXVlTGVuZ3RoID0gMDtcblxuICAgICAgLy8gY29sbGVjdCByZWRyYXcgZnVuY3Rpb25zXG4gICAgICB1dGlsLmZvckVhY2godGhpcy5pdGVtU2V0Lml0ZW1zLCAoaXRlbSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpdGVtLmdyb3VwU2hvd2luZykge1xuICAgICAgICAgIGNvbnN0IHJldHVyblF1ZXVlID0gdHJ1ZTtcbiAgICAgICAgICByZWRyYXdRdWV1ZVtrZXldID0gaXRlbS5yZWRyYXcocmV0dXJuUXVldWUpO1xuICAgICAgICAgIHJlZHJhd1F1ZXVlTGVuZ3RoID0gcmVkcmF3UXVldWVba2V5XS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBuZWVkUmVkcmF3ID0gcmVkcmF3UXVldWVMZW5ndGggPiAwO1xuICAgICAgaWYgKG5lZWRSZWRyYXcpIHtcbiAgICAgICAgLy8gcmVkcmF3IGFsbCByZWd1bGFyIGl0ZW1zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkcmF3UXVldWVMZW5ndGg7IGkrKykge1xuICAgICAgICAgIHV0aWwuZm9yRWFjaChyZWRyYXdRdWV1ZSwgZm5zID0+IHtcbiAgICAgICAgICAgIGZuc1tpXSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGRhdGUgb2YgdGhlIGxlZnQgc2lkZSBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgaXRlbXMgZ2l2ZW5cbiAgICAgIHV0aWwuZm9yRWFjaCh0aGlzLml0ZW1TZXQuaXRlbXMsIGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBzdGFydCA9IGdldFN0YXJ0KGl0ZW0pO1xuICAgICAgICBjb25zdCBlbmQgPSBnZXRFbmQoaXRlbSk7XG4gICAgICAgIGxldCBzdGFydFNpZGU7XG4gICAgICAgIGxldCBlbmRTaWRlO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgICAgc3RhcnRTaWRlICA9IHN0YXJ0IC0gKGl0ZW0uZ2V0V2lkdGhSaWdodCgpICArIDEwKSAqIGZhY3RvcjtcbiAgICAgICAgICBlbmRTaWRlID0gZW5kICAgKyAoaXRlbS5nZXRXaWR0aExlZnQoKSArIDEwKSAqIGZhY3RvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGFydFNpZGUgID0gc3RhcnQgLSAoaXRlbS5nZXRXaWR0aExlZnQoKSAgKyAxMCkgKiBmYWN0b3I7XG4gICAgICAgICAgZW5kU2lkZSA9IGVuZCAgICsgKGl0ZW0uZ2V0V2lkdGhSaWdodCgpICsgMTApICogZmFjdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0YXJ0U2lkZSA8IG1pbikge1xuICAgICAgICAgIG1pbiA9IHN0YXJ0U2lkZTtcbiAgICAgICAgICBtaW5JdGVtID0gaXRlbTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW5kU2lkZSA+IG1heCkge1xuICAgICAgICAgIG1heCA9IGVuZFNpZGU7XG4gICAgICAgICAgbWF4SXRlbSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBpZiAobWluSXRlbSAmJiBtYXhJdGVtKSB7XG4gICAgICAgIGNvbnN0IGxocyA9IG1pbkl0ZW0uZ2V0V2lkdGhMZWZ0KCkgKyAxMDtcbiAgICAgICAgY29uc3QgcmhzID0gbWF4SXRlbS5nZXRXaWR0aFJpZ2h0KCkgKyAxMDtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLnByb3BzLmNlbnRlci53aWR0aCAtIGxocyAtIHJoczsgIC8vIHB4XG5cbiAgICAgICAgaWYgKGRlbHRhID4gMCkge1xuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucnRsKSB7XG4gICAgICAgICAgICBtaW4gPSBnZXRTdGFydChtaW5JdGVtKSAtIHJocyAqIGludGVydmFsIC8gZGVsdGE7IC8vIG1zXG4gICAgICAgICAgICBtYXggPSBnZXRFbmQobWF4SXRlbSkgICArIGxocyAqIGludGVydmFsIC8gZGVsdGE7IC8vIG1zXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbiA9IGdldFN0YXJ0KG1pbkl0ZW0pIC0gbGhzICogaW50ZXJ2YWwgLyBkZWx0YTsgLy8gbXNcbiAgICAgICAgICAgIG1heCA9IGdldEVuZChtYXhJdGVtKSAgICsgcmhzICogaW50ZXJ2YWwgLyBkZWx0YTsgLy8gbXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbWluOiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsLFxuICAgICAgbWF4OiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSB0aGUgZGF0YSByYW5nZSBvZiB0aGUgaXRlbXMgc3RhcnQgYW5kIGVuZCBkYXRlc1xuICAgKiBAcmV0dXJucyB7e21pbjogRGF0ZSwgbWF4OiBEYXRlfX1cbiAgICovXG4gIGdldERhdGFSYW5nZSgpIHtcbiAgICBsZXQgbWluID0gbnVsbDtcbiAgICBsZXQgbWF4ID0gbnVsbDtcblxuICAgIGlmICh0aGlzLml0ZW1zRGF0YSkge1xuICAgICAgdGhpcy5pdGVtc0RhdGEuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSB1dGlsLmNvbnZlcnQoaXRlbS5zdGFydCwgJ0RhdGUnKS52YWx1ZU9mKCk7XG4gICAgICAgIGNvbnN0IGVuZCAgID0gdXRpbC5jb252ZXJ0KGl0ZW0uZW5kICE9IHVuZGVmaW5lZCA/IGl0ZW0uZW5kIDogaXRlbS5zdGFydCwgJ0RhdGUnKS52YWx1ZU9mKCk7XG4gICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgc3RhcnQgPCBtaW4pIHtcbiAgICAgICAgICBtaW4gPSBzdGFydDtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGVuZCA+IG1heCkge1xuICAgICAgICAgIG1heCA9IGVuZDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG1pbjogbWluICE9IG51bGwgPyBuZXcgRGF0ZShtaW4pIDogbnVsbCxcbiAgICAgIG1heDogbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBUaW1lbGluZSByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHJldHVybiB7T2JqZWN0fSBBbiBvYmplY3Qgd2l0aCByZWxhdGVkIGluZm9ybWF0aW9uLCBsaWtlIG9uIHdoaWNoIGFyZWFcbiAgICogICAgICAgICAgICAgICAgICBUaGUgZXZlbnQgaGFwcGVuZWQsIHdoZXRoZXIgY2xpY2tlZCBvbiBhbiBpdGVtLCBldGMuXG4gICAqL1xuICBnZXRFdmVudFByb3BlcnRpZXMoZXZlbnQpIHtcbiAgICBjb25zdCBjbGllbnRYID0gZXZlbnQuY2VudGVyID8gZXZlbnQuY2VudGVyLnggOiBldmVudC5jbGllbnRYO1xuICAgIGNvbnN0IGNsaWVudFkgPSBldmVudC5jZW50ZXIgPyBldmVudC5jZW50ZXIueSA6IGV2ZW50LmNsaWVudFk7XG4gICAgY29uc3QgY2VudGVyQ29udGFpbmVyUmVjdCA9IHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gdGhpcy5vcHRpb25zLnJ0bCA/IGNlbnRlckNvbnRhaW5lclJlY3QucmlnaHQgLSBjbGllbnRYIDogY2xpZW50WCAtIGNlbnRlckNvbnRhaW5lclJlY3QubGVmdDtcbiAgICBjb25zdCB5ID0gY2xpZW50WSAtIGNlbnRlckNvbnRhaW5lclJlY3QudG9wO1xuICAgIFxuICAgIGNvbnN0IGl0ZW0gID0gdGhpcy5pdGVtU2V0Lml0ZW1Gcm9tVGFyZ2V0KGV2ZW50KTtcbiAgICBjb25zdCBncm91cCA9IHRoaXMuaXRlbVNldC5ncm91cEZyb21UYXJnZXQoZXZlbnQpO1xuICAgIGNvbnN0IGN1c3RvbVRpbWUgPSBDdXN0b21UaW1lLmN1c3RvbVRpbWVGcm9tVGFyZ2V0KGV2ZW50KTtcblxuICAgIGNvbnN0IHNuYXAgPSB0aGlzLml0ZW1TZXQub3B0aW9ucy5zbmFwIHx8IG51bGw7XG4gICAgY29uc3Qgc2NhbGUgPSB0aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpO1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmJvZHkudXRpbC5nZXRTdGVwKCk7XG4gICAgY29uc3QgdGltZSA9IHRoaXMuX3RvVGltZSh4KTtcbiAgICBjb25zdCBzbmFwcGVkVGltZSA9IHNuYXAgPyBzbmFwKHRpbWUsIHNjYWxlLCBzdGVwKSA6IHRpbWU7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdXRpbC5nZXRUYXJnZXQoZXZlbnQpO1xuICAgIGxldCB3aGF0ID0gbnVsbDtcbiAgICBpZiAoaXRlbSAhPSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7d2hhdCA9ICdpdGVtJzt9XG4gICAgZWxzZSBpZiAoY3VzdG9tVGltZSAhPSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3doYXQgPSAnY3VzdG9tLXRpbWUnO31cbiAgICBlbHNlIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLnRpbWVBeGlzLmRvbS5mb3JlZ3JvdW5kKSkgICAgICB7d2hhdCA9ICdheGlzJzt9XG4gICAgZWxzZSBpZiAodGhpcy50aW1lQXhpczIgJiYgdXRpbC5oYXNQYXJlbnQoZWxlbWVudCwgdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpKSB7d2hhdCA9ICdheGlzJzt9XG4gICAgZWxzZSBpZiAodXRpbC5oYXNQYXJlbnQoZWxlbWVudCwgdGhpcy5pdGVtU2V0LmRvbS5sYWJlbFNldCkpICAgICAgICAge3doYXQgPSAnZ3JvdXAtbGFiZWwnO31cbiAgICBlbHNlIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLmN1cnJlbnRUaW1lLmJhcikpICAgICAgICAgICAgICB7d2hhdCA9ICdjdXJyZW50LXRpbWUnO31cbiAgICBlbHNlIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLmRvbS5jZW50ZXIpKSAgICAgICAgICAgICAgICAgICB7d2hhdCA9ICdiYWNrZ3JvdW5kJzt9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnQsXG4gICAgICBpdGVtOiBpdGVtID8gaXRlbS5pZCA6IG51bGwsXG4gICAgICBpc0NsdXN0ZXI6IGl0ZW0gPyAhIWl0ZW0uaXNDbHVzdGVyOiBmYWxzZSxcbiAgICAgIGl0ZW1zOiBpdGVtID8gaXRlbS5pdGVtcyB8fCBbXTogbnVsbCxcbiAgICAgIGdyb3VwOiBncm91cCA/IGdyb3VwLmdyb3VwSWQgOiBudWxsLFxuICAgICAgY3VzdG9tVGltZTogY3VzdG9tVGltZSA/IGN1c3RvbVRpbWUub3B0aW9ucy5pZCA6IG51bGwsXG4gICAgICB3aGF0LFxuICAgICAgcGFnZVg6IGV2ZW50LnNyY0V2ZW50ID8gZXZlbnQuc3JjRXZlbnQucGFnZVggOiBldmVudC5wYWdlWCxcbiAgICAgIHBhZ2VZOiBldmVudC5zcmNFdmVudCA/IGV2ZW50LnNyY0V2ZW50LnBhZ2VZIDogZXZlbnQucGFnZVksXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHRpbWUsXG4gICAgICBzbmFwcGVkVGltZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgVGltZWxpbmUgcm9sbGluZyBtb2RlXG4gICAqL1xuICB0b2dnbGVSb2xsaW5nTW9kZSgpIHtcbiAgICBpZiAodGhpcy5yYW5nZS5yb2xsaW5nKSB7XG4gICAgICB0aGlzLnJhbmdlLnN0b3BSb2xsaW5nKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucm9sbGluZ01vZGUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpO1xuICAgICAgfVxuICAgICAgdGhpcy5yYW5nZS5zdGFydFJvbGxpbmcoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogcmVkcmF3XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVkcmF3KCkge1xuICAgIENvcmUucHJvdG90eXBlLl9yZWRyYXcuY2FsbCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBvbiBmaXQgY2FsbGJhY2tcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkZpdChhcmdzKSB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kLCBhbmltYXRpb24gfSA9IGFyZ3M7XG4gICAgaWYgKCFlbmQpIHtcbiAgICAgIHRoaXMubW92ZVRvKHN0YXJ0LnZhbHVlT2YoKSwge1xuICAgICAgICBhbmltYXRpb25cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhbmdlLnNldFJhbmdlKHN0YXJ0LCBlbmQsIHtcbiAgICAgICAgYW5pbWF0aW9uOiBhbmltYXRpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3RpbWVsaW5lLkl0ZW19IGl0ZW1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGdldFN0YXJ0KGl0ZW0pIHtcbiAgcmV0dXJuIHV0aWwuY29udmVydChpdGVtLmRhdGEuc3RhcnQsICdEYXRlJykudmFsdWVPZigpXG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dGltZWxpbmUuSXRlbX0gaXRlbVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0RW5kKGl0ZW0pIHtcbiAgY29uc3QgZW5kID0gaXRlbS5kYXRhLmVuZCAhPSB1bmRlZmluZWQgPyBpdGVtLmRhdGEuZW5kIDogaXRlbS5kYXRhLnN0YXJ0O1xuICByZXR1cm4gdXRpbC5jb252ZXJ0KGVuZCwgJ0RhdGUnKS52YWx1ZU9mKCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHt2aXMuVGltZWxpbmV9IHRpbWVsaW5lXG4gKiBAcGFyYW0ge3RpbWVsaW5lLkl0ZW19IGl0ZW1cbiAqIEByZXR1cm4ge3tzaG91bGRTY3JvbGw6IGJvb2wsIHNjcm9sbE9mZnNldDogbnVtYmVyLCBpdGVtVG9wOiBudW1iZXJ9fVxuICovXG5mdW5jdGlvbiBnZXRJdGVtVmVydGljYWxTY3JvbGwodGltZWxpbmUsIGl0ZW0pIHtcbiAgaWYgKCFpdGVtLnBhcmVudCkge1xuICAgIC8vIFRoZSBpdGVtIG5vIGxvbmdlciBleGlzdHMsIHNvIGlnbm9yZSB0aGlzIGZvY3VzLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGl0ZW1zZXRIZWlnaHQgPSB0aW1lbGluZS5vcHRpb25zLnJ0bCA/IHRpbWVsaW5lLnByb3BzLnJpZ2h0Q29udGFpbmVyLmhlaWdodCA6IHRpbWVsaW5lLnByb3BzLmxlZnRDb250YWluZXIuaGVpZ2h0O1xuICBjb25zdCBjb250ZW50SGVpZ2h0ID0gdGltZWxpbmUucHJvcHMuY2VudGVyLmhlaWdodDtcbiAgXG4gIGNvbnN0IGdyb3VwID0gaXRlbS5wYXJlbnQ7XG4gIGxldCBvZmZzZXQgPSBncm91cC50b3A7XG4gIGxldCBzaG91bGRTY3JvbGwgPSB0cnVlO1xuICBjb25zdCBvcmllbnRhdGlvbiA9IHRpbWVsaW5lLnRpbWVBeGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcztcbiAgXG4gIGNvbnN0IGl0ZW1Ub3AgPSAoKSA9PiB7XG4gIGlmIChvcmllbnRhdGlvbiA9PSBcImJvdHRvbVwiKSB7XG4gICAgICByZXR1cm4gZ3JvdXAuaGVpZ2h0IC0gaXRlbS50b3AgLSBpdGVtLmhlaWdodDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gaXRlbS50b3A7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGN1cnJlbnRTY3JvbGxIZWlnaHQgPSB0aW1lbGluZS5fZ2V0U2Nyb2xsVG9wKCkgKiAtMTtcbiAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gb2Zmc2V0ICsgaXRlbVRvcCgpO1xuICBjb25zdCBoZWlnaHQgPSBpdGVtLmhlaWdodDtcblxuICBpZiAodGFyZ2V0T2Zmc2V0IDwgY3VycmVudFNjcm9sbEhlaWdodCkge1xuICAgIGlmIChvZmZzZXQgKyBpdGVtc2V0SGVpZ2h0IDw9IG9mZnNldCArIGl0ZW1Ub3AoKSArIGhlaWdodCkge1xuICAgICAgb2Zmc2V0ICs9IGl0ZW1Ub3AoKSAtIHRpbWVsaW5lLml0ZW1TZXQub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbDtcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAodGFyZ2V0T2Zmc2V0ICsgaGVpZ2h0ID4gY3VycmVudFNjcm9sbEhlaWdodCArIGl0ZW1zZXRIZWlnaHQpIHtcbiAgICBvZmZzZXQgKz0gaXRlbVRvcCgpICsgaGVpZ2h0IC0gaXRlbXNldEhlaWdodCArIHRpbWVsaW5lLml0ZW1TZXQub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbDtcbiAgfVxuICBlbHNlIHtcbiAgICBzaG91bGRTY3JvbGwgPSBmYWxzZTtcbiAgfVxuXG4gIG9mZnNldCA9IE1hdGgubWluKG9mZnNldCwgY29udGVudEhlaWdodCAtIGl0ZW1zZXRIZWlnaHQpO1xuXG4gIHJldHVybiB7IHNob3VsZFNjcm9sbCwgc2Nyb2xsT2Zmc2V0OiBvZmZzZXQsIGl0ZW1Ub3A6IHRhcmdldE9mZnNldCB9O1xufVxuXG4vLyBET00gdXRpbGl0eSBtZXRob2RzXG5cbi8qKlxuICogdGhpcyBwcmVwYXJlcyB0aGUgSlNPTiBjb250YWluZXIgZm9yIGFsbG9jYXRpbmcgU1ZHIGVsZW1lbnRzXG4gKiBAcGFyYW0ge09iamVjdH0gSlNPTmNvbnRhaW5lclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUVsZW1lbnRzKEpTT05jb250YWluZXIpIHtcbiAgLy8gY2xlYW51cCB0aGUgcmVkdW5kYW50IHN2Z0VsZW1lbnRzO1xuICBmb3IgKHZhciBlbGVtZW50VHlwZSBpbiBKU09OY29udGFpbmVyKSB7XG4gICAgaWYgKEpTT05jb250YWluZXIuaGFzT3duUHJvcGVydHkoZWxlbWVudFR5cGUpKSB7XG4gICAgICBKU09OY29udGFpbmVyW2VsZW1lbnRUeXBlXS5yZWR1bmRhbnQgPSBKU09OY29udGFpbmVyW2VsZW1lbnRUeXBlXS51c2VkO1xuICAgICAgSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0udXNlZCA9IFtdO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHRoaXMgY2xlYW5zIHVwIGFsbCB0aGUgdW51c2VkIFNWRyBlbGVtZW50cy4gQnkgYXNraW5nIGZvciB0aGUgcGFyZW50Tm9kZSwgd2Ugb25seSBuZWVkIHRvIHN1cHBseSB0aGUgSlNPTiBjb250YWluZXIgZnJvbVxuICogd2hpY2ggdG8gcmVtb3ZlIHRoZSByZWR1bmRhbnQgZWxlbWVudHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IEpTT05jb250YWluZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBFbGVtZW50cyhKU09OY29udGFpbmVyKSB7XG4gIC8vIGNsZWFudXAgdGhlIHJlZHVuZGFudCBzdmdFbGVtZW50cztcbiAgZm9yICh2YXIgZWxlbWVudFR5cGUgaW4gSlNPTmNvbnRhaW5lcikge1xuICAgIGlmIChKU09OY29udGFpbmVyLmhhc093blByb3BlcnR5KGVsZW1lbnRUeXBlKSkge1xuICAgICAgaWYgKEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudFtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0ucmVkdW5kYW50ID0gW107XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IGFsbCBlbGVtZW50cyBhcmUgcmVtb3ZlZCBmaXJzdCB1cCBzbyB0aGV5IGNhbiBiZSByZWNyZWF0ZWQgY2xlYW5seVxuICogQHBhcmFtIHtPYmplY3R9IEpTT05jb250YWluZXJcbiAqL1xuZnVuY3Rpb24gcmVzZXRFbGVtZW50cyhKU09OY29udGFpbmVyKSB7XG4gIHByZXBhcmVFbGVtZW50cyhKU09OY29udGFpbmVyKTtcbiAgY2xlYW51cEVsZW1lbnRzKEpTT05jb250YWluZXIpO1xuICBwcmVwYXJlRWxlbWVudHMoSlNPTmNvbnRhaW5lcik7XG59XG5cbi8qKlxuICogQWxsb2NhdGUgb3IgZ2VuZXJhdGUgYW4gU1ZHIGVsZW1lbnQgaWYgbmVlZGVkLiBTdG9yZSBhIHJlZmVyZW5jZSB0byBpdCBpbiB0aGUgSlNPTiBjb250YWluZXIgYW5kIGRyYXcgaXQgaW4gdGhlIHN2Z0NvbnRhaW5lclxuICogdGhlIEpTT04gY29udGFpbmVyIGFuZCB0aGUgU1ZHIGNvbnRhaW5lciBoYXZlIHRvIGJlIHN1cHBsaWVkIHNvIG90aGVyIHN2ZyBjb250YWluZXJzIChsaWtlIHRoZSBsZWdlbmQpIGNhbiB1c2UgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZWxlbWVudFR5cGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBKU09OY29udGFpbmVyXG4gKiBAcGFyYW0ge09iamVjdH0gc3ZnQ29udGFpbmVyXG4gKiBAcmV0dXJucyB7RWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldFNWR0VsZW1lbnQoZWxlbWVudFR5cGUsIEpTT05jb250YWluZXIsIHN2Z0NvbnRhaW5lcikge1xuICB2YXIgZWxlbWVudDtcbiAgLy8gYWxsb2NhdGUgU1ZHIGVsZW1lbnQsIGlmIGl0IGRvZXNudCB5ZXQgZXhpc3QsIGNyZWF0ZSBvbmUuXG4gIGlmIChKU09OY29udGFpbmVyLmhhc093blByb3BlcnR5KGVsZW1lbnRUeXBlKSkgeyAvLyB0aGlzIGVsZW1lbnQgaGFzIGJlZW4gY3JlYXRlZCBiZWZvcmVcbiAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbiByZWR1bmRhbnQgZWxlbWVudFxuICAgIGlmIChKU09OY29udGFpbmVyW2VsZW1lbnRUeXBlXS5yZWR1bmRhbnQubGVuZ3RoID4gMCkge1xuICAgICAgZWxlbWVudCA9IEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudFswXTtcbiAgICAgIEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdLnJlZHVuZGFudC5zaGlmdCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIC8vIGNyZWF0ZSBhIG5ldyBlbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIFNWR1xuICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBlbGVtZW50VHlwZSk7XG4gICAgICBzdmdDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhIG5ldyBlbGVtZW50IGFuZCBhZGQgaXQgdG8gdGhlIFNWRywgYWxzbyBjcmVhdGUgYSBuZXcgb2JqZWN0IGluIHRoZSBzdmdFbGVtZW50cyB0byBrZWVwIHRyYWNrIG9mIGl0LlxuICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgZWxlbWVudFR5cGUpO1xuICAgIEpTT05jb250YWluZXJbZWxlbWVudFR5cGVdID0ge3VzZWQ6IFtdLCByZWR1bmRhbnQ6IFtdfTtcbiAgICBzdmdDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gIH1cbiAgSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0udXNlZC5wdXNoKGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxuXG4vKipcbiAqIEFsbG9jYXRlIG9yIGdlbmVyYXRlIGFuIFNWRyBlbGVtZW50IGlmIG5lZWRlZC4gU3RvcmUgYSByZWZlcmVuY2UgdG8gaXQgaW4gdGhlIEpTT04gY29udGFpbmVyIGFuZCBkcmF3IGl0IGluIHRoZSBzdmdDb250YWluZXJcbiAqIHRoZSBKU09OIGNvbnRhaW5lciBhbmQgdGhlIFNWRyBjb250YWluZXIgaGF2ZSB0byBiZSBzdXBwbGllZCBzbyBvdGhlciBzdmcgY29udGFpbmVycyAobGlrZSB0aGUgbGVnZW5kKSBjYW4gdXNlIHRoaXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnRUeXBlXG4gKiBAcGFyYW0ge09iamVjdH0gSlNPTmNvbnRhaW5lclxuICogQHBhcmFtIHtFbGVtZW50fSBET01Db250YWluZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gaW5zZXJ0QmVmb3JlXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuZnVuY3Rpb24gZ2V0RE9NRWxlbWVudChlbGVtZW50VHlwZSwgSlNPTmNvbnRhaW5lciwgRE9NQ29udGFpbmVyLCBpbnNlcnRCZWZvcmUpIHtcbiAgdmFyIGVsZW1lbnQ7XG4gIC8vIGFsbG9jYXRlIERPTSBlbGVtZW50LCBpZiBpdCBkb2VzbnQgeWV0IGV4aXN0LCBjcmVhdGUgb25lLlxuICBpZiAoSlNPTmNvbnRhaW5lci5oYXNPd25Qcm9wZXJ0eShlbGVtZW50VHlwZSkpIHsgLy8gdGhpcyBlbGVtZW50IGhhcyBiZWVuIGNyZWF0ZWQgYmVmb3JlXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYW4gcmVkdW5kYW50IGVsZW1lbnRcbiAgICBpZiAoSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0ucmVkdW5kYW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIGVsZW1lbnQgPSBKU09OY29udGFpbmVyW2VsZW1lbnRUeXBlXS5yZWR1bmRhbnRbMF07XG4gICAgICBKU09OY29udGFpbmVyW2VsZW1lbnRUeXBlXS5yZWR1bmRhbnQuc2hpZnQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAvLyBjcmVhdGUgYSBuZXcgZWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBTVkdcbiAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGVsZW1lbnRUeXBlKTtcbiAgICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBET01Db250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGluc2VydEJlZm9yZSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgRE9NQ29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICAvLyBjcmVhdGUgYSBuZXcgZWxlbWVudCBhbmQgYWRkIGl0IHRvIHRoZSBTVkcsIGFsc28gY3JlYXRlIGEgbmV3IG9iamVjdCBpbiB0aGUgc3ZnRWxlbWVudHMgdG8ga2VlcCB0cmFjayBvZiBpdC5cbiAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50VHlwZSk7XG4gICAgSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0gPSB7dXNlZDogW10sIHJlZHVuZGFudDogW119O1xuICAgIGlmIChpbnNlcnRCZWZvcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgRE9NQ29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBpbnNlcnRCZWZvcmUpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIERPTUNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgSlNPTmNvbnRhaW5lcltlbGVtZW50VHlwZV0udXNlZC5wdXNoKGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cblxuXG5cblxuLyoqXG4gKiBEcmF3IGEgcG9pbnQgb2JqZWN0LiBUaGlzIGlzIGEgc2VwYXJhdGUgZnVuY3Rpb24gYmVjYXVzZSBpdCBjYW4gYWxzbyBiZSBjYWxsZWQgYnkgdGhlIGxlZ2VuZC5cbiAqIFRoZSByZWFzb24gdGhlIEpTT05jb250YWluZXIgYW5kIHRoZSB0YXJnZXQgU1ZHIHN2Z0NvbnRhaW5lciBoYXZlIHRvIGJlIHN1cHBsaWVkIGlzIHNvIHRoZSBsZWdlbmQgY2FuIHVzZSB0aGVzZSBmdW5jdGlvbnNcbiAqIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcGFyYW0ge09iamVjdH0gZ3JvdXBUZW1wbGF0ZTogQSB0ZW1wbGF0ZSBjb250YWluaW5nIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gZHJhdyB0aGUgZGF0YXBvaW50IGUuZy4sIHtzdHlsZTogJ2NpcmNsZScsIHNpemU6IDUsIGNsYXNzTmFtZTogJ2NsYXNzTmFtZScgfVxuICogQHBhcmFtIHtPYmplY3R9IEpTT05jb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdmdDb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBsYWJlbE9ialxuICogQHJldHVybnMge3Zpcy5Qb2ludEl0ZW19XG4gKi9cbmZ1bmN0aW9uIGRyYXdQb2ludCh4LCB5LCBncm91cFRlbXBsYXRlLCBKU09OY29udGFpbmVyLCBzdmdDb250YWluZXIsIGxhYmVsT2JqKSB7XG4gIHZhciBwb2ludDtcbiAgaWYgKGdyb3VwVGVtcGxhdGUuc3R5bGUgPT0gJ2NpcmNsZScpIHtcbiAgICBwb2ludCA9IGdldFNWR0VsZW1lbnQoJ2NpcmNsZScsIEpTT05jb250YWluZXIsIHN2Z0NvbnRhaW5lcik7XG4gICAgcG9pbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjeFwiLCB4KTtcbiAgICBwb2ludC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImN5XCIsIHkpO1xuICAgIHBvaW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiclwiLCAwLjUgKiBncm91cFRlbXBsYXRlLnNpemUpO1xuICB9XG4gIGVsc2Uge1xuICAgIHBvaW50ID0gZ2V0U1ZHRWxlbWVudCgncmVjdCcsIEpTT05jb250YWluZXIsIHN2Z0NvbnRhaW5lcik7XG4gICAgcG9pbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIHggLSAwLjUgKiBncm91cFRlbXBsYXRlLnNpemUpO1xuICAgIHBvaW50LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCB5IC0gMC41ICogZ3JvdXBUZW1wbGF0ZS5zaXplKTtcbiAgICBwb2ludC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIGdyb3VwVGVtcGxhdGUuc2l6ZSk7XG4gICAgcG9pbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJoZWlnaHRcIiwgZ3JvdXBUZW1wbGF0ZS5zaXplKTtcbiAgfVxuXG4gIGlmIChncm91cFRlbXBsYXRlLnN0eWxlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcG9pbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHlsZVwiLCBncm91cFRlbXBsYXRlLnN0eWxlcyk7XG4gIH1cbiAgcG9pbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGFzc1wiLCBncm91cFRlbXBsYXRlLmNsYXNzTmFtZSArIFwiIHZpcy1wb2ludFwiKTtcbiAgLy9oYW5kbGUgbGFiZWxcblxuXG4gIGlmIChsYWJlbE9iaikge1xuICAgIHZhciBsYWJlbCA9IGdldFNWR0VsZW1lbnQoJ3RleHQnLCBKU09OY29udGFpbmVyLCBzdmdDb250YWluZXIpO1xuICAgIGlmIChsYWJlbE9iai54T2Zmc2V0KSB7XG4gICAgICB4ID0geCArIGxhYmVsT2JqLnhPZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKGxhYmVsT2JqLnlPZmZzZXQpIHtcbiAgICAgIHkgPSB5ICsgbGFiZWxPYmoueU9mZnNldDtcbiAgICB9XG4gICAgaWYgKGxhYmVsT2JqLmNvbnRlbnQpIHtcbiAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gbGFiZWxPYmouY29udGVudDtcbiAgICB9XG5cbiAgICBpZiAobGFiZWxPYmouY2xhc3NOYW1lKSB7XG4gICAgICBsYWJlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsYXNzXCIsIGxhYmVsT2JqLmNsYXNzTmFtZSAgKyBcIiB2aXMtbGFiZWxcIik7XG4gICAgfVxuICAgIGxhYmVsLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCB4KTtcbiAgICBsYWJlbC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgeSk7XG4gIH1cblxuICByZXR1cm4gcG9pbnQ7XG59XG5cbi8qKlxuICogZHJhdyBhIGJhciBTVkcgZWxlbWVudCBjZW50ZXJlZCBvbiB0aGUgWCBjb29yZGluYXRlXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc05hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBKU09OY29udGFpbmVyXG4gKiBAcGFyYW0ge09iamVjdH0gc3ZnQ29udGFpbmVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVcbiAqL1xuZnVuY3Rpb24gZHJhd0JhciAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY2xhc3NOYW1lLCBKU09OY29udGFpbmVyLCBzdmdDb250YWluZXIsIHN0eWxlKSB7XG4gIGlmIChoZWlnaHQgIT0gMCkge1xuICAgIGlmIChoZWlnaHQgPCAwKSB7XG4gICAgICBoZWlnaHQgKj0gLTE7XG4gICAgICB5IC09IGhlaWdodDtcbiAgICB9XG4gICAgdmFyIHJlY3QgPSBnZXRTVkdFbGVtZW50KCdyZWN0JyxKU09OY29udGFpbmVyLCBzdmdDb250YWluZXIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIHggLSAwLjUgKiB3aWR0aCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgeSk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIHdpZHRoKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIGhlaWdodCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsYXNzXCIsIGNsYXNzTmFtZSk7XG4gICAgaWYgKHN0eWxlKSB7XG4gICAgICByZWN0LnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3R5bGVcIiwgc3R5bGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGdldCBkZWZhdWx0IGxhbmd1YWdlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXROYXZpZ2F0b3JMYW5ndWFnZSgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoIW5hdmlnYXRvcikgcmV0dXJuICdlbic7XG4gICAgaWYgKG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBuYXZpZ2F0b3IubGFuZ3VhZ2VzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmF2aWdhdG9yLnVzZXJMYW5ndWFnZSB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZSB8fCAnZW4nO1xuICAgIH1cbiAgfSBcbiAgY2F0Y2goZXJyb3IpIHtcbiAgICByZXR1cm4gJ2VuJztcbiAgfVxufVxuXG4vKiogRGF0YVNjYWxlICovXG5jbGFzcyBEYXRhU2NhbGUge1xuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAgICogQHBhcmFtIHtib29sZWFufSBhdXRvU2NhbGVTdGFydFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGF1dG9TY2FsZUVuZFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29udGFpbmVySGVpZ2h0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYWpvckNoYXJIZWlnaHRcbiAgICogQHBhcmFtIHtib29sZWFufSB6ZXJvQWxpZ25cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gZm9ybWF0dGluZ0Z1bmN0aW9uXG4gICAqIEBjb25zdHJ1Y3RvciBEYXRhU2NhbGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHN0YXJ0LFxuICAgIGVuZCxcbiAgICBhdXRvU2NhbGVTdGFydCxcbiAgICBhdXRvU2NhbGVFbmQsXG4gICAgY29udGFpbmVySGVpZ2h0LFxuICAgIG1ham9yQ2hhckhlaWdodCxcbiAgICB6ZXJvQWxpZ24gPSBmYWxzZSxcbiAgICBmb3JtYXR0aW5nRnVuY3Rpb249ZmFsc2UpIHtcbiAgICB0aGlzLm1ham9yU3RlcHMgPSBbMSwgMiwgNSwgMTBdO1xuICAgIHRoaXMubWlub3JTdGVwcyA9IFswLjI1LCAwLjUsIDEsIDJdO1xuICAgIHRoaXMuY3VzdG9tTGluZXMgPSBudWxsO1xuXG4gICAgdGhpcy5jb250YWluZXJIZWlnaHQgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgdGhpcy5tYWpvckNoYXJIZWlnaHQgPSBtYWpvckNoYXJIZWlnaHQ7XG4gICAgdGhpcy5fc3RhcnQgPSBzdGFydDtcbiAgICB0aGlzLl9lbmQgPSBlbmQ7XG5cbiAgICB0aGlzLnNjYWxlID0gMTtcbiAgICB0aGlzLm1pbm9yU3RlcElkeCA9IC0xO1xuICAgIHRoaXMubWFnbml0dWRlZmFjdG9yID0gMTtcbiAgICB0aGlzLmRldGVybWluZVNjYWxlKCk7XG5cbiAgICB0aGlzLnplcm9BbGlnbiA9IHplcm9BbGlnbjtcbiAgICB0aGlzLmF1dG9TY2FsZVN0YXJ0ID0gYXV0b1NjYWxlU3RhcnQ7XG4gICAgdGhpcy5hdXRvU2NhbGVFbmQgPSBhdXRvU2NhbGVFbmQ7XG5cbiAgICB0aGlzLmZvcm1hdHRpbmdGdW5jdGlvbiA9IGZvcm1hdHRpbmdGdW5jdGlvbjtcblxuICAgIGlmIChhdXRvU2NhbGVTdGFydCB8fCBhdXRvU2NhbGVFbmQpIHtcbiAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgIGNvbnN0IHJvdW5kVG9NaW5vciA9IHZhbHVlID0+IHtcbiAgICAgICAgY29uc3Qgcm91bmRlZCA9IHZhbHVlIC0gKHZhbHVlICUgKG1lLm1hZ25pdHVkZWZhY3RvciAqIG1lLm1pbm9yU3RlcHNbbWUubWlub3JTdGVwSWR4XSkpO1xuICAgICAgICBpZiAodmFsdWUgJSAobWUubWFnbml0dWRlZmFjdG9yICogbWUubWlub3JTdGVwc1ttZS5taW5vclN0ZXBJZHhdKSA+IDAuNSAqIChtZS5tYWduaXR1ZGVmYWN0b3IgKiBtZS5taW5vclN0ZXBzW21lLm1pbm9yU3RlcElkeF0pKSB7XG4gICAgICAgICAgcmV0dXJuIHJvdW5kZWQgKyAobWUubWFnbml0dWRlZmFjdG9yICogbWUubWlub3JTdGVwc1ttZS5taW5vclN0ZXBJZHhdKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcm91bmRlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChhdXRvU2NhbGVTdGFydCkge1xuICAgICAgICB0aGlzLl9zdGFydCAtPSB0aGlzLm1hZ25pdHVkZWZhY3RvciAqIDIgKiB0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdO1xuICAgICAgICB0aGlzLl9zdGFydCA9IHJvdW5kVG9NaW5vcih0aGlzLl9zdGFydCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdXRvU2NhbGVFbmQpIHtcbiAgICAgICAgdGhpcy5fZW5kICs9IHRoaXMubWFnbml0dWRlZmFjdG9yICogdGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtcbiAgICAgICAgdGhpcy5fZW5kID0gcm91bmRUb01pbm9yKHRoaXMuX2VuZCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRldGVybWluZVNjYWxlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldCBjaGFydCBoZWlnaHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IG1ham9yQ2hhckhlaWdodCBcbiAgICovXG4gIHNldENoYXJIZWlnaHQobWFqb3JDaGFySGVpZ2h0KSB7XG4gICAgdGhpcy5tYWpvckNoYXJIZWlnaHQgPSBtYWpvckNoYXJIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogc2V0IGhlaWdodFxuICAgKiBAcGFyYW0ge251bWJlcn0gY29udGFpbmVySGVpZ2h0IFxuICAgKi9cbiAgc2V0SGVpZ2h0KGNvbnRhaW5lckhlaWdodCkge1xuICAgIHRoaXMuY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVySGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIGRldGVybWluZSBzY2FsZVxuICAgKi9cbiAgZGV0ZXJtaW5lU2NhbGUoKSB7XG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLl9lbmQgLSB0aGlzLl9zdGFydDtcbiAgICB0aGlzLnNjYWxlID0gdGhpcy5jb250YWluZXJIZWlnaHQgLyByYW5nZTtcbiAgICBjb25zdCBtaW5pbXVtU3RlcFZhbHVlID0gdGhpcy5tYWpvckNoYXJIZWlnaHQgLyB0aGlzLnNjYWxlO1xuICAgIGNvbnN0IG9yZGVyT2ZNYWduaXR1ZGUgPSAocmFuZ2UgPiAwKVxuICAgICAgICA/IE1hdGgucm91bmQoTWF0aC5sb2cocmFuZ2UpIC8gTWF0aC5MTjEwKVxuICAgICAgICA6IDA7XG5cbiAgICB0aGlzLm1pbm9yU3RlcElkeCA9IC0xO1xuICAgIHRoaXMubWFnbml0dWRlZmFjdG9yID0gTWF0aC5wb3coMTAsIG9yZGVyT2ZNYWduaXR1ZGUpO1xuXG4gICAgbGV0IHN0YXJ0ID0gMDtcbiAgICBpZiAob3JkZXJPZk1hZ25pdHVkZSA8IDApIHtcbiAgICAgIHN0YXJ0ID0gb3JkZXJPZk1hZ25pdHVkZTtcbiAgICB9XG5cbiAgICBsZXQgc29sdXRpb25Gb3VuZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGwgPSBzdGFydDsgTWF0aC5hYnMobCkgPD0gTWF0aC5hYnMob3JkZXJPZk1hZ25pdHVkZSk7IGwrKykge1xuICAgICAgdGhpcy5tYWduaXR1ZGVmYWN0b3IgPSBNYXRoLnBvdygxMCwgbCk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMubWlub3JTdGVwcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjb25zdCBzdGVwU2l6ZSA9IHRoaXMubWFnbml0dWRlZmFjdG9yICogdGhpcy5taW5vclN0ZXBzW2pdO1xuICAgICAgICBpZiAoc3RlcFNpemUgPj0gbWluaW11bVN0ZXBWYWx1ZSkge1xuICAgICAgICAgIHNvbHV0aW9uRm91bmQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMubWlub3JTdGVwSWR4ID0gajtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNvbHV0aW9uRm91bmQgPT09IHRydWUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgaWYgdmFsdWUgaXMgbWFqb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBcbiAgICovXG4gIGlzX21ham9yKHZhbHVlKSB7XG4gICAgcmV0dXJuICh2YWx1ZSAlICh0aGlzLm1hZ25pdHVkZWZhY3RvciAqIHRoaXMubWFqb3JTdGVwc1t0aGlzLm1pbm9yU3RlcElkeF0pID09PSAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIHN0ZXAgc2l6ZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBcbiAgICovXG4gIGdldFN0ZXAoKSB7XG4gICAgcmV0dXJuIHRoaXMubWFnbml0dWRlZmFjdG9yICogdGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGZpcnN0IG1ham9yXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFxuICAgKi9cbiAgZ2V0Rmlyc3RNYWpvcigpIHtcbiAgICBjb25zdCBtYWpvclN0ZXAgPSB0aGlzLm1hZ25pdHVkZWZhY3RvciAqIHRoaXMubWFqb3JTdGVwc1t0aGlzLm1pbm9yU3RlcElkeF07XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHRoaXMuX3N0YXJ0ICsgKChtYWpvclN0ZXAgLSAodGhpcy5fc3RhcnQgJSBtYWpvclN0ZXApKSAlIG1ham9yU3RlcCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgZmlyc3QgbWFqb3JcbiAgICogQHBhcmFtIHtkYXRlfSBjdXJyZW50XG4gICAqIEByZXR1cm5zIHtkYXRlfSBmb3JtYXR0ZWQgZGF0ZVxuICAgKi9cbiAgZm9ybWF0VmFsdWUoY3VycmVudCkge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9IGN1cnJlbnQudG9QcmVjaXNpb24oNSk7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmZvcm1hdHRpbmdGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSB0aGlzLmZvcm1hdHRpbmdGdW5jdGlvbihjdXJyZW50KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJldHVyblZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIGAke3JldHVyblZhbHVlfWA7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByZXR1cm5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICByZXR1cm4gY3VycmVudC50b1ByZWNpc2lvbig1KTtcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm5zIGxpbmVzXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IGxpbmVzXG4gICAqL1xuICBnZXRMaW5lcygpIHtcbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmdldFN0ZXAoKTtcbiAgICBjb25zdCBib3R0b21PZmZzZXQgPSAoc3RlcCAtICh0aGlzLl9zdGFydCAlIHN0ZXApKSAlIHN0ZXA7XG4gICAgZm9yIChsZXQgaSA9ICh0aGlzLl9zdGFydCArIGJvdHRvbU9mZnNldCk7IHRoaXMuX2VuZC1pID4gMC4wMDAwMTsgaSArPSBzdGVwKSB7XG4gICAgICBpZiAoaSAhPSB0aGlzLl9zdGFydCkgeyAvL1NraXAgdGhlIGJvdHRvbSBsaW5lXG4gICAgICAgIGxpbmVzLnB1c2goe21ham9yOiB0aGlzLmlzX21ham9yKGkpLCB5OiB0aGlzLmNvbnZlcnRWYWx1ZShpKSwgdmFsOiB0aGlzLmZvcm1hdFZhbHVlKGkpfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBmb2xsb3cgc2NhbGVcbiAgICogQHBhcmFtIHtvYmplY3R9IG90aGVyXG4gICAqL1xuICBmb2xsb3dTY2FsZShvdGhlcikge1xuICAgIGNvbnN0IG9sZFN0ZXBJZHggPSB0aGlzLm1pbm9yU3RlcElkeDtcbiAgICBjb25zdCBvbGRTdGFydCA9IHRoaXMuX3N0YXJ0O1xuICAgIGNvbnN0IG9sZEVuZCA9IHRoaXMuX2VuZDtcblxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICBjb25zdCBpbmNyZWFzZU1hZ25pdHVkZSA9ICgpID0+IHtcbiAgICAgIG1lLm1hZ25pdHVkZWZhY3RvciAqPSAyO1xuICAgIH07XG4gICAgY29uc3QgZGVjcmVhc2VNYWduaXR1ZGUgPSAoKSA9PiB7XG4gICAgICBtZS5tYWduaXR1ZGVmYWN0b3IgLz0gMjtcbiAgICB9O1xuXG4gICAgaWYgKChvdGhlci5taW5vclN0ZXBJZHggPD0gMSAmJiB0aGlzLm1pbm9yU3RlcElkeCA8PSAxKSB8fCAob3RoZXIubWlub3JTdGVwSWR4ID4gMSAmJiB0aGlzLm1pbm9yU3RlcElkeCA+IDEpKSA7IGVsc2UgaWYgKG90aGVyLm1pbm9yU3RlcElkeCA8IHRoaXMubWlub3JTdGVwSWR4KSB7XG4gICAgICAvL0knbSA1LCB0aGV5IGFyZSA0IHBlciBtYWpvci5cbiAgICAgIHRoaXMubWlub3JTdGVwSWR4ID0gMTtcbiAgICAgIGlmIChvbGRTdGVwSWR4ID09IDIpIHtcbiAgICAgICAgaW5jcmVhc2VNYWduaXR1ZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlYXNlTWFnbml0dWRlKCk7XG4gICAgICAgIGluY3JlYXNlTWFnbml0dWRlKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vSSdtIDQsIHRoZXkgYXJlIDUgcGVyIG1ham9yXG4gICAgICB0aGlzLm1pbm9yU3RlcElkeCA9IDI7XG4gICAgICBpZiAob2xkU3RlcElkeCA9PSAxKSB7XG4gICAgICAgIGRlY3JlYXNlTWFnbml0dWRlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNyZWFzZU1hZ25pdHVkZSgpO1xuICAgICAgICBkZWNyZWFzZU1hZ25pdHVkZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vR2V0IG1hc3RlcnMgc3RhdHM6XG4gICAgY29uc3Qgb3RoZXJaZXJvID0gb3RoZXIuY29udmVydFZhbHVlKDApO1xuICAgIGNvbnN0IG90aGVyU3RlcCA9IG90aGVyLmdldFN0ZXAoKSAqIG90aGVyLnNjYWxlO1xuXG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIC8vTG9vcCB1bnRpbCBtYWduaXR1ZGUgaXMgY29ycmVjdCBmb3IgZ2l2ZW4gY29uc3RyYWlucy5cbiAgICB3aGlsZSAoIWRvbmUgJiYgY291bnQrKyA8NSkge1xuXG4gICAgICAvL0dldCBteSBzdGF0czpcbiAgICAgIHRoaXMuc2NhbGUgPSBvdGhlclN0ZXAgLyAodGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSAqIHRoaXMubWFnbml0dWRlZmFjdG9yKTtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5jb250YWluZXJIZWlnaHQgLyB0aGlzLnNjYWxlO1xuXG4gICAgICAvL0ZvciB0aGUgY2FzZSB0aGUgbWFnbml0dWRlZmFjdG9yIGhhcyBjaGFuZ2VkOlxuICAgICAgdGhpcy5fc3RhcnQgPSBvbGRTdGFydDtcbiAgICAgIHRoaXMuX2VuZCA9IHRoaXMuX3N0YXJ0ICsgbmV3UmFuZ2U7XG5cbiAgICAgIGNvbnN0IG15T3JpZ2luYWxaZXJvID0gdGhpcy5fZW5kICogdGhpcy5zY2FsZTtcbiAgICAgIGNvbnN0IG1ham9yU3RlcCA9IHRoaXMubWFnbml0dWRlZmFjdG9yICogdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtcbiAgICAgIGNvbnN0IG1ham9yT2Zmc2V0ID0gdGhpcy5nZXRGaXJzdE1ham9yKCkgLSBvdGhlci5nZXRGaXJzdE1ham9yKCk7XG5cbiAgICAgIGlmICh0aGlzLnplcm9BbGlnbikge1xuICAgICAgICBjb25zdCB6ZXJvT2Zmc2V0ID0gb3RoZXJaZXJvIC0gbXlPcmlnaW5hbFplcm87XG4gICAgICAgIHRoaXMuX2VuZCArPSAoemVyb09mZnNldCAvIHRoaXMuc2NhbGUpO1xuICAgICAgICB0aGlzLl9zdGFydCA9IHRoaXMuX2VuZCAtIG5ld1JhbmdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9TY2FsZVN0YXJ0KSB7XG4gICAgICAgICAgdGhpcy5fc3RhcnQgKz0gbWFqb3JTdGVwIC0gKG1ham9yT2Zmc2V0IC8gdGhpcy5zY2FsZSk7XG4gICAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fc3RhcnQgKyBuZXdSYW5nZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9zdGFydCAtPSBtYWpvck9mZnNldCAvIHRoaXMuc2NhbGU7XG4gICAgICAgICAgdGhpcy5fZW5kID0gdGhpcy5fc3RhcnQgKyBuZXdSYW5nZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmF1dG9TY2FsZUVuZCAmJiB0aGlzLl9lbmQgPiBvbGRFbmQrMC4wMDAwMSkge1xuICAgICAgICAvL05lZWQgdG8gZGVjcmVhc2UgbWFnbml0dWRlIHRvIHByZXZlbnQgc2NhbGUgb3ZlcnNob290ISAoZW5kKVxuICAgICAgICBkZWNyZWFzZU1hZ25pdHVkZSgpO1xuICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmF1dG9TY2FsZVN0YXJ0ICYmIHRoaXMuX3N0YXJ0IDwgb2xkU3RhcnQtMC4wMDAwMSkge1xuICAgICAgICBpZiAodGhpcy56ZXJvQWxpZ24gJiYgb2xkU3RhcnQgPj0gMCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIkNhbid0IGFkaGVyZSB0byBnaXZlbiAnbWluJyByYW5nZSwgZHVlIHRvIHplcm9hbGlnblwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL05lZWQgdG8gZGVjcmVhc2UgbWFnbml0dWRlIHRvIHByZXZlbnQgc2NhbGUgb3ZlcnNob290ISAoc3RhcnQpXG4gICAgICAgICAgZGVjcmVhc2VNYWduaXR1ZGUoKTtcbiAgICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmF1dG9TY2FsZVN0YXJ0ICYmIHRoaXMuYXV0b1NjYWxlRW5kICYmIG5ld1JhbmdlIDwgKG9sZEVuZC1vbGRTdGFydCkpe1xuICAgICAgICBpbmNyZWFzZU1hZ25pdHVkZSgpO1xuICAgICAgICBkb25lID0gZmFsc2U7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZG9uZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNvbnZlcnQgdmFsdWVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFxuICAgKi9cbiAgY29udmVydFZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVySGVpZ2h0IC0gKCh2YWx1ZSAtIHRoaXMuX3N0YXJ0KSAqIHRoaXMuc2NhbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgc2NyZWVuIHRvIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwaXhlbHNcbiAgICogQHJldHVybnMge251bWJlcn0gXG4gICAqL1xuICBzY3JlZW5Ub1ZhbHVlKHBpeGVscykge1xuICAgIHJldHVybiAoKHRoaXMuY29udGFpbmVySGVpZ2h0IC0gcGl4ZWxzKSAvIHRoaXMuc2NhbGUpICsgdGhpcy5fc3RhcnQ7XG4gIH1cbn1cblxuLyoqIEEgaG9yaXpvbnRhbCB0aW1lIGF4aXMgKi9cbmNsYXNzIERhdGFBeGlzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gYm9keVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAgICAgICAgU2VlIERhdGFBeGlzLnNldE9wdGlvbnMgZm9yIHRoZSBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKiBAcGFyYW0ge1NWR0VsZW1lbnR9IHN2Z1xuICogQHBhcmFtIHt0aW1lbGluZS5MaW5lR3JhcGgub3B0aW9uc30gbGluZWdyYXBoT3B0aW9uc1xuICogQGNvbnN0cnVjdG9yIERhdGFBeGlzXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqL1xuICBjb25zdHJ1Y3Rvcihib2R5LCBvcHRpb25zLCBzdmcsIGxpbmVncmFwaE9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuaWQgPSB2NCgpO1xuICAgIHRoaXMuYm9keSA9IGJvZHk7XG5cbiAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgb3JpZW50YXRpb246ICdsZWZ0JywgIC8vIHN1cHBvcnRlZDogJ2xlZnQnLCAncmlnaHQnXG4gICAgICBzaG93TWlub3JMYWJlbHM6IHRydWUsXG4gICAgICBzaG93TWFqb3JMYWJlbHM6IHRydWUsXG4gICAgICBzaG93V2Vla1NjYWxlOiBmYWxzZSxcbiAgICAgIGljb25zOiBmYWxzZSxcbiAgICAgIG1ham9yTGluZXNPZmZzZXQ6IDcsXG4gICAgICBtaW5vckxpbmVzT2Zmc2V0OiA0LFxuICAgICAgbGFiZWxPZmZzZXRYOiAxMCxcbiAgICAgIGxhYmVsT2Zmc2V0WTogMixcbiAgICAgIGljb25XaWR0aDogMjAsXG4gICAgICB3aWR0aDogJzQwcHgnLFxuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduWmVyb3M6IHRydWUsXG4gICAgICBsZWZ0OiB7XG4gICAgICAgIHJhbmdlOiB7bWluOiB1bmRlZmluZWQsIG1heDogdW5kZWZpbmVkfSxcbiAgICAgICAgZm9ybWF0KHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQodmFsdWUudG9QcmVjaXNpb24oMykpfWA7XG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7dGV4dDogdW5kZWZpbmVkLCBzdHlsZTogdW5kZWZpbmVkfVxuICAgICAgfSxcbiAgICAgIHJpZ2h0OiB7XG4gICAgICAgIHJhbmdlOiB7bWluOiB1bmRlZmluZWQsIG1heDogdW5kZWZpbmVkfSxcbiAgICAgICAgZm9ybWF0KHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnNlRmxvYXQodmFsdWUudG9QcmVjaXNpb24oMykpfWA7XG4gICAgICAgIH0sXG4gICAgICAgIHRpdGxlOiB7dGV4dDogdW5kZWZpbmVkLCBzdHlsZTogdW5kZWZpbmVkfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmxpbmVncmFwaE9wdGlvbnMgPSBsaW5lZ3JhcGhPcHRpb25zO1xuICAgIHRoaXMubGluZWdyYXBoU1ZHID0gc3ZnO1xuICAgIHRoaXMucHJvcHMgPSB7fTtcbiAgICB0aGlzLkRPTWVsZW1lbnRzID0geyAvLyBkeW5hbWljIGVsZW1lbnRzXG4gICAgICBsaW5lczoge30sXG4gICAgICBsYWJlbHM6IHt9LFxuICAgICAgdGl0bGU6IHt9XG4gICAgfTtcblxuICAgIHRoaXMuZG9tID0ge307XG4gICAgdGhpcy5zY2FsZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJhbmdlID0ge3N0YXJ0OiAwLCBlbmQ6IDB9O1xuXG4gICAgdGhpcy5vcHRpb25zID0gdXRpbC5leHRlbmQoe30sIHRoaXMuZGVmYXVsdE9wdGlvbnMpO1xuICAgIHRoaXMuY29udmVyc2lvbkZhY3RvciA9IDE7XG5cbiAgICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gICAgdGhpcy53aWR0aCA9IE51bWJlcigoYCR7dGhpcy5vcHRpb25zLndpZHRofWApLnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG4gICAgdGhpcy5taW5XaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSB0aGlzLmxpbmVncmFwaFNWRy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgdGhpcy5oaWRkZW4gPSBmYWxzZTtcblxuICAgIHRoaXMuc3RlcFBpeGVscyA9IDI1O1xuICAgIHRoaXMuemVyb0Nyb3NzaW5nID0gLTE7XG4gICAgdGhpcy5hbW91bnRPZlN0ZXBzID0gLTE7XG5cbiAgICB0aGlzLmxpbmVPZmZzZXQgPSAwO1xuICAgIHRoaXMubWFzdGVyID0gdHJ1ZTtcbiAgICB0aGlzLm1hc3RlckF4aXMgPSBudWxsO1xuICAgIHRoaXMuc3ZnRWxlbWVudHMgPSB7fTtcbiAgICB0aGlzLmljb25zUmVtb3ZlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5ncm91cHMgPSB7fTtcbiAgICB0aGlzLmFtb3VudE9mR3JvdXBzID0gMDtcblxuICAgIC8vIGNyZWF0ZSB0aGUgSFRNTCBET01cbiAgICB0aGlzLl9jcmVhdGUoKTtcbiAgICBpZiAodGhpcy5zY2FsZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3JlZHJhd0xhYmVscygpO1xuICAgIH1cbiAgICB0aGlzLmZyYW1ld29yayA9IHtzdmc6IHRoaXMuc3ZnLCBzdmdFbGVtZW50czogdGhpcy5zdmdFbGVtZW50cywgb3B0aW9uczogdGhpcy5vcHRpb25zLCBncm91cHM6IHRoaXMuZ3JvdXBzfTtcblxuICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICB0aGlzLmJvZHkuZW1pdHRlci5vbihcInZlcnRpY2FsRHJhZ1wiLCAoKSA9PiB7XG4gICAgICBtZS5kb20ubGluZUNvbnRhaW5lci5zdHlsZS50b3AgPSBgJHttZS5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcH1weGA7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBncm91cCB0byBkYXRhIGF4aXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsIFxuICAgKiBAcGFyYW0ge29iamVjdH0gZ3JhcGhPcHRpb25zXG4gICAqL1xuICBhZGRHcm91cChsYWJlbCwgZ3JhcGhPcHRpb25zKSB7XG4gICAgaWYgKCF0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShsYWJlbCkpIHtcbiAgICAgIHRoaXMuZ3JvdXBzW2xhYmVsXSA9IGdyYXBoT3B0aW9ucztcbiAgICB9XG4gICAgdGhpcy5hbW91bnRPZkdyb3VwcyArPSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIHVwZGF0ZXMgZ3JvdXAgb2YgZGF0YSBheGlzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCBcbiAgICogQHBhcmFtIHtvYmplY3R9IGdyYXBoT3B0aW9uc1xuICAgKi9cbiAgdXBkYXRlR3JvdXAobGFiZWwsIGdyYXBoT3B0aW9ucykge1xuICAgIGlmICghdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkobGFiZWwpKSB7XG4gICAgICB0aGlzLmFtb3VudE9mR3JvdXBzICs9IDE7XG4gICAgfVxuICAgIHRoaXMuZ3JvdXBzW2xhYmVsXSA9IGdyYXBoT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVzIGdyb3VwIG9mIGRhdGEgYXhpc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgXG4gICAqL1xuICByZW1vdmVHcm91cChsYWJlbCkge1xuICAgIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShsYWJlbCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmdyb3Vwc1tsYWJlbF07XG4gICAgICB0aGlzLmFtb3VudE9mR3JvdXBzIC09IDE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIHNldHMgb3B0aW9uc1xuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKi9cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIGxldCByZWRyYXcgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMub3JpZW50YXRpb24gIT0gb3B0aW9ucy5vcmllbnRhdGlvbiAmJiBvcHRpb25zLm9yaWVudGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmVkcmF3ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgICAgJ29yaWVudGF0aW9uJyxcbiAgICAgICAgJ3Nob3dNaW5vckxhYmVscycsXG4gICAgICAgICdzaG93TWFqb3JMYWJlbHMnLFxuICAgICAgICAnaWNvbnMnLFxuICAgICAgICAnbWFqb3JMaW5lc09mZnNldCcsXG4gICAgICAgICdtaW5vckxpbmVzT2Zmc2V0JyxcbiAgICAgICAgJ2xhYmVsT2Zmc2V0WCcsXG4gICAgICAgICdsYWJlbE9mZnNldFknLFxuICAgICAgICAnaWNvbldpZHRoJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3Zpc2libGUnLFxuICAgICAgICAnbGVmdCcsXG4gICAgICAgICdyaWdodCcsXG4gICAgICAgICdhbGlnblplcm9zJ1xuICAgICAgXTtcbiAgICAgIHV0aWwuc2VsZWN0aXZlRGVlcEV4dGVuZChmaWVsZHMsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAgIHRoaXMubWluV2lkdGggPSBOdW1iZXIoKGAke3RoaXMub3B0aW9ucy53aWR0aH1gKS5yZXBsYWNlKFwicHhcIiwgXCJcIikpO1xuICAgICAgaWYgKHJlZHJhdyA9PT0gdHJ1ZSAmJiB0aGlzLmRvbS5mcmFtZSkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgSFRNTCBET00gZm9yIHRoZSBEYXRhQXhpc1xuICAgKi9cbiAgX2NyZWF0ZSgpIHtcbiAgICB0aGlzLmRvbS5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoID0gdGhpcy5vcHRpb25zLndpZHRoO1xuICAgIHRoaXMuZG9tLmZyYW1lLnN0eWxlLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXG4gICAgdGhpcy5kb20ubGluZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodDtcbiAgICB0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIC8vIGNyZWF0ZSBzdmcgZWxlbWVudCBmb3IgZ3JhcGggZHJhd2luZy5cbiAgICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCBcInN2Z1wiKTtcbiAgICB0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICB0aGlzLnN2Zy5zdHlsZS50b3AgPSAnMHB4JztcbiAgICB0aGlzLnN2Zy5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgdGhpcy5zdmcuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgdGhpcy5zdmcuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gIH1cblxuICAvKipcbiAgICogcmVkcmF3cyBncm91cHMgaWNvbnNcbiAgICovXG4gIF9yZWRyYXdHcm91cEljb25zKCkge1xuICAgIHByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTtcblxuICAgIGxldCB4O1xuICAgIGNvbnN0IGljb25XaWR0aCA9IHRoaXMub3B0aW9ucy5pY29uV2lkdGg7XG4gICAgY29uc3QgaWNvbkhlaWdodCA9IDE1O1xuICAgIGNvbnN0IGljb25PZmZzZXQgPSA0O1xuICAgIGxldCB5ID0gaWNvbk9mZnNldCArIDAuNSAqIGljb25IZWlnaHQ7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgIHggPSBpY29uT2Zmc2V0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHggPSB0aGlzLndpZHRoIC0gaWNvbldpZHRoIC0gaWNvbk9mZnNldDtcbiAgICB9XG5cbiAgICBjb25zdCBncm91cEFycmF5ID0gT2JqZWN0LmtleXModGhpcy5ncm91cHMpO1xuICAgIGdyb3VwQXJyYXkuc29ydCgoYSwgYikgPT4gYSA8IGIgPyAtMSA6IDEpO1xuXG4gICAgZm9yIChjb25zdCBncm91cElkIG9mIGdyb3VwQXJyYXkpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cElkXS52aXNpYmxlID09PSB0cnVlICYmICh0aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtncm91cElkXSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W2dyb3VwSWRdID09PSB0cnVlKSkge1xuICAgICAgICB0aGlzLmdyb3Vwc1tncm91cElkXS5nZXRMZWdlbmQoaWNvbldpZHRoLCBpY29uSGVpZ2h0LCB0aGlzLmZyYW1ld29yaywgeCwgeSk7XG4gICAgICAgIHkgKz0gaWNvbkhlaWdodCArIGljb25PZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpO1xuICAgIHRoaXMuaWNvbnNSZW1vdmVkID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW5zIHVwIGljb25zXG4gICAqL1xuICBfY2xlYW51cEljb25zKCkge1xuICAgIGlmICh0aGlzLmljb25zUmVtb3ZlZCA9PT0gZmFsc2UpIHtcbiAgICAgIHByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTtcbiAgICAgIGNsZWFudXBFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTtcbiAgICAgIHRoaXMuaWNvbnNSZW1vdmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBIVE1MIERPTSBmb3IgdGhlIERhdGFBeGlzXG4gICAqL1xuICBzaG93KCkge1xuICAgIHRoaXMuaGlkZGVuID0gZmFsc2U7XG4gICAgaWYgKCF0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgdGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmJvZHkuZG9tLnJpZ2h0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmZyYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZG9tLmxpbmVDb250YWluZXIucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lQ29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIEhUTUwgRE9NIGZvciB0aGUgRGF0YUF4aXNcbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5oaWRkZW4gPSB0cnVlO1xuICAgIGlmICh0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZyYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgcmFuZ2UgKHN0YXJ0IGFuZCBlbmQpXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICAgKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gICAqL1xuICBzZXRSYW5nZShzdGFydCwgZW5kKSB7XG4gICAgdGhpcy5yYW5nZS5zdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMucmFuZ2UuZW5kID0gZW5kO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgdGhlIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbXBvbmVudCBpcyByZXNpemVkXG4gICAqL1xuICByZWRyYXcoKSB7XG4gICAgbGV0IHJlc2l6ZWQgPSBmYWxzZTtcbiAgICBsZXQgYWN0aXZlR3JvdXBzID0gMDtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGluZSBjb250YWluZXIgYWRoZXJlcyB0byB0aGUgdmVydGljYWwgc2Nyb2xsaW5nLlxuICAgIHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUudG9wID0gYCR7dGhpcy5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcH1weGA7XG5cbiAgICBmb3IgKGNvbnN0IGdyb3VwSWQgaW4gdGhpcy5ncm91cHMpIHtcbiAgICAgIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgICAgICBpZiAodGhpcy5ncm91cHNbZ3JvdXBJZF0udmlzaWJsZSA9PT0gdHJ1ZSAmJiAodGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbZ3JvdXBJZF0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtncm91cElkXSA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICBhY3RpdmVHcm91cHMrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hbW91bnRPZkdyb3VwcyA9PT0gMCB8fCBhY3RpdmVHcm91cHMgPT09IDApIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5oZWlnaHQgPSBOdW1iZXIodGhpcy5saW5lZ3JhcGhTVkcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoXCJweFwiLCBcIlwiKSk7XG5cbiAgICAgIC8vIHN2ZyBvZmZzZXRoZWlnaHQgZGlkIG5vdCB3b3JrIGluIGZpcmVmb3ggYW5kIGV4cGxvcmVyLi4uXG4gICAgICB0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuaGVpZ2h0fXB4YDtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLm9wdGlvbnMudmlzaWJsZSA9PT0gdHJ1ZSA/IE51bWJlcigoYCR7dGhpcy5vcHRpb25zLndpZHRofWApLnJlcGxhY2UoXCJweFwiLCBcIlwiKSkgOiAwO1xuXG4gICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICBjb25zdCBmcmFtZSA9IHRoaXMuZG9tLmZyYW1lO1xuXG4gICAgICAvLyB1cGRhdGUgY2xhc3NuYW1lXG4gICAgICBmcmFtZS5jbGFzc05hbWUgPSAndmlzLWRhdGEtYXhpcyc7XG5cbiAgICAgIC8vIGNhbGN1bGF0ZSBjaGFyYWN0ZXIgd2lkdGggYW5kIGhlaWdodFxuICAgICAgdGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKTtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB0aGlzLm9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICBjb25zdCBzaG93TWlub3JMYWJlbHMgPSB0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzO1xuICAgICAgY29uc3Qgc2hvd01ham9yTGFiZWxzID0gdGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscztcblxuICAgICAgY29uc3QgYmFja2dyb3VuZEhvcml6b250YWxPZmZzZXRXaWR0aCA9IHRoaXMuYm9keS5kb20uYmFja2dyb3VuZEhvcml6b250YWwub2Zmc2V0V2lkdGg7XG5cbiAgICAgIC8vIGRldGVybWluZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZWxlbWVudHMgZm9yIHRoZSBheGlzXG4gICAgICBwcm9wcy5taW5vckxhYmVsSGVpZ2h0ID0gc2hvd01pbm9yTGFiZWxzID8gcHJvcHMubWlub3JDaGFySGVpZ2h0IDogMDtcbiAgICAgIHByb3BzLm1ham9yTGFiZWxIZWlnaHQgPSBzaG93TWFqb3JMYWJlbHMgPyBwcm9wcy5tYWpvckNoYXJIZWlnaHQgOiAwO1xuXG4gICAgICBwcm9wcy5taW5vckxpbmVXaWR0aCA9IGJhY2tncm91bmRIb3Jpem9udGFsT2Zmc2V0V2lkdGggLSB0aGlzLmxpbmVPZmZzZXQgLSB0aGlzLndpZHRoICsgMiAqIHRoaXMub3B0aW9ucy5taW5vckxpbmVzT2Zmc2V0O1xuICAgICAgcHJvcHMubWlub3JMaW5lSGVpZ2h0ID0gMTtcbiAgICAgIHByb3BzLm1ham9yTGluZVdpZHRoID0gYmFja2dyb3VuZEhvcml6b250YWxPZmZzZXRXaWR0aCAtIHRoaXMubGluZU9mZnNldCAtIHRoaXMud2lkdGggKyAyICogdGhpcy5vcHRpb25zLm1ham9yTGluZXNPZmZzZXQ7XG4gICAgICBwcm9wcy5tYWpvckxpbmVIZWlnaHQgPSAxO1xuXG4gICAgICAvLyAgdGFrZSBmcmFtZSBvZmZsaW5lIHdoaWxlIHVwZGF0aW5nIChpcyBhbG1vc3QgdHdpY2UgYXMgZmFzdClcbiAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIGZyYW1lLnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgZnJhbWUuc3R5bGUubGVmdCA9ICcwJztcbiAgICAgICAgZnJhbWUuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgICAgIGZyYW1lLnN0eWxlLndpZHRoID0gYCR7dGhpcy53aWR0aH1weGA7XG4gICAgICAgIGZyYW1lLnN0eWxlLmhlaWdodCA9IGAke3RoaXMuaGVpZ2h0fXB4YDtcbiAgICAgICAgdGhpcy5wcm9wcy53aWR0aCA9IHRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LndpZHRoO1xuICAgICAgICB0aGlzLnByb3BzLmhlaWdodCA9IHRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGVsc2UgeyAvLyByaWdodFxuICAgICAgICBmcmFtZS5zdHlsZS50b3AgPSAnJztcbiAgICAgICAgZnJhbWUuc3R5bGUuYm90dG9tID0gJzAnO1xuICAgICAgICBmcmFtZS5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICBmcmFtZS5zdHlsZS53aWR0aCA9IGAke3RoaXMud2lkdGh9cHhgO1xuICAgICAgICBmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmhlaWdodH1weGA7XG4gICAgICAgIHRoaXMucHJvcHMud2lkdGggPSB0aGlzLmJvZHkuZG9tUHJvcHMucmlnaHQud2lkdGg7XG4gICAgICAgIHRoaXMucHJvcHMuaGVpZ2h0ID0gdGhpcy5ib2R5LmRvbVByb3BzLnJpZ2h0LmhlaWdodDtcbiAgICAgIH1cblxuICAgICAgcmVzaXplZCA9IHRoaXMuX3JlZHJhd0xhYmVscygpO1xuICAgICAgcmVzaXplZCA9IHRoaXMuX2lzUmVzaXplZCgpIHx8IHJlc2l6ZWQ7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaWNvbnMgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5fcmVkcmF3R3JvdXBJY29ucygpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuX2NsZWFudXBJY29ucygpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9yZWRyYXdUaXRsZShvcmllbnRhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiByZXNpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGFpbnQgbWFqb3IgYW5kIG1pbm9yIHRleHQgbGFiZWxzIGFuZCB2ZXJ0aWNhbCBncmlkIGxpbmVzXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlZHJhd0xhYmVscygpIHtcbiAgICBsZXQgcmVzaXplZCA9IGZhbHNlO1xuICAgIHByZXBhcmVFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxpbmVzKTtcbiAgICBwcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO1xuICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdGhpcy5vcHRpb25zWydvcmllbnRhdGlvbiddO1xuICAgIGNvbnN0IGN1c3RvbVJhbmdlID0gdGhpcy5vcHRpb25zW29yaWVudGF0aW9uXS5yYW5nZSAhPSB1bmRlZmluZWQgPyB0aGlzLm9wdGlvbnNbb3JpZW50YXRpb25dLnJhbmdlIDoge307XG5cbiAgICAvL092ZXJyaWRlIHJhbmdlIHdpdGggbWFudWFsIG9wdGlvbnM6XG4gICAgbGV0IGF1dG9TY2FsZUVuZCA9IHRydWU7XG4gICAgaWYgKGN1c3RvbVJhbmdlLm1heCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmFuZ2UuZW5kID0gY3VzdG9tUmFuZ2UubWF4O1xuICAgICAgYXV0b1NjYWxlRW5kID0gZmFsc2U7XG4gICAgfVxuICAgIGxldCBhdXRvU2NhbGVTdGFydCA9IHRydWU7XG4gICAgaWYgKGN1c3RvbVJhbmdlLm1pbiAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmFuZ2Uuc3RhcnQgPSBjdXN0b21SYW5nZS5taW47XG4gICAgICBhdXRvU2NhbGVTdGFydCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2NhbGUgPSBuZXcgRGF0YVNjYWxlKFxuICAgICAgdGhpcy5yYW5nZS5zdGFydCxcbiAgICAgIHRoaXMucmFuZ2UuZW5kLFxuICAgICAgYXV0b1NjYWxlU3RhcnQsXG4gICAgICBhdXRvU2NhbGVFbmQsXG4gICAgICB0aGlzLmRvbS5mcmFtZS5vZmZzZXRIZWlnaHQsXG4gICAgICB0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCxcbiAgICAgIHRoaXMub3B0aW9ucy5hbGlnblplcm9zLFxuICAgICAgdGhpcy5vcHRpb25zW29yaWVudGF0aW9uXS5mb3JtYXRcbiAgICApO1xuXG4gICAgaWYgKHRoaXMubWFzdGVyID09PSBmYWxzZSAmJiB0aGlzLm1hc3RlckF4aXMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNjYWxlLmZvbGxvd1NjYWxlKHRoaXMubWFzdGVyQXhpcy5zY2FsZSk7XG4gICAgICB0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuXG4gICAgLy9JcyB1cGRhdGVkIGluIHNpZGUtZWZmZWN0IG9mIF9yZWRyYXdMYWJlbCgpOlxuICAgIHRoaXMubWF4TGFiZWxTaXplID0gMDtcblxuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5zY2FsZS5nZXRMaW5lcygpO1xuICAgIGxpbmVzLmZvckVhY2goXG4gICAgICBsaW5lPT4ge1xuICAgICAgICBjb25zdCB5ID0gbGluZS55O1xuICAgICAgICBjb25zdCBpc01ham9yID0gbGluZS5tYWpvcjtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1snc2hvd01pbm9yTGFiZWxzJ10gJiYgaXNNYWpvciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aGlzLl9yZWRyYXdMYWJlbCh5IC0gMiwgbGluZS52YWwsIG9yaWVudGF0aW9uLCAndmlzLXktYXhpcyB2aXMtbWlub3InLCB0aGlzLnByb3BzLm1pbm9yQ2hhckhlaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzTWFqb3IpIHtcbiAgICAgICAgICBpZiAoeSA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWRyYXdMYWJlbCh5IC0gMiwgbGluZS52YWwsIG9yaWVudGF0aW9uLCAndmlzLXktYXhpcyB2aXMtbWFqb3InLCB0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1hc3RlciA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGlmIChpc01ham9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWRyYXdMaW5lKHksIG9yaWVudGF0aW9uLCAndmlzLWdyaWQgdmlzLWhvcml6b250YWwgdmlzLW1ham9yJywgdGhpcy5vcHRpb25zLm1ham9yTGluZXNPZmZzZXQsIHRoaXMucHJvcHMubWFqb3JMaW5lV2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZHJhd0xpbmUoeSwgb3JpZW50YXRpb24sICd2aXMtZ3JpZCB2aXMtaG9yaXpvbnRhbCB2aXMtbWlub3InLCB0aGlzLm9wdGlvbnMubWlub3JMaW5lc09mZnNldCwgdGhpcy5wcm9wcy5taW5vckxpbmVXaWR0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIC8vIE5vdGUgdGhhdCB0aXRsZSBpcyByb3RhdGVkLCBzbyB3ZSdyZSB1c2luZyB0aGUgaGVpZ2h0LCBub3Qgd2lkdGghXG4gICAgbGV0IHRpdGxlV2lkdGggPSAwO1xuICAgIGlmICh0aGlzLm9wdGlvbnNbb3JpZW50YXRpb25dLnRpdGxlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zW29yaWVudGF0aW9uXS50aXRsZS50ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpdGxlV2lkdGggPSB0aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodDtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vcHRpb25zLmljb25zID09PSB0cnVlID8gTWF0aC5tYXgodGhpcy5vcHRpb25zLmljb25XaWR0aCwgdGl0bGVXaWR0aCkgKyB0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYICsgMTUgOiB0aXRsZVdpZHRoICsgdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCArIDE1O1xuXG4gICAgLy8gdGhpcyB3aWxsIHJlc2l6ZSB0aGUgeUF4aXMgdG8gYWNjb21tb2RhdGUgdGhlIGxhYmVscy5cbiAgICBpZiAodGhpcy5tYXhMYWJlbFNpemUgPiAodGhpcy53aWR0aCAtIG9mZnNldCkgJiYgdGhpcy5vcHRpb25zLnZpc2libGUgPT09IHRydWUpIHtcbiAgICAgIHRoaXMud2lkdGggPSB0aGlzLm1heExhYmVsU2l6ZSArIG9mZnNldDtcbiAgICAgIHRoaXMub3B0aW9ucy53aWR0aCA9IGAke3RoaXMud2lkdGh9cHhgO1xuICAgICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpO1xuICAgICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXNpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gdGhpcyB3aWxsIHJlc2l6ZSB0aGUgeUF4aXMgaWYgaXQgaXMgdG9vIGJpZyBmb3IgdGhlIGxhYmVscy5cbiAgICBlbHNlIGlmICh0aGlzLm1heExhYmVsU2l6ZSA8ICh0aGlzLndpZHRoIC0gb2Zmc2V0KSAmJiB0aGlzLm9wdGlvbnMudmlzaWJsZSA9PT0gdHJ1ZSAmJiB0aGlzLndpZHRoID4gdGhpcy5taW5XaWR0aCkge1xuICAgICAgdGhpcy53aWR0aCA9IE1hdGgubWF4KHRoaXMubWluV2lkdGgsIHRoaXMubWF4TGFiZWxTaXplICsgb2Zmc2V0KTtcbiAgICAgIHRoaXMub3B0aW9ucy53aWR0aCA9IGAke3RoaXMud2lkdGh9cHhgO1xuICAgICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpO1xuICAgICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKTtcbiAgICAgIHRoaXMucmVkcmF3KCk7XG4gICAgICByZXNpemVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcyk7XG4gICAgICBjbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO1xuICAgICAgcmVzaXplZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiByZXNpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnZlcnRzIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBjb252ZXJ0ZWQgbnVtYmVyXG4gICAqL1xuICBjb252ZXJ0VmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5zY2FsZS5jb252ZXJ0VmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIGNvbnZlcnRzIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB4XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IHNjcmVlbiB2YWx1ZVxuICAgKi9cbiAgc2NyZWVuVG9WYWx1ZSh4KSB7XG4gICAgcmV0dXJuIHRoaXMuc2NhbGUuc2NyZWVuVG9WYWx1ZSh4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBsYWJlbCBmb3IgdGhlIGF4aXMgYXQgcG9zaXRpb24geFxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICAgKiBAcGFyYW0geyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfSBvcmllbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjaGFyYWN0ZXJIZWlnaHRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZWRyYXdMYWJlbCh5LCB0ZXh0LCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lLCBjaGFyYWN0ZXJIZWlnaHQpIHtcbiAgICAvLyByZXVzZSByZWR1bmRhbnQgbGFiZWxcbiAgICBjb25zdCBsYWJlbCA9IGdldERPTUVsZW1lbnQoJ2RpdicsIHRoaXMuRE9NZWxlbWVudHMubGFiZWxzLCB0aGlzLmRvbS5mcmFtZSk7IC8vdGhpcy5kb20ucmVkdW5kYW50LmxhYmVscy5zaGlmdCgpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICBsYWJlbC5pbm5lckhUTUwgPSB1dGlsLnhzcyh0ZXh0KTtcbiAgICBpZiAob3JpZW50YXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgbGFiZWwuc3R5bGUubGVmdCA9IGAtJHt0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYfXB4YDtcbiAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9IFwicmlnaHRcIjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBsYWJlbC5zdHlsZS5yaWdodCA9IGAtJHt0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYfXB4YDtcbiAgICAgIGxhYmVsLnN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiO1xuICAgIH1cblxuICAgIGxhYmVsLnN0eWxlLnRvcCA9IGAke3kgLSAwLjUgKiBjaGFyYWN0ZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRZfXB4YDtcblxuICAgIHRleHQgKz0gJyc7XG5cbiAgICBjb25zdCBsYXJnZXN0V2lkdGggPSBNYXRoLm1heCh0aGlzLnByb3BzLm1ham9yQ2hhcldpZHRoLCB0aGlzLnByb3BzLm1pbm9yQ2hhcldpZHRoKTtcbiAgICBpZiAodGhpcy5tYXhMYWJlbFNpemUgPCB0ZXh0Lmxlbmd0aCAqIGxhcmdlc3RXaWR0aCkge1xuICAgICAgdGhpcy5tYXhMYWJlbFNpemUgPSB0ZXh0Lmxlbmd0aCAqIGxhcmdlc3RXaWR0aDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWlub3IgbGluZSBmb3IgdGhlIGF4aXMgYXQgcG9zaXRpb24geVxuICAgKiBAcGFyYW0ge251bWJlcn0geVxuICAgKiBAcGFyYW0geyd0b3AnfCdyaWdodCd8J2JvdHRvbSd8J2xlZnQnfSBvcmllbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAgICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gICAqL1xuICBfcmVkcmF3TGluZSh5LCBvcmllbnRhdGlvbiwgY2xhc3NOYW1lLCBvZmZzZXQsIHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubWFzdGVyID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBsaW5lID0gZ2V0RE9NRWxlbWVudCgnZGl2JywgdGhpcy5ET01lbGVtZW50cy5saW5lcywgdGhpcy5kb20ubGluZUNvbnRhaW5lcik7ICAvL3RoaXMuZG9tLnJlZHVuZGFudC5saW5lcy5zaGlmdCgpO1xuICAgICAgbGluZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICBsaW5lLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICBpZiAob3JpZW50YXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICBsaW5lLnN0eWxlLmxlZnQgPSBgJHt0aGlzLndpZHRoIC0gb2Zmc2V0fXB4YDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBsaW5lLnN0eWxlLnJpZ2h0ID0gYCR7dGhpcy53aWR0aCAtIG9mZnNldH1weGA7XG4gICAgICB9XG5cbiAgICAgIGxpbmUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICBsaW5lLnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0aXRsZSBmb3IgdGhlIGF4aXNcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHsndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J30gb3JpZW50YXRpb25cbiAgICovXG4gIF9yZWRyYXdUaXRsZShvcmllbnRhdGlvbikge1xuICAgIHByZXBhcmVFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLnRpdGxlKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSB0aXRsZSBpcyBkZWZpbmVkIGZvciB0aGlzIGF4ZXNcbiAgICBpZiAodGhpcy5vcHRpb25zW29yaWVudGF0aW9uXS50aXRsZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9uc1tvcmllbnRhdGlvbl0udGl0bGUudGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB0aXRsZSA9IGdldERPTUVsZW1lbnQoJ2RpdicsIHRoaXMuRE9NZWxlbWVudHMudGl0bGUsIHRoaXMuZG9tLmZyYW1lKTtcbiAgICAgIHRpdGxlLmNsYXNzTmFtZSA9IGB2aXMteS1heGlzIHZpcy10aXRsZSB2aXMtJHtvcmllbnRhdGlvbn1gO1xuICAgICAgdGl0bGUuaW5uZXJIVE1MID0gdXRpbC54c3ModGhpcy5vcHRpb25zW29yaWVudGF0aW9uXS50aXRsZS50ZXh0KTtcblxuICAgICAgLy8gQWRkIHN0eWxlIC0gaWYgcHJvdmlkZWRcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbb3JpZW50YXRpb25dLnRpdGxlLnN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdXRpbC5hZGRDc3NUZXh0KHRpdGxlLCB0aGlzLm9wdGlvbnNbb3JpZW50YXRpb25dLnRpdGxlLnN0eWxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9yaWVudGF0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgdGl0bGUuc3R5bGUubGVmdCA9IGAke3RoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aXRsZS5zdHlsZS5yaWdodCA9IGAke3RoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0fXB4YDtcbiAgICAgIH1cblxuICAgICAgdGl0bGUuc3R5bGUud2lkdGggPSBgJHt0aGlzLmhlaWdodH1weGA7XG4gICAgfVxuXG4gICAgLy8gd2UgbmVlZCB0byBjbGVhbiB1cCBpbiBjYXNlIHdlIGRpZCBub3QgdXNlIGFsbCBlbGVtZW50cy5cbiAgICBjbGVhbnVwRWxlbWVudHModGhpcy5ET01lbGVtZW50cy50aXRsZSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRleHQgb24gdGhlIGF4aXMgKGJvdGggbWFqb3IgYW5kIG1pbm9yIGF4aXMpLlxuICAgKiBUaGUgc2l6ZSBpcyBjYWxjdWxhdGVkIG9ubHkgb25jZSBhbmQgdGhlbiBjYWNoZWQgaW4gdGhpcy5wcm9wcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jYWxjdWxhdGVDaGFyU2l6ZSgpIHtcbiAgICAvLyBkZXRlcm1pbmUgdGhlIGNoYXIgd2lkdGggYW5kIGhlaWdodCBvbiB0aGUgbWlub3IgYXhpc1xuICAgIGlmICghKCdtaW5vckNoYXJIZWlnaHQnIGluIHRoaXMucHJvcHMpKSB7XG4gICAgICBjb25zdCB0ZXh0TWlub3IgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnMCcpO1xuICAgICAgY29uc3QgbWVhc3VyZUNoYXJNaW5vciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgbWVhc3VyZUNoYXJNaW5vci5jbGFzc05hbWUgPSAndmlzLXktYXhpcyB2aXMtbWlub3IgdmlzLW1lYXN1cmUnO1xuICAgICAgbWVhc3VyZUNoYXJNaW5vci5hcHBlbmRDaGlsZCh0ZXh0TWlub3IpO1xuICAgICAgdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQobWVhc3VyZUNoYXJNaW5vcik7XG5cbiAgICAgIHRoaXMucHJvcHMubWlub3JDaGFySGVpZ2h0ID0gbWVhc3VyZUNoYXJNaW5vci5jbGllbnRIZWlnaHQ7XG4gICAgICB0aGlzLnByb3BzLm1pbm9yQ2hhcldpZHRoID0gbWVhc3VyZUNoYXJNaW5vci5jbGllbnRXaWR0aDtcblxuICAgICAgdGhpcy5kb20uZnJhbWUucmVtb3ZlQ2hpbGQobWVhc3VyZUNoYXJNaW5vcik7XG4gICAgfVxuXG4gICAgaWYgKCEoJ21ham9yQ2hhckhlaWdodCcgaW4gdGhpcy5wcm9wcykpIHtcbiAgICAgIGNvbnN0IHRleHRNYWpvciA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcwJyk7XG4gICAgICBjb25zdCBtZWFzdXJlQ2hhck1ham9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBtZWFzdXJlQ2hhck1ham9yLmNsYXNzTmFtZSA9ICd2aXMteS1heGlzIHZpcy1tYWpvciB2aXMtbWVhc3VyZSc7XG4gICAgICBtZWFzdXJlQ2hhck1ham9yLmFwcGVuZENoaWxkKHRleHRNYWpvcik7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZChtZWFzdXJlQ2hhck1ham9yKTtcblxuICAgICAgdGhpcy5wcm9wcy5tYWpvckNoYXJIZWlnaHQgPSBtZWFzdXJlQ2hhck1ham9yLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGggPSBtZWFzdXJlQ2hhck1ham9yLmNsaWVudFdpZHRoO1xuXG4gICAgICB0aGlzLmRvbS5mcmFtZS5yZW1vdmVDaGlsZChtZWFzdXJlQ2hhck1ham9yKTtcbiAgICB9XG5cbiAgICBpZiAoISgndGl0bGVDaGFySGVpZ2h0JyBpbiB0aGlzLnByb3BzKSkge1xuICAgICAgY29uc3QgdGV4dFRpdGxlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJzAnKTtcbiAgICAgIGNvbnN0IG1lYXN1cmVDaGFyVGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIG1lYXN1cmVDaGFyVGl0bGUuY2xhc3NOYW1lID0gJ3Zpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1tZWFzdXJlJztcbiAgICAgIG1lYXN1cmVDaGFyVGl0bGUuYXBwZW5kQ2hpbGQodGV4dFRpdGxlKTtcbiAgICAgIHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKG1lYXN1cmVDaGFyVGl0bGUpO1xuXG4gICAgICB0aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodCA9IG1lYXN1cmVDaGFyVGl0bGUuY2xpZW50SGVpZ2h0O1xuICAgICAgdGhpcy5wcm9wcy50aXRsZUNoYXJXaWR0aCA9IG1lYXN1cmVDaGFyVGl0bGUuY2xpZW50V2lkdGg7XG5cbiAgICAgIHRoaXMuZG9tLmZyYW1lLnJlbW92ZUNoaWxkKG1lYXN1cmVDaGFyVGl0bGUpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge251bWJlciB8IHN0cmluZ30gZ3JvdXBJZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAvLyBUT0RPOiBEZXNjcmliZSBvcHRpb25zXG4gKlxuICogQGNvbnN0cnVjdG9yIFBvaW50c1xuICovXG5mdW5jdGlvbiBQb2ludHMoZ3JvdXBJZCwgb3B0aW9ucykgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xufVxuXG4vKipcbiAqIGRyYXcgdGhlIGRhdGEgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtBcnJheX0gZGF0YXNldFxuICogQHBhcmFtIHtHcmFwaEdyb3VwfSBncm91cFxuICogQHBhcmFtIHtPYmplY3R9IGZyYW1ld29yayAgICAgICAgICAgIHwgU1ZHIERPTSBlbGVtZW50XG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldF1cbiAqL1xuUG9pbnRzLmRyYXcgPSBmdW5jdGlvbiAoZGF0YXNldCwgZ3JvdXAsIGZyYW1ld29yaywgb2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICB2YXIgY2FsbGJhY2sgPSBnZXRDYWxsYmFjayhmcmFtZXdvcmssIGdyb3VwKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgICAvLyBkcmF3IHRoZSBwb2ludCB0aGUgc2ltcGxlIHdheS5cbiAgICAgIGRyYXdQb2ludChkYXRhc2V0W2ldLnNjcmVlbl94ICsgb2Zmc2V0LCBkYXRhc2V0W2ldLnNjcmVlbl95LCBnZXRHcm91cFRlbXBsYXRlKGdyb3VwKSwgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnLCBkYXRhc2V0W2ldLmxhYmVsKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB2YXIgY2FsbGJhY2tSZXN1bHQgPSBjYWxsYmFjayhkYXRhc2V0W2ldLCBncm91cCk7IC8vIHJlc3VsdCBtaWdodCBiZSB0cnVlLCBmYWxzZSBvciBhbiBvYmplY3RcbiAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgY2FsbGJhY2tSZXN1bHQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGRyYXdQb2ludChkYXRhc2V0W2ldLnNjcmVlbl94ICsgb2Zmc2V0LCBkYXRhc2V0W2ldLnNjcmVlbl95LCBnZXRHcm91cFRlbXBsYXRlKGdyb3VwLCBjYWxsYmFja1Jlc3VsdCksIGZyYW1ld29yay5zdmdFbGVtZW50cywgZnJhbWV3b3JrLnN2ZywgZGF0YXNldFtpXS5sYWJlbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5Qb2ludHMuZHJhd0ljb24gPSBmdW5jdGlvbiAoZ3JvdXAsIHgsIHksIGljb25XaWR0aCwgaWNvbkhlaWdodCwgZnJhbWV3b3JrKSB7XG4gIHZhciBmaWxsSGVpZ2h0ID0gaWNvbkhlaWdodCAqIDAuNTtcblxuICB2YXIgb3V0bGluZSA9IGdldFNWR0VsZW1lbnQoXCJyZWN0XCIsIGZyYW1ld29yay5zdmdFbGVtZW50cywgZnJhbWV3b3JrLnN2Zyk7XG4gIG91dGxpbmUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIHgpO1xuICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCB5IC0gZmlsbEhlaWdodCk7XG4gIG91dGxpbmUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ3aWR0aFwiLCBpY29uV2lkdGgpO1xuICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaGVpZ2h0XCIsIDIgKiBmaWxsSGVpZ2h0KTtcbiAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsYXNzXCIsIFwidmlzLW91dGxpbmVcIik7XG5cbiAgLy9Eb24ndCBjYWxsIGNhbGxiYWNrIG9uIGljb25cbiAgZHJhd1BvaW50KHggKyAwLjUgKiBpY29uV2lkdGgsIHksIGdldEdyb3VwVGVtcGxhdGUoZ3JvdXApLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcpO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt2aXMuR3JvdXB9IGdyb3VwXG4gKiBAcGFyYW0ge2FueX0gY2FsbGJhY2tSZXN1bHRcbiAqIEByZXR1cm5zIHt7c3R5bGU6ICosIHN0eWxlczogKCp8c3RyaW5nKSwgc2l6ZTogKiwgY2xhc3NOYW1lOiAqfX1cbiAqL1xuZnVuY3Rpb24gZ2V0R3JvdXBUZW1wbGF0ZShncm91cCwgY2FsbGJhY2tSZXN1bHQpIHtcbiAgY2FsbGJhY2tSZXN1bHQgPSAodHlwZW9mIGNhbGxiYWNrUmVzdWx0ID09PSAndW5kZWZpbmVkJykgPyB7fSA6IGNhbGxiYWNrUmVzdWx0O1xuICByZXR1cm4ge1xuICAgIHN0eWxlOiBjYWxsYmFja1Jlc3VsdC5zdHlsZSB8fCBncm91cC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsXG4gICAgc3R5bGVzOiBjYWxsYmFja1Jlc3VsdC5zdHlsZXMgfHwgZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxcbiAgICBzaXplOiBjYWxsYmFja1Jlc3VsdC5zaXplIHx8IGdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5zaXplLFxuICAgIGNsYXNzTmFtZTogY2FsbGJhY2tSZXN1bHQuY2xhc3NOYW1lIHx8IGdyb3VwLmNsYXNzTmFtZVxuICB9O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZnJhbWV3b3JrICAgICAgICAgICAgfCBTVkcgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7dmlzLkdyb3VwfSBncm91cFxuICogQHJldHVybnMge2Z1bmN0aW9ufVxuICovXG5mdW5jdGlvbiBnZXRDYWxsYmFjayhmcmFtZXdvcmssIGdyb3VwKSB7XG4gIHZhciBjYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgLy8gY2hlY2sgZm9yIHRoZSBncmFwaDJkIG9uUmVuZGVyXG4gIGlmIChmcmFtZXdvcmsub3B0aW9ucyAmJiBmcmFtZXdvcmsub3B0aW9ucy5kcmF3UG9pbnRzICYmIGZyYW1ld29yay5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIgJiYgdHlwZW9mIGZyYW1ld29yay5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gZnJhbWV3b3JrLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlcjtcbiAgfVxuXG4gIC8vIG92ZXJyaWRlIGl0IHdpdGggdGhlIGdyb3VwIG9uUmVuZGVyIGlmIGRlZmluZWRcbiAgaWYgKGdyb3VwLmdyb3VwLm9wdGlvbnMgJiYgZ3JvdXAuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzICYmIGdyb3VwLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciAmJiB0eXBlb2YgZ3JvdXAuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyID09ICdmdW5jdGlvbicpIHtcbiAgICBjYWxsYmFjayA9IGdyb3VwLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlcjtcbiAgfVxuICByZXR1cm4gY2FsbGJhY2s7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dmlzLkdyYXBoR3JvdXAuaWR9IGdyb3VwSWRcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zICAgLy8gVE9ETzogRGVzY3JpYmUgb3B0aW9uc1xuICogQGNvbnN0cnVjdG9yIEJhcmdyYXBoXG4gKi9cbmZ1bmN0aW9uIEJhcmdyYXBoKGdyb3VwSWQsIG9wdGlvbnMpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbn1cblxuQmFyZ3JhcGguZHJhd0ljb24gPSBmdW5jdGlvbiAoZ3JvdXAsIHgsIHksIGljb25XaWR0aCwgaWNvbkhlaWdodCwgZnJhbWV3b3JrKSB7XG4gIHZhciBmaWxsSGVpZ2h0ID0gaWNvbkhlaWdodCAqIDAuNTtcbiAgdmFyIG91dGxpbmUgPSBnZXRTVkdFbGVtZW50KFwicmVjdFwiLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcpO1xuICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCB4KTtcbiAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgeSAtIGZpbGxIZWlnaHQpO1xuICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwid2lkdGhcIiwgaWNvbldpZHRoKTtcbiAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCAyICogZmlsbEhlaWdodCk7XG4gIG91dGxpbmUuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGFzc1wiLCBcInZpcy1vdXRsaW5lXCIpO1xuXG4gIHZhciBiYXJXaWR0aCA9IE1hdGgucm91bmQoMC4zICogaWNvbldpZHRoKTtcbiAgdmFyIG9yaWdpbmFsV2lkdGggPSBncm91cC5vcHRpb25zLmJhckNoYXJ0LndpZHRoO1xuICB2YXIgc2NhbGUgPSBvcmlnaW5hbFdpZHRoIC8gYmFyV2lkdGg7XG4gIHZhciBiYXIxSGVpZ2h0ID0gTWF0aC5yb3VuZCgwLjQgKiBpY29uSGVpZ2h0KTtcbiAgdmFyIGJhcjJIZWlnaHQgPSBNYXRoLnJvdW5kKDAuNzUgKiBpY29uSGVpZ2h0KTtcblxuICB2YXIgb2Zmc2V0ID0gTWF0aC5yb3VuZCgoaWNvbldpZHRoIC0gKDIgKiBiYXJXaWR0aCkpIC8gMyk7XG5cbiAgZHJhd0Jhcih4ICsgMC41ICogYmFyV2lkdGggKyBvZmZzZXQsIHkgKyBmaWxsSGVpZ2h0IC0gYmFyMUhlaWdodCAtIDEsIGJhcldpZHRoLCBiYXIxSGVpZ2h0LCBncm91cC5jbGFzc05hbWUgKyAnIHZpcy1iYXInLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcsIGdyb3VwLnN0eWxlKTtcbiAgZHJhd0Jhcih4ICsgMS41ICogYmFyV2lkdGggKyBvZmZzZXQgKyAyLCB5ICsgZmlsbEhlaWdodCAtIGJhcjJIZWlnaHQgLSAxLCBiYXJXaWR0aCwgYmFyMkhlaWdodCwgZ3JvdXAuY2xhc3NOYW1lICsgJyB2aXMtYmFyJywgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnLCBncm91cC5zdHlsZSk7XG5cbiAgaWYgKGdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkID09IHRydWUpIHtcbiAgICB2YXIgZ3JvdXBUZW1wbGF0ZSA9IHtcbiAgICAgIHN0eWxlOiBncm91cC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsXG4gICAgICBzdHlsZXM6IGdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZXMsXG4gICAgICBzaXplOiAoZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUgLyBzY2FsZSksXG4gICAgICBjbGFzc05hbWU6IGdyb3VwLmNsYXNzTmFtZVxuICAgIH07XG4gICAgZHJhd1BvaW50KHggKyAwLjUgKiBiYXJXaWR0aCArIG9mZnNldCwgeSArIGZpbGxIZWlnaHQgLSBiYXIxSGVpZ2h0IC0gMSwgZ3JvdXBUZW1wbGF0ZSwgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnKTtcbiAgICBkcmF3UG9pbnQoeCArIDEuNSAqIGJhcldpZHRoICsgb2Zmc2V0ICsgMiwgeSArIGZpbGxIZWlnaHQgLSBiYXIySGVpZ2h0IC0gMSwgZ3JvdXBUZW1wbGF0ZSwgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBkcmF3IGEgYmFyIGdyYXBoXG4gKlxuICogQHBhcmFtIHtBcnJheS48dmlzLkdyYXBoR3JvdXAuaWQ+fSBncm91cElkc1xuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3NlZEdyb3VwRGF0YVxuICogQHBhcmFtIHt7c3ZnOiBPYmplY3QsIHN2Z0VsZW1lbnRzOiBBcnJheS48T2JqZWN0Piwgb3B0aW9uczogT2JqZWN0LCBncm91cHM6IEFycmF5Ljx2aXMuR3JvdXA+fX0gZnJhbWV3b3JrXG4gKi9cbkJhcmdyYXBoLmRyYXcgPSBmdW5jdGlvbiAoZ3JvdXBJZHMsIHByb2Nlc3NlZEdyb3VwRGF0YSwgZnJhbWV3b3JrKSB7XG4gIHZhciBjb21iaW5lZERhdGEgPSBbXTtcbiAgdmFyIGludGVyc2VjdGlvbnMgPSB7fTtcbiAgdmFyIGNvcmVEaXN0YW5jZTtcbiAgdmFyIGtleSwgZHJhd0RhdGE7XG4gIHZhciBncm91cDtcbiAgdmFyIGksIGo7XG4gIHZhciBiYXJQb2ludHMgPSAwO1xuXG4gIC8vIGNvbWJpbmUgYWxsIGJhcmNoYXJ0IGRhdGFcbiAgZm9yIChpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZ3JvdXAgPSBmcmFtZXdvcmsuZ3JvdXBzW2dyb3VwSWRzW2ldXTtcbiAgICBpZiAoZ3JvdXAub3B0aW9ucy5zdHlsZSA9PT0gJ2JhcicpIHtcbiAgICAgIGlmIChncm91cC52aXNpYmxlID09PSB0cnVlICYmIChmcmFtZXdvcmsub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtncm91cElkc1tpXV0gPT09IHVuZGVmaW5lZCB8fCBmcmFtZXdvcmsub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtncm91cElkc1tpXV0gPT09IHRydWUpKSB7XG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBwcm9jZXNzZWRHcm91cERhdGFbZ3JvdXBJZHNbaV1dLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgY29tYmluZWREYXRhLnB1c2goe1xuICAgICAgICAgICAgc2NyZWVuX3g6IHByb2Nlc3NlZEdyb3VwRGF0YVtncm91cElkc1tpXV1bal0uc2NyZWVuX3gsXG4gICAgICAgICAgICBzY3JlZW5fZW5kOiBwcm9jZXNzZWRHcm91cERhdGFbZ3JvdXBJZHNbaV1dW2pdLnNjcmVlbl9lbmQsXG4gICAgICAgICAgICBzY3JlZW5feTogcHJvY2Vzc2VkR3JvdXBEYXRhW2dyb3VwSWRzW2ldXVtqXS5zY3JlZW5feSxcbiAgICAgICAgICAgIHg6IHByb2Nlc3NlZEdyb3VwRGF0YVtncm91cElkc1tpXV1bal0ueCxcbiAgICAgICAgICAgIGVuZDogcHJvY2Vzc2VkR3JvdXBEYXRhW2dyb3VwSWRzW2ldXVtqXS5lbmQsXG4gICAgICAgICAgICB5OiBwcm9jZXNzZWRHcm91cERhdGFbZ3JvdXBJZHNbaV1dW2pdLnksXG4gICAgICAgICAgICBncm91cElkOiBncm91cElkc1tpXSxcbiAgICAgICAgICAgIGxhYmVsOiBwcm9jZXNzZWRHcm91cERhdGFbZ3JvdXBJZHNbaV1dW2pdLmxhYmVsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYmFyUG9pbnRzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoYmFyUG9pbnRzID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gc29ydCBieSB0aW1lIGFuZCBieSBncm91cFxuICBjb21iaW5lZERhdGEuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIGlmIChhLnNjcmVlbl94ID09PSBiLnNjcmVlbl94KSB7XG4gICAgICByZXR1cm4gYS5ncm91cElkIDwgYi5ncm91cElkID8gLTEgOiAxO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiBhLnNjcmVlbl94IC0gYi5zY3JlZW5feDtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIGdldCBpbnRlcnNlY3Rpb25zXG4gIEJhcmdyYXBoLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhpbnRlcnNlY3Rpb25zLCBjb21iaW5lZERhdGEpO1xuXG4gIC8vIHBsb3QgYmFyY2hhcnRcbiAgZm9yIChpID0gMDsgaSA8IGNvbWJpbmVkRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGdyb3VwID0gZnJhbWV3b3JrLmdyb3Vwc1tjb21iaW5lZERhdGFbaV0uZ3JvdXBJZF07XG4gICAgdmFyIG1pbldpZHRoID0gZ3JvdXAub3B0aW9ucy5iYXJDaGFydC5taW5XaWR0aCAhPSB1bmRlZmluZWQgPyBncm91cC5vcHRpb25zLmJhckNoYXJ0Lm1pbldpZHRoIDogMC4xICogZ3JvdXAub3B0aW9ucy5iYXJDaGFydC53aWR0aDtcblxuICAgIGtleSA9IGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feDtcbiAgICB2YXIgaGVpZ2h0T2Zmc2V0ID0gMDtcbiAgICBpZiAoaW50ZXJzZWN0aW9uc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChpICsgMSA8IGNvbWJpbmVkRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgY29yZURpc3RhbmNlID0gTWF0aC5hYnMoY29tYmluZWREYXRhW2kgKyAxXS5zY3JlZW5feCAtIGtleSk7XG4gICAgICB9XG4gICAgICBkcmF3RGF0YSA9IEJhcmdyYXBoLl9nZXRTYWZlRHJhd0RhdGEoY29yZURpc3RhbmNlLCBncm91cCwgbWluV2lkdGgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBuZXh0S2V5ID0gaSArIChpbnRlcnNlY3Rpb25zW2tleV0uYW1vdW50IC0gaW50ZXJzZWN0aW9uc1trZXldLnJlc29sdmVkKTtcbiAgICAgIGlmIChuZXh0S2V5IDwgY29tYmluZWREYXRhLmxlbmd0aCkge1xuICAgICAgICBjb3JlRGlzdGFuY2UgPSBNYXRoLmFicyhjb21iaW5lZERhdGFbbmV4dEtleV0uc2NyZWVuX3ggLSBrZXkpO1xuICAgICAgfVxuICAgICAgZHJhd0RhdGEgPSBCYXJncmFwaC5fZ2V0U2FmZURyYXdEYXRhKGNvcmVEaXN0YW5jZSwgZ3JvdXAsIG1pbldpZHRoKTtcbiAgICAgIGludGVyc2VjdGlvbnNba2V5XS5yZXNvbHZlZCArPSAxO1xuXG4gICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zdGFjayA9PT0gdHJ1ZSAmJiBncm91cC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmcgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feSA8IGdyb3VwLnplcm9Qb3NpdGlvbikge1xuICAgICAgICAgIGhlaWdodE9mZnNldCA9IGludGVyc2VjdGlvbnNba2V5XS5hY2N1bXVsYXRlZE5lZ2F0aXZlO1xuICAgICAgICAgIGludGVyc2VjdGlvbnNba2V5XS5hY2N1bXVsYXRlZE5lZ2F0aXZlICs9IGdyb3VwLnplcm9Qb3NpdGlvbiAtIGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBoZWlnaHRPZmZzZXQgPSBpbnRlcnNlY3Rpb25zW2tleV0uYWNjdW11bGF0ZWRQb3NpdGl2ZTtcbiAgICAgICAgICBpbnRlcnNlY3Rpb25zW2tleV0uYWNjdW11bGF0ZWRQb3NpdGl2ZSArPSBncm91cC56ZXJvUG9zaXRpb24gLSBjb21iaW5lZERhdGFbaV0uc2NyZWVuX3k7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGdyb3VwLm9wdGlvbnMuYmFyQ2hhcnQuc2lkZUJ5U2lkZSA9PT0gdHJ1ZSkge1xuICAgICAgICBkcmF3RGF0YS53aWR0aCA9IGRyYXdEYXRhLndpZHRoIC8gaW50ZXJzZWN0aW9uc1trZXldLmFtb3VudDtcbiAgICAgICAgZHJhd0RhdGEub2Zmc2V0ICs9IChpbnRlcnNlY3Rpb25zW2tleV0ucmVzb2x2ZWQpICogZHJhd0RhdGEud2lkdGggLSAoMC41ICogZHJhd0RhdGEud2lkdGggKiAoaW50ZXJzZWN0aW9uc1trZXldLmFtb3VudCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgbGV0IGRhdGFXaWR0aCA9IGRyYXdEYXRhLndpZHRoO1xuICAgIGxldCBzdGFydCA9IGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feDtcblxuICAgIC8vIGFyZSB3ZSBkcmF3aW5nIGV4cGxpY2l0IGJveGVzPyAod2Ugc3VwcGxpZWQgYW4gZW5kIHZhbHVlKVxuICAgIGlmIChjb21iaW5lZERhdGFbaV0uc2NyZWVuX2VuZCAhPSB1bmRlZmluZWQpe1xuICAgICAgZGF0YVdpZHRoID0gY29tYmluZWREYXRhW2ldLnNjcmVlbl9lbmQgLSBjb21iaW5lZERhdGFbaV0uc2NyZWVuX3g7XG4gICAgICBzdGFydCArPSAoZGF0YVdpZHRoICogMC41KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGFydCArPSBkcmF3RGF0YS5vZmZzZXQ7XG4gICAgfVxuXG4gICAgZHJhd0JhcihzdGFydCwgY29tYmluZWREYXRhW2ldLnNjcmVlbl95IC0gaGVpZ2h0T2Zmc2V0LCBkYXRhV2lkdGgsIGdyb3VwLnplcm9Qb3NpdGlvbiAtIGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feSwgZ3JvdXAuY2xhc3NOYW1lICsgJyB2aXMtYmFyJywgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnLCBncm91cC5zdHlsZSk7XG5cbiAgICAvLyBkcmF3IHBvaW50c1xuICAgIGlmIChncm91cC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZCA9PT0gdHJ1ZSkge1xuICAgICAgbGV0IHBvaW50RGF0YSA9IHtcbiAgICAgICAgc2NyZWVuX3g6IGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feCxcbiAgICAgICAgc2NyZWVuX3k6IGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feSAtIGhlaWdodE9mZnNldCxcbiAgICAgICAgeDogY29tYmluZWREYXRhW2ldLngsXG4gICAgICAgIHk6IGNvbWJpbmVkRGF0YVtpXS55LFxuICAgICAgICBncm91cElkOiBjb21iaW5lZERhdGFbaV0uZ3JvdXBJZCxcbiAgICAgICAgbGFiZWw6IGNvbWJpbmVkRGF0YVtpXS5sYWJlbFxuICAgICAgfTtcbiAgICAgIFBvaW50cy5kcmF3KFtwb2ludERhdGFdLCBncm91cCwgZnJhbWV3b3JrLCBkcmF3RGF0YS5vZmZzZXQpO1xuICAgICAgLy9ET011dGlsLmRyYXdQb2ludChjb21iaW5lZERhdGFbaV0ueCArIGRyYXdEYXRhLm9mZnNldCwgY29tYmluZWREYXRhW2ldLnksIGdyb3VwLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIEZpbGwgdGhlIGludGVyc2VjdGlvbnMgb2JqZWN0IHdpdGggY291bnRlcnMgb2YgaG93IG1hbnkgZGF0YXBvaW50cyBzaGFyZSB0aGUgc2FtZSB4IGNvb3JkaW5hdGVzXG4gKiBAcGFyYW0ge09iamVjdH0gaW50ZXJzZWN0aW9uc1xuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gY29tYmluZWREYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5CYXJncmFwaC5fZ2V0RGF0YUludGVyc2VjdGlvbnMgPSBmdW5jdGlvbiAoaW50ZXJzZWN0aW9ucywgY29tYmluZWREYXRhKSB7XG4gIC8vIGdldCBpbnRlcnNlY3Rpb25zXG4gIHZhciBjb3JlRGlzdGFuY2U7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29tYmluZWREYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGkgKyAxIDwgY29tYmluZWREYXRhLmxlbmd0aCkge1xuICAgICAgY29yZURpc3RhbmNlID0gTWF0aC5hYnMoY29tYmluZWREYXRhW2kgKyAxXS5zY3JlZW5feCAtIGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feCk7XG4gICAgfVxuICAgIGlmIChpID4gMCkge1xuICAgICAgY29yZURpc3RhbmNlID0gTWF0aC5taW4oY29yZURpc3RhbmNlLCBNYXRoLmFicyhjb21iaW5lZERhdGFbaSAtIDFdLnNjcmVlbl94IC0gY29tYmluZWREYXRhW2ldLnNjcmVlbl94KSk7XG4gICAgfVxuICAgIGlmIChjb3JlRGlzdGFuY2UgPT09IDApIHtcbiAgICAgIGlmIChpbnRlcnNlY3Rpb25zW2NvbWJpbmVkRGF0YVtpXS5zY3JlZW5feF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpbnRlcnNlY3Rpb25zW2NvbWJpbmVkRGF0YVtpXS5zY3JlZW5feF0gPSB7XG4gICAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICAgIHJlc29sdmVkOiAwLFxuICAgICAgICAgIGFjY3VtdWxhdGVkUG9zaXRpdmU6IDAsXG4gICAgICAgICAgYWNjdW11bGF0ZWROZWdhdGl2ZTogMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaW50ZXJzZWN0aW9uc1tjb21iaW5lZERhdGFbaV0uc2NyZWVuX3hdLmFtb3VudCArPSAxO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIEdldCB0aGUgd2lkdGggYW5kIG9mZnNldCBmb3IgYmFyZ3JhcGhzIGJhc2VkIG9uIHRoZSBjb3JlZGlzdGFuY2UgYmV0d2VlbiBkYXRhcG9pbnRzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvcmVEaXN0YW5jZVxuICogQHBhcmFtIHt2aXMuR3JvdXB9IGdyb3VwXG4gKiBAcGFyYW0ge251bWJlcn0gbWluV2lkdGhcbiAqIEByZXR1cm5zIHt7d2lkdGg6IG51bWJlciwgb2Zmc2V0OiBudW1iZXJ9fVxuICogQHByaXZhdGVcbiAqL1xuQmFyZ3JhcGguX2dldFNhZmVEcmF3RGF0YSA9IGZ1bmN0aW9uIChjb3JlRGlzdGFuY2UsIGdyb3VwLCBtaW5XaWR0aCkge1xuICB2YXIgd2lkdGgsIG9mZnNldDtcbiAgaWYgKGNvcmVEaXN0YW5jZSA8IGdyb3VwLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGggJiYgY29yZURpc3RhbmNlID4gMCkge1xuICAgIHdpZHRoID0gY29yZURpc3RhbmNlIDwgbWluV2lkdGggPyBtaW5XaWR0aCA6IGNvcmVEaXN0YW5jZTtcblxuICAgIG9mZnNldCA9IDA7IC8vIHJlY2FsY3VsYXRlIG9mZnNldCB3aXRoIHRoZSBuZXcgd2lkdGg7XG4gICAgaWYgKGdyb3VwLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgb2Zmc2V0IC09IDAuNSAqIGNvcmVEaXN0YW5jZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZ3JvdXAub3B0aW9ucy5iYXJDaGFydC5hbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgb2Zmc2V0ICs9IDAuNSAqIGNvcmVEaXN0YW5jZTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gZGVmYXVsdCBzZXR0aW5nc1xuICAgIHdpZHRoID0gZ3JvdXAub3B0aW9ucy5iYXJDaGFydC53aWR0aDtcbiAgICBvZmZzZXQgPSAwO1xuICAgIGlmIChncm91cC5vcHRpb25zLmJhckNoYXJ0LmFsaWduID09PSAnbGVmdCcpIHtcbiAgICAgIG9mZnNldCAtPSAwLjUgKiBncm91cC5vcHRpb25zLmJhckNoYXJ0LndpZHRoO1xuICAgIH1cbiAgICBlbHNlIGlmIChncm91cC5vcHRpb25zLmJhckNoYXJ0LmFsaWduID09PSAncmlnaHQnKSB7XG4gICAgICBvZmZzZXQgKz0gMC41ICogZ3JvdXAub3B0aW9ucy5iYXJDaGFydC53aWR0aDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge3dpZHRoOiB3aWR0aCwgb2Zmc2V0OiBvZmZzZXR9O1xufTtcblxuQmFyZ3JhcGguZ2V0U3RhY2tlZFlSYW5nZSA9IGZ1bmN0aW9uIChjb21iaW5lZERhdGEsIGdyb3VwUmFuZ2VzLCBncm91cElkcywgZ3JvdXBMYWJlbCwgb3JpZW50YXRpb24pIHtcbiAgaWYgKGNvbWJpbmVkRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgLy8gc29ydCBieSB0aW1lIGFuZCBieSBncm91cFxuICAgIGNvbWJpbmVkRGF0YS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICBpZiAoYS5zY3JlZW5feCA9PT0gYi5zY3JlZW5feCkge1xuICAgICAgICByZXR1cm4gYS5ncm91cElkIDwgYi5ncm91cElkID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBhLnNjcmVlbl94IC0gYi5zY3JlZW5feDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IHt9O1xuXG4gICAgQmFyZ3JhcGguX2dldERhdGFJbnRlcnNlY3Rpb25zKGludGVyc2VjdGlvbnMsIGNvbWJpbmVkRGF0YSk7XG4gICAgZ3JvdXBSYW5nZXNbZ3JvdXBMYWJlbF0gPSBCYXJncmFwaC5fZ2V0U3RhY2tlZFlSYW5nZShpbnRlcnNlY3Rpb25zLCBjb21iaW5lZERhdGEpO1xuICAgIGdyb3VwUmFuZ2VzW2dyb3VwTGFiZWxdLnlBeGlzT3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICBncm91cElkcy5wdXNoKGdyb3VwTGFiZWwpO1xuICB9XG59O1xuXG5CYXJncmFwaC5fZ2V0U3RhY2tlZFlSYW5nZSA9IGZ1bmN0aW9uIChpbnRlcnNlY3Rpb25zLCBjb21iaW5lZERhdGEpIHtcbiAgdmFyIGtleTtcbiAgdmFyIHlNaW4gPSBjb21iaW5lZERhdGFbMF0uc2NyZWVuX3k7XG4gIHZhciB5TWF4ID0gY29tYmluZWREYXRhWzBdLnNjcmVlbl95O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbWJpbmVkRGF0YS5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGNvbWJpbmVkRGF0YVtpXS5zY3JlZW5feDtcbiAgICBpZiAoaW50ZXJzZWN0aW9uc1trZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHlNaW4gPSB5TWluID4gY29tYmluZWREYXRhW2ldLnNjcmVlbl95ID8gY29tYmluZWREYXRhW2ldLnNjcmVlbl95IDogeU1pbjtcbiAgICAgIHlNYXggPSB5TWF4IDwgY29tYmluZWREYXRhW2ldLnNjcmVlbl95ID8gY29tYmluZWREYXRhW2ldLnNjcmVlbl95IDogeU1heDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoY29tYmluZWREYXRhW2ldLnNjcmVlbl95IDwgMCkge1xuICAgICAgICBpbnRlcnNlY3Rpb25zW2tleV0uYWNjdW11bGF0ZWROZWdhdGl2ZSArPSBjb21iaW5lZERhdGFbaV0uc2NyZWVuX3k7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaW50ZXJzZWN0aW9uc1trZXldLmFjY3VtdWxhdGVkUG9zaXRpdmUgKz0gY29tYmluZWREYXRhW2ldLnNjcmVlbl95O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBmb3IgKHZhciB4cG9zIGluIGludGVyc2VjdGlvbnMpIHtcbiAgICBpZiAoaW50ZXJzZWN0aW9ucy5oYXNPd25Qcm9wZXJ0eSh4cG9zKSkge1xuICAgICAgeU1pbiA9IHlNaW4gPiBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkTmVnYXRpdmUgPyBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkTmVnYXRpdmUgOiB5TWluO1xuICAgICAgeU1pbiA9IHlNaW4gPiBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkUG9zaXRpdmUgPyBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkUG9zaXRpdmUgOiB5TWluO1xuICAgICAgeU1heCA9IHlNYXggPCBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkTmVnYXRpdmUgPyBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkTmVnYXRpdmUgOiB5TWF4O1xuICAgICAgeU1heCA9IHlNYXggPCBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkUG9zaXRpdmUgPyBpbnRlcnNlY3Rpb25zW3hwb3NdLmFjY3VtdWxhdGVkUG9zaXRpdmUgOiB5TWF4O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7bWluOiB5TWluLCBtYXg6IHlNYXh9O1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt2aXMuR3JhcGhHcm91cC5pZH0gZ3JvdXBJZFxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgICAvLyBUT0RPOiBEZXNjcmliZSBvcHRpb25zXG4gKiBAY29uc3RydWN0b3IgTGluZVxuICovXG5mdW5jdGlvbiBMaW5lKGdyb3VwSWQsIG9wdGlvbnMpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbn1cblxuTGluZS5jYWxjUGF0aCA9IGZ1bmN0aW9uIChkYXRhc2V0LCBncm91cCkge1xuICAgIGlmIChkYXRhc2V0ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGRhdGFzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFyIGQgPSBbXTtcblxuICAgICAgICAgICAgLy8gY29uc3RydWN0IHBhdGggZnJvbSBkYXRhc2V0XG4gICAgICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGQgPSBMaW5lLl9jYXRtdWxsUm9tKGRhdGFzZXQsIGdyb3VwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGQgPSBMaW5lLl9saW5lYXIoZGF0YXNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbkxpbmUuZHJhd0ljb24gPSBmdW5jdGlvbiAoZ3JvdXAsIHgsIHksIGljb25XaWR0aCwgaWNvbkhlaWdodCwgZnJhbWV3b3JrKSB7XG4gICAgdmFyIGZpbGxIZWlnaHQgPSBpY29uSGVpZ2h0ICogMC41O1xuICAgIHZhciBwYXRoLCBmaWxsUGF0aDtcblxuICAgIHZhciBvdXRsaW5lID0gZ2V0U1ZHRWxlbWVudChcInJlY3RcIiwgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnKTtcbiAgICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCB4KTtcbiAgICBvdXRsaW5lLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCB5IC0gZmlsbEhlaWdodCk7XG4gICAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcIndpZHRoXCIsIGljb25XaWR0aCk7XG4gICAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImhlaWdodFwiLCAyICogZmlsbEhlaWdodCk7XG4gICAgb3V0bGluZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsYXNzXCIsIFwidmlzLW91dGxpbmVcIik7XG5cbiAgICBwYXRoID0gZ2V0U1ZHRWxlbWVudChcInBhdGhcIiwgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnKTtcbiAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiY2xhc3NcIiwgZ3JvdXAuY2xhc3NOYW1lKTtcbiAgICBpZiAoZ3JvdXAuc3R5bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3R5bGVcIiwgZ3JvdXAuc3R5bGUpO1xuICAgIH1cblxuICAgIHBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTVwiICsgeCArIFwiLFwiICsgeSArIFwiIExcIiArICh4ICsgaWNvbldpZHRoKSArIFwiLFwiICsgeSArIFwiXCIpO1xuICAgIGlmIChncm91cC5vcHRpb25zLnNoYWRlZC5lbmFibGVkID09IHRydWUpIHtcbiAgICAgICAgZmlsbFBhdGggPSBnZXRTVkdFbGVtZW50KFwicGF0aFwiLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcpO1xuICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24gPT0gJ3RvcCcpIHtcbiAgICAgICAgICAgIGZpbGxQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiLCBcIk1cIiArIHggKyBcIiwgXCIgKyAoeSAtIGZpbGxIZWlnaHQpICtcbiAgICAgICAgICAgICAgXCJMXCIgKyB4ICsgXCIsXCIgKyB5ICsgXCIgTFwiICsgKHggKyBpY29uV2lkdGgpICsgXCIsXCIgKyB5ICsgXCIgTFwiICsgKHggKyBpY29uV2lkdGgpICsgXCIsXCIgKyAoeSAtIGZpbGxIZWlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZpbGxQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiZFwiLCBcIk1cIiArIHggKyBcIixcIiArIHkgKyBcIiBcIiArXG4gICAgICAgICAgICAgIFwiTFwiICsgeCArIFwiLFwiICsgKHkgKyBmaWxsSGVpZ2h0KSArIFwiIFwiICtcbiAgICAgICAgICAgICAgXCJMXCIgKyAoeCArIGljb25XaWR0aCkgKyBcIixcIiArICh5ICsgZmlsbEhlaWdodCkgK1xuICAgICAgICAgICAgICBcIkxcIiArICh4ICsgaWNvbldpZHRoKSArIFwiLFwiICsgeSk7XG4gICAgICAgIH1cbiAgICAgICAgZmlsbFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJjbGFzc1wiLCBncm91cC5jbGFzc05hbWUgKyBcIiB2aXMtaWNvbi1maWxsXCIpO1xuICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zaGFkZWQuc3R5bGUgIT09IHVuZGVmaW5lZCAmJiBncm91cC5vcHRpb25zLnNoYWRlZC5zdHlsZSAhPT0gXCJcIikge1xuICAgICAgICAgICAgZmlsbFBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgXCJzdHlsZVwiLCBncm91cC5vcHRpb25zLnNoYWRlZC5zdHlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLmVuYWJsZWQgPT0gdHJ1ZSkge1xuICAgICAgICB2YXIgZ3JvdXBUZW1wbGF0ZSA9IHtcbiAgICAgICAgICAgIHN0eWxlOiBncm91cC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsXG4gICAgICAgICAgICBzdHlsZXM6IGdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZXMsXG4gICAgICAgICAgICBzaXplOiBncm91cC5vcHRpb25zLmRyYXdQb2ludHMuc2l6ZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogZ3JvdXAuY2xhc3NOYW1lXG4gICAgICAgIH07XG4gICAgICAgIGRyYXdQb2ludCh4ICsgMC41ICogaWNvbldpZHRoLCB5LCBncm91cFRlbXBsYXRlLCBmcmFtZXdvcmsuc3ZnRWxlbWVudHMsIGZyYW1ld29yay5zdmcpO1xuICAgIH1cbn07XG5cbkxpbmUuZHJhd1NoYWRpbmcgPSBmdW5jdGlvbiAocGF0aEFycmF5LCBncm91cCwgc3ViUGF0aEFycmF5LCBmcmFtZXdvcmspIHtcbiAgICAvLyBhcHBlbmQgc2hhZGluZyB0byB0aGUgcGF0aFxuICAgIGlmIChncm91cC5vcHRpb25zLnNoYWRlZC5lbmFibGVkID09IHRydWUpIHtcbiAgICAgICAgdmFyIHN2Z0hlaWdodCA9IE51bWJlcihmcmFtZXdvcmsuc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKCdweCcsJycpKTtcbiAgICAgICAgdmFyIGZpbGxQYXRoID0gZ2V0U1ZHRWxlbWVudCgncGF0aCcsIGZyYW1ld29yay5zdmdFbGVtZW50cywgZnJhbWV3b3JrLnN2Zyk7XG4gICAgICAgIHZhciB0eXBlID0gXCJMXCI7XG4gICAgICAgIGlmIChncm91cC5vcHRpb25zLmludGVycG9sYXRpb24uZW5hYmxlZCA9PSB0cnVlKXtcbiAgICAgICAgICAgIHR5cGUgPSBcIkNcIjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZEZpbGw7XG4gICAgICAgIHZhciB6ZXJvID0gMDtcbiAgICAgICAgaWYgKGdyb3VwLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uID09ICd0b3AnKSB7XG4gICAgICAgICAgICB6ZXJvID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChncm91cC5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbiA9PSAnYm90dG9tJykge1xuICAgICAgICAgICAgemVybyA9IHN2Z0hlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHplcm8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCBncm91cC56ZXJvUG9zaXRpb24pLCBzdmdIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncm91cC5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbiA9PSAnZ3JvdXAnICYmIChzdWJQYXRoQXJyYXkgIT0gbnVsbCAmJiBzdWJQYXRoQXJyYXkgIT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgZEZpbGwgPSAnTScgKyBwYXRoQXJyYXlbMF1bMF0rIFwiLFwiK3BhdGhBcnJheVswXVsxXSArIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJpYWxpemVQYXRoKHBhdGhBcnJheSx0eXBlLGZhbHNlKSArXG4gICAgICAgICAgICAgICAgICAgICcgTCcrIHN1YlBhdGhBcnJheVtzdWJQYXRoQXJyYXkubGVuZ3RoLTFdWzBdKyBcIixcIiArIHN1YlBhdGhBcnJheVtzdWJQYXRoQXJyYXkubGVuZ3RoLTFdWzFdICsgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcmlhbGl6ZVBhdGgoc3ViUGF0aEFycmF5LHR5cGUsdHJ1ZSkgK1xuICAgICAgICAgICAgICAgICAgICBzdWJQYXRoQXJyYXlbMF1bMF0rIFwiLFwiK3N1YlBhdGhBcnJheVswXVsxXSArIFwiIFpcIjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRGaWxsID0gJ00nICsgcGF0aEFycmF5WzBdWzBdKyBcIixcIitwYXRoQXJyYXlbMF1bMV0gKyBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplUGF0aChwYXRoQXJyYXksdHlwZSxmYWxzZSkgK1xuICAgICAgICAgICAgICAgICAgICAnIFYnICsgemVybyArICcgSCcrIHBhdGhBcnJheVswXVswXSArIFwiIFpcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZpbGxQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICdjbGFzcycsIGdyb3VwLmNsYXNzTmFtZSArICcgdmlzLWZpbGwnKTtcbiAgICAgICAgaWYgKGdyb3VwLm9wdGlvbnMuc2hhZGVkLnN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZpbGxQYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICdzdHlsZScsIGdyb3VwLm9wdGlvbnMuc2hhZGVkLnN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBmaWxsUGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsIGRGaWxsKTtcbiAgICB9XG59O1xuXG4vKipcbiAqIGRyYXcgYSBsaW5lIGdyYXBoXG4gKlxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gcGF0aEFycmF5XG4gKiBAcGFyYW0ge3Zpcy5Hcm91cH0gZ3JvdXBcbiAqIEBwYXJhbSB7e3N2ZzogT2JqZWN0LCBzdmdFbGVtZW50czogQXJyYXkuPE9iamVjdD4sIG9wdGlvbnM6IE9iamVjdCwgZ3JvdXBzOiBBcnJheS48dmlzLkdyb3VwPn19IGZyYW1ld29ya1xuICovXG5MaW5lLmRyYXcgPSBmdW5jdGlvbiAocGF0aEFycmF5LCBncm91cCwgZnJhbWV3b3JrKSB7XG4gICAgaWYgKHBhdGhBcnJheSAhPSBudWxsICYmIHBhdGhBcnJheSAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIHBhdGggPSBnZXRTVkdFbGVtZW50KCdwYXRoJywgZnJhbWV3b3JrLnN2Z0VsZW1lbnRzLCBmcmFtZXdvcmsuc3ZnKTtcbiAgICAgICAgcGF0aC5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImNsYXNzXCIsIGdyb3VwLmNsYXNzTmFtZSk7XG4gICAgICAgIGlmIChncm91cC5zdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwic3R5bGVcIiwgZ3JvdXAuc3R5bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHR5cGUgPSBcIkxcIjtcbiAgICAgICAgaWYgKGdyb3VwLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5lbmFibGVkID09IHRydWUpe1xuICAgICAgICAgICAgdHlwZSA9IFwiQ1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvcHkgcHJvcGVydGllcyB0byBwYXRoIGZvciBkcmF3aW5nLlxuICAgICAgICBwYXRoLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00nICsgcGF0aEFycmF5WzBdWzBdKyBcIixcIitwYXRoQXJyYXlbMF1bMV0gKyBcIiBcIiArIHRoaXMuc2VyaWFsaXplUGF0aChwYXRoQXJyYXksdHlwZSxmYWxzZSkpO1xuICAgIH1cbn07XG5cbkxpbmUuc2VyaWFsaXplUGF0aCA9IGZ1bmN0aW9uKHBhdGhBcnJheSx0eXBlLGludmVyc2Upe1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoIDwgMil7XG4gICAgICAgIC8vVG9vIGxpdHRsZSBkYXRhIHRvIGNyZWF0ZSBhIHBhdGguXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICB2YXIgZCA9IHR5cGU7XG4gICAgdmFyIGk7XG4gICAgaWYgKGludmVyc2Upe1xuICAgICAgICBmb3IgKGkgPSBwYXRoQXJyYXkubGVuZ3RoLTI7IGkgPiAwOyBpLS0pe1xuICAgICAgICAgICAgZCArPSBwYXRoQXJyYXlbaV1bMF0gKyBcIixcIiArIHBhdGhBcnJheVtpXVsxXSArIFwiIFwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcGF0aEFycmF5Lmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIGQgKz0gcGF0aEFycmF5W2ldWzBdICsgXCIsXCIgKyBwYXRoQXJyYXlbaV1bMV0gKyBcIiBcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDtcbn07XG5cbi8qKlxuICogVGhpcyB1c2VzIGFuIHVuaWZvcm0gcGFyYW1ldHJpemF0aW9uIG9mIHRoZSBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobTpcbiAqICdPbiB0aGUgUGFyYW1ldGVyaXphdGlvbiBvZiBDYXRtdWxsLVJvbSBDdXJ2ZXMnIGJ5IENlbSBZdWtzZWwgZXQgYWwuXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuTGluZS5fY2F0bXVsbFJvbVVuaWZvcm0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIC8vIGNhdG11bGwgcm9tXG4gICAgdmFyIHAwLCBwMSwgcDIsIHAzLCBicDEsIGJwMjtcbiAgICB2YXIgZCA9IFtdO1xuICAgIGQucHVzaCggWyBNYXRoLnJvdW5kKGRhdGFbMF0uc2NyZWVuX3gpICwgTWF0aC5yb3VuZChkYXRhWzBdLnNjcmVlbl95KSBdKTtcbiAgICB2YXIgbm9ybWFsaXphdGlvbiA9IDEgLyA2O1xuICAgIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aCAtIDE7IGkrKykge1xuXG4gICAgICAgIHAwID0gKGkgPT0gMCkgPyBkYXRhWzBdIDogZGF0YVtpIC0gMV07XG4gICAgICAgIHAxID0gZGF0YVtpXTtcbiAgICAgICAgcDIgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgcDMgPSAoaSArIDIgPCBsZW5ndGgpID8gZGF0YVtpICsgMl0gOiBwMjtcblxuXG4gICAgICAgIC8vIENhdG11bGwtUm9tIHRvIEN1YmljIEJlemllciBjb252ZXJzaW9uIG1hdHJpeFxuICAgICAgICAvLyAgICAwICAgICAgIDEgICAgICAgMCAgICAgICAwXG4gICAgICAgIC8vICAtMS82ICAgICAgMSAgICAgIDEvNiAgICAgIDBcbiAgICAgICAgLy8gICAgMCAgICAgIDEvNiAgICAgIDEgICAgIC0xLzZcbiAgICAgICAgLy8gICAgMCAgICAgICAwICAgICAgIDEgICAgICAgMFxuXG4gICAgICAgIC8vICAgIGJwMCA9IHsgeDogcDEueCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogcDEueSB9O1xuICAgICAgICBicDEgPSB7XG4gICAgICAgICAgICBzY3JlZW5feDogKCgtcDAuc2NyZWVuX3ggKyA2ICogcDEuc2NyZWVuX3ggKyBwMi5zY3JlZW5feCkgKiBub3JtYWxpemF0aW9uKSxcbiAgICAgICAgICAgIHNjcmVlbl95OiAoKC1wMC5zY3JlZW5feSArIDYgKiBwMS5zY3JlZW5feSArIHAyLnNjcmVlbl95KSAqIG5vcm1hbGl6YXRpb24pXG4gICAgICAgIH07XG4gICAgICAgIGJwMiA9IHtcbiAgICAgICAgICAgIHNjcmVlbl94OiAoKCBwMS5zY3JlZW5feCArIDYgKiBwMi5zY3JlZW5feCAtIHAzLnNjcmVlbl94KSAqIG5vcm1hbGl6YXRpb24pLFxuICAgICAgICAgICAgc2NyZWVuX3k6ICgoIHAxLnNjcmVlbl95ICsgNiAqIHAyLnNjcmVlbl95IC0gcDMuc2NyZWVuX3kpICogbm9ybWFsaXphdGlvbilcbiAgICAgICAgfTtcbiAgICAgICAgLy8gICAgYnAwID0geyB4OiBwMi54LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBwMi55IH07XG5cbiAgICAgICAgZC5wdXNoKCBbIGJwMS5zY3JlZW5feCAsIGJwMS5zY3JlZW5feSBdKTtcbiAgICAgICAgZC5wdXNoKCBbIGJwMi5zY3JlZW5feCAsIGJwMi5zY3JlZW5feSBdKTtcbiAgICAgICAgZC5wdXNoKCBbIHAyLnNjcmVlbl94ICAsIHAyLnNjcmVlbl95ICBdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZDtcbn07XG5cbi8qKlxuICogVGhpcyB1c2VzIGVpdGhlciB0aGUgY2hvcmRhbCBvciBjZW50cmlwZXRhbCBwYXJhbWV0ZXJpemF0aW9uIG9mIHRoZSBjYXRtdWxsLXJvbSBhbGdvcml0aG0uXG4gKiBCeSBkZWZhdWx0LCB0aGUgY2VudHJpcGV0YWwgcGFyYW1ldGVyaXphdGlvbiBpcyB1c2VkIGJlY2F1c2UgdGhpcyBnaXZlcyB0aGUgbmljZXN0IHJlc3VsdHMuXG4gKiBUaGVzZSBwYXJhbWV0ZXJpemF0aW9ucyBhcmUgcmVsYXRpdmVseSBoZWF2eSBiZWNhdXNlIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIDQgcG9pbnRzIGhhdmUgdG8gYmUgY2FsY3VsYXRlZC5cbiAqXG4gKiBPbmUgb3B0aW1pemF0aW9uIGNhbiBiZSB1c2VkIHRvIHJldXNlIGRpc3RhbmNlcyBzaW5jZSB0aGlzIGlzIGEgc2xpZGluZyB3aW5kb3cgYXBwcm9hY2guXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBkYXRhXG4gKiBAcGFyYW0ge3Zpcy5HcmFwaEdyb3VwfSBncm91cFxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkxpbmUuX2NhdG11bGxSb20gPSBmdW5jdGlvbiAoZGF0YSwgZ3JvdXApIHtcbiAgICB2YXIgYWxwaGEgPSBncm91cC5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE7XG4gICAgaWYgKGFscGhhID09IDAgfHwgYWxwaGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2F0bXVsbFJvbVVuaWZvcm0oZGF0YSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcDAsIHAxLCBwMiwgcDMsIGJwMSwgYnAyLCBkMSwgZDIsIGQzLCBBLCBCLCBOLCBNO1xuICAgICAgICB2YXIgZDNwb3dBLCBkMnBvd0EsIGQzcG93MkEsIGQycG93MkEsIGQxcG93MkEsIGQxcG93QTtcbiAgICAgICAgdmFyIGQgPSBbXTtcbiAgICAgICAgZC5wdXNoKCBbIE1hdGgucm91bmQoZGF0YVswXS5zY3JlZW5feCkgLCBNYXRoLnJvdW5kKGRhdGFbMF0uc2NyZWVuX3kpIF0pO1xuICAgICAgICB2YXIgbGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrKSB7XG5cbiAgICAgICAgICAgIHAwID0gKGkgPT0gMCkgPyBkYXRhWzBdIDogZGF0YVtpIC0gMV07XG4gICAgICAgICAgICBwMSA9IGRhdGFbaV07XG4gICAgICAgICAgICBwMiA9IGRhdGFbaSArIDFdO1xuICAgICAgICAgICAgcDMgPSAoaSArIDIgPCBsZW5ndGgpID8gZGF0YVtpICsgMl0gOiBwMjtcblxuICAgICAgICAgICAgZDEgPSBNYXRoLnNxcnQoTWF0aC5wb3cocDAuc2NyZWVuX3ggLSBwMS5zY3JlZW5feCwgMikgKyBNYXRoLnBvdyhwMC5zY3JlZW5feSAtIHAxLnNjcmVlbl95LCAyKSk7XG4gICAgICAgICAgICBkMiA9IE1hdGguc3FydChNYXRoLnBvdyhwMS5zY3JlZW5feCAtIHAyLnNjcmVlbl94LCAyKSArIE1hdGgucG93KHAxLnNjcmVlbl95IC0gcDIuc2NyZWVuX3ksIDIpKTtcbiAgICAgICAgICAgIGQzID0gTWF0aC5zcXJ0KE1hdGgucG93KHAyLnNjcmVlbl94IC0gcDMuc2NyZWVuX3gsIDIpICsgTWF0aC5wb3cocDIuc2NyZWVuX3kgLSBwMy5zY3JlZW5feSwgMikpO1xuXG4gICAgICAgICAgICAvLyBDYXRtdWxsLVJvbSB0byBDdWJpYyBCZXppZXIgY29udmVyc2lvbiBtYXRyaXhcblxuICAgICAgICAgICAgLy8gQSA9IDJkMV4yYSArIDNkMV5hICogZDJeYSArIGQzXjJhXG4gICAgICAgICAgICAvLyBCID0gMmQzXjJhICsgM2QzXmEgKiBkMl5hICsgZDJeMmFcblxuICAgICAgICAgICAgLy8gWyAgIDAgICAgICAgICAgICAgMSAgICAgICAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBdXG4gICAgICAgICAgICAvLyBbICAgLWQyXjJhIC9OICAgICBBL04gICAgICAgICAgZDFeMmEgL04gICAwICAgICAgICAgIF1cbiAgICAgICAgICAgIC8vIFsgICAwICAgICAgICAgICAgIGQzXjJhIC9NICAgICBCL00gICAgICAgIC1kMl4yYSAvTSAgXVxuICAgICAgICAgICAgLy8gWyAgIDAgICAgICAgICAgICAgMCAgICAgICAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBdXG5cbiAgICAgICAgICAgIGQzcG93QSA9IE1hdGgucG93KGQzLCBhbHBoYSk7XG4gICAgICAgICAgICBkM3BvdzJBID0gTWF0aC5wb3coZDMsIDIgKiBhbHBoYSk7XG4gICAgICAgICAgICBkMnBvd0EgPSBNYXRoLnBvdyhkMiwgYWxwaGEpO1xuICAgICAgICAgICAgZDJwb3cyQSA9IE1hdGgucG93KGQyLCAyICogYWxwaGEpO1xuICAgICAgICAgICAgZDFwb3dBID0gTWF0aC5wb3coZDEsIGFscGhhKTtcbiAgICAgICAgICAgIGQxcG93MkEgPSBNYXRoLnBvdyhkMSwgMiAqIGFscGhhKTtcblxuICAgICAgICAgICAgQSA9IDIgKiBkMXBvdzJBICsgMyAqIGQxcG93QSAqIGQycG93QSArIGQycG93MkE7XG4gICAgICAgICAgICBCID0gMiAqIGQzcG93MkEgKyAzICogZDNwb3dBICogZDJwb3dBICsgZDJwb3cyQTtcbiAgICAgICAgICAgIE4gPSAzICogZDFwb3dBICogKGQxcG93QSArIGQycG93QSk7XG4gICAgICAgICAgICBpZiAoTiA+IDApIHtcbiAgICAgICAgICAgICAgICBOID0gMSAvIE47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBNID0gMyAqIGQzcG93QSAqIChkM3Bvd0EgKyBkMnBvd0EpO1xuICAgICAgICAgICAgaWYgKE0gPiAwKSB7XG4gICAgICAgICAgICAgICAgTSA9IDEgLyBNO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicDEgPSB7XG4gICAgICAgICAgICAgICAgc2NyZWVuX3g6ICgoLWQycG93MkEgKiBwMC5zY3JlZW5feCArIEEgKiBwMS5zY3JlZW5feCArIGQxcG93MkEgKiBwMi5zY3JlZW5feCkgKiBOKSxcbiAgICAgICAgICAgICAgICBzY3JlZW5feTogKCgtZDJwb3cyQSAqIHAwLnNjcmVlbl95ICsgQSAqIHAxLnNjcmVlbl95ICsgZDFwb3cyQSAqIHAyLnNjcmVlbl95KSAqIE4pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBicDIgPSB7XG4gICAgICAgICAgICAgICAgc2NyZWVuX3g6ICgoIGQzcG93MkEgKiBwMS5zY3JlZW5feCArIEIgKiBwMi5zY3JlZW5feCAtIGQycG93MkEgKiBwMy5zY3JlZW5feCkgKiBNKSxcbiAgICAgICAgICAgICAgICBzY3JlZW5feTogKCggZDNwb3cyQSAqIHAxLnNjcmVlbl95ICsgQiAqIHAyLnNjcmVlbl95IC0gZDJwb3cyQSAqIHAzLnNjcmVlbl95KSAqIE0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoYnAxLnNjcmVlbl94ID09IDAgJiYgYnAxLnNjcmVlbl95ID09IDApIHtcbiAgICAgICAgICAgICAgICBicDEgPSBwMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChicDIuc2NyZWVuX3ggPT0gMCAmJiBicDIuc2NyZWVuX3kgPT0gMCkge1xuICAgICAgICAgICAgICAgIGJwMiA9IHAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZC5wdXNoKCBbIGJwMS5zY3JlZW5feCAsIGJwMS5zY3JlZW5feSBdKTtcbiAgICAgICAgICAgIGQucHVzaCggWyBicDIuc2NyZWVuX3ggLCBicDIuc2NyZWVuX3kgXSk7XG4gICAgICAgICAgICBkLnB1c2goIFsgcDIuc2NyZWVuX3ggICwgcDIuc2NyZWVuX3kgIF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGQ7XG4gICAgfVxufTtcblxuLyoqXG4gKiB0aGlzIGdlbmVyYXRlcyB0aGUgU1ZHIHBhdGggZm9yIGEgbGluZWFyIGRyYXdpbmcgYmV0d2VlbiBkYXRhcG9pbnRzLlxuICogQHBhcmFtIHtBcnJheS48T2JqZWN0Pn0gZGF0YVxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBwcml2YXRlXG4gKi9cbkxpbmUuX2xpbmVhciA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgLy8gbGluZWFyXG4gICAgdmFyIGQgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZC5wdXNoKFsgZGF0YVtpXS5zY3JlZW5feCAsIGRhdGFbaV0uc2NyZWVuX3kgXSk7XG4gICAgfVxuICAgIHJldHVybiBkO1xufTtcblxuLyoqXG4gKiAvKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBncm91cCAgICAgICAgICAgIHwgdGhlIG9iamVjdCBvZiB0aGUgZ3JvdXAgZnJvbSB0aGUgZGF0YXNldFxuICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwSWQgICAgICAgICAgfCBJRCBvZiB0aGUgZ3JvdXBcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zICAgICAgICAgIHwgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICogQHBhcmFtIHthcnJheX0gZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzICB8IHRoaXMgYXJyYXkgaGFzIG9uZSBlbnRyZWUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcGFzc2VkIGFzIGFuIGFycmF5IHNvIGl0IGlzIHBhc3NlZCBieSByZWZlcmVuY2UuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgZW51bWVyYXRlcyB0aHJvdWdoIHRoZSBkZWZhdWx0IHN0eWxlc1xuICogQGNvbnN0cnVjdG9yIEdyYXBoR3JvdXBcbiAqL1xuZnVuY3Rpb24gR3JhcGhHcm91cChncm91cCwgZ3JvdXBJZCwgb3B0aW9ucywgZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzKSB7XG4gIHRoaXMuaWQgPSBncm91cElkO1xuICB2YXIgZmllbGRzID0gWydzYW1wbGluZycsICdzdHlsZScsICdzb3J0JywgJ3lBeGlzT3JpZW50YXRpb24nLCAnYmFyQ2hhcnQnLCAnZHJhd1BvaW50cycsICdzaGFkZWQnLCAnaW50ZXJwb2xhdGlvbicsICd6SW5kZXgnLCdleGNsdWRlRnJvbVN0YWNraW5nJywgJ2V4Y2x1ZGVGcm9tTGVnZW5kJ107XG4gIHRoaXMub3B0aW9ucyA9IHV0aWwuc2VsZWN0aXZlQnJpZGdlT2JqZWN0KGZpZWxkcywgb3B0aW9ucyk7XG4gIHRoaXMudXNpbmdEZWZhdWx0U3R5bGUgPSBncm91cC5jbGFzc05hbWUgPT09IHVuZGVmaW5lZDtcbiAgdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMgPSBncm91cHNVc2luZ0RlZmF1bHRTdHlsZXM7XG4gIHRoaXMuemVyb1Bvc2l0aW9uID0gMDtcbiAgdGhpcy51cGRhdGUoZ3JvdXApO1xuICBpZiAodGhpcy51c2luZ0RlZmF1bHRTdHlsZSA9PSB0cnVlKSB7XG4gICAgdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXNbMF0gKz0gMTtcbiAgfVxuICB0aGlzLml0ZW1zRGF0YSA9IFtdO1xuICB0aGlzLnZpc2libGUgPSBncm91cC52aXNpYmxlID09PSB1bmRlZmluZWQgPyB0cnVlIDogZ3JvdXAudmlzaWJsZTtcbn1cblxuLyoqXG4gKiB0aGlzIGxvYWRzIGEgcmVmZXJlbmNlIHRvIGFsbCBpdGVtcyBpbiB0aGlzIGdyb3VwIGludG8gdGhpcyBncm91cC5cbiAqIEBwYXJhbSB7YXJyYXl9IGl0ZW1zXG4gKi9cbkdyYXBoR3JvdXAucHJvdG90eXBlLnNldEl0ZW1zID0gZnVuY3Rpb24gKGl0ZW1zKSB7XG4gIGlmIChpdGVtcyAhPSBudWxsKSB7XG4gICAgdGhpcy5pdGVtc0RhdGEgPSBpdGVtcztcbiAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQgPT0gdHJ1ZSkge1xuICAgICAgdXRpbC5pbnNlcnRTb3J0KHRoaXMuaXRlbXNEYXRhLGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIHJldHVybiBhLnggPiBiLnggPyAxIDogLTE7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhpcy5pdGVtc0RhdGEgPSBbXTtcbiAgfVxufTtcblxuR3JhcGhHcm91cC5wcm90b3R5cGUuZ2V0SXRlbXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLml0ZW1zRGF0YTtcbn07XG5cbi8qKlxuICogdGhpcyBpcyB1c2VkIGZvciBiYXJjaGFydHMgYW5kIHNoYWRpbmcsIHRoaXMgd2F5LCB3ZSBvbmx5IGhhdmUgdG8gY2FsY3VsYXRlIGl0IG9uY2UuXG4gKiBAcGFyYW0ge251bWJlcn0gcG9zXG4gKi9cbkdyYXBoR3JvdXAucHJvdG90eXBlLnNldFplcm9Qb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3MpIHtcbiAgdGhpcy56ZXJvUG9zaXRpb24gPSBwb3M7XG59O1xuXG4vKipcbiAqIHNldCB0aGUgb3B0aW9ucyBvZiB0aGUgZ3JhcGggZ3JvdXAgb3ZlciB0aGUgZGVmYXVsdCBvcHRpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqL1xuR3JhcGhHcm91cC5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZmllbGRzID0gWydzYW1wbGluZycsICdzdHlsZScsICdzb3J0JywgJ3lBeGlzT3JpZW50YXRpb24nLCAnYmFyQ2hhcnQnLCAnekluZGV4JywnZXhjbHVkZUZyb21TdGFja2luZycsICdleGNsdWRlRnJvbUxlZ2VuZCddO1xuICAgIHV0aWwuc2VsZWN0aXZlRGVlcEV4dGVuZChmaWVsZHMsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG5cbiAgICAvLyBpZiB0aGUgZ3JvdXAncyBkcmF3UG9pbnRzIGlzIGEgZnVuY3Rpb24gZGVsZWdhdGUgdGhlIGNhbGxiYWNrIHRvIHRoZSBvblJlbmRlciBwcm9wZXJ0eVxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kcmF3UG9pbnRzID09ICdmdW5jdGlvbicpIHtcbiAgICAgIG9wdGlvbnMuZHJhd1BvaW50cyA9IHtcbiAgICAgICAgb25SZW5kZXI6IG9wdGlvbnMuZHJhd1BvaW50c1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB1dGlsLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMsICdpbnRlcnBvbGF0aW9uJyk7XG4gICAgdXRpbC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBvcHRpb25zLCAnZHJhd1BvaW50cycpO1xuICAgIHV0aWwubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucywgJ3NoYWRlZCcpO1xuXG4gICAgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbikge1xuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmludGVycG9sYXRpb24gPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiA9PSAndW5pZm9ybScpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiA9PSAnY2hvcmRhbCcpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhID0gMS4wO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiA9ICdjZW50cmlwZXRhbCc7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYSA9IDAuNTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiB0aGlzIHVwZGF0ZXMgdGhlIGN1cnJlbnQgZ3JvdXAgY2xhc3Mgd2l0aCB0aGUgbGF0ZXN0IGdyb3VwIGRhdGFzZXQgZW50cmVlLCB1c2VkIGluIF91cGRhdGVHcm91cCBpbiBsaW5lZ3JhcGhcbiAqIEBwYXJhbSB7dmlzLkdyb3VwfSBncm91cFxuICovXG5HcmFwaEdyb3VwLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoZ3JvdXApIHtcbiAgdGhpcy5ncm91cCA9IGdyb3VwO1xuICB0aGlzLmNvbnRlbnQgPSBncm91cC5jb250ZW50IHx8ICdncmFwaCc7XG4gIHRoaXMuY2xhc3NOYW1lID0gZ3JvdXAuY2xhc3NOYW1lIHx8IHRoaXMuY2xhc3NOYW1lIHx8ICd2aXMtZ3JhcGgtZ3JvdXAnICsgdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXNbMF0gJSAxMDtcbiAgdGhpcy52aXNpYmxlID0gZ3JvdXAudmlzaWJsZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGdyb3VwLnZpc2libGU7XG4gIHRoaXMuc3R5bGUgPSBncm91cC5zdHlsZTtcbiAgdGhpcy5zZXRPcHRpb25zKGdyb3VwLm9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiByZXR1cm4gdGhlIGxlZ2VuZCBlbnRyZWUgZm9yIHRoaXMgZ3JvdXAuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGljb25XaWR0aFxuICogQHBhcmFtIHtudW1iZXJ9IGljb25IZWlnaHRcbiAqIEBwYXJhbSB7e3N2ZzogKCp8RWxlbWVudCksIHN2Z0VsZW1lbnRzOiBPYmplY3QsIG9wdGlvbnM6IE9iamVjdCwgZ3JvdXBzOiBBcnJheS48T2JqZWN0Pn19IGZyYW1ld29ya1xuICogQHBhcmFtIHtudW1iZXJ9IHhcbiAqIEBwYXJhbSB7bnVtYmVyfSB5XG4gKiBAcmV0dXJucyB7e2ljb246ICgqfEVsZW1lbnQpLCBsYWJlbDogKCp8c3RyaW5nKSwgb3JpZW50YXRpb246ICp9fVxuICovXG5HcmFwaEdyb3VwLnByb3RvdHlwZS5nZXRMZWdlbmQgPSBmdW5jdGlvbiAoaWNvbldpZHRoLCBpY29uSGVpZ2h0LCBmcmFtZXdvcmssIHgsIHkpIHtcbiAgaWYgKGZyYW1ld29yayA9PSB1bmRlZmluZWQgfHwgZnJhbWV3b3JrID09IG51bGwpIHtcbiAgICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsIFwic3ZnXCIpO1xuICAgIGZyYW1ld29yayA9IHtzdmc6IHN2Zywgc3ZnRWxlbWVudHM6e30sIG9wdGlvbnM6IHRoaXMub3B0aW9ucywgZ3JvdXBzOiBbdGhpc119O1xuICB9XG4gIGlmICh4ID09IHVuZGVmaW5lZCB8fCB4ID09IG51bGwpe1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5ID09IHVuZGVmaW5lZCB8fCB5ID09IG51bGwpe1xuICAgIHkgPSAwLjUgKiBpY29uSGVpZ2h0O1xuICB9XG4gIHN3aXRjaCAodGhpcy5vcHRpb25zLnN0eWxlKXtcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgTGluZS5kcmF3SWNvbih0aGlzLCB4LCB5LCBpY29uV2lkdGgsIGljb25IZWlnaHQsIGZyYW1ld29yayk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwicG9pbnRzXCI6IC8vZXhwbGljaXQgbm8gYnJlYWtcbiAgICBjYXNlIFwicG9pbnRcIjpcbiAgICAgIFBvaW50cy5kcmF3SWNvbih0aGlzLCB4LCB5LCBpY29uV2lkdGgsIGljb25IZWlnaHQsIGZyYW1ld29yayk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYmFyXCI6XG4gICAgICBCYXJncmFwaC5kcmF3SWNvbih0aGlzLCB4LCB5LCBpY29uV2lkdGgsIGljb25IZWlnaHQsIGZyYW1ld29yayk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4ge2ljb246IGZyYW1ld29yay5zdmcsIGxhYmVsOiB0aGlzLmNvbnRlbnQsIG9yaWVudGF0aW9uOiB0aGlzLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbn07XG59O1xuXG5HcmFwaEdyb3VwLnByb3RvdHlwZS5nZXRZUmFuZ2UgPSBmdW5jdGlvbiAoZ3JvdXBEYXRhKSB7XG4gIHZhciB5TWluID0gZ3JvdXBEYXRhWzBdLnk7XG4gIHZhciB5TWF4ID0gZ3JvdXBEYXRhWzBdLnk7XG4gIGZvciAodmFyIGogPSAwOyBqIDwgZ3JvdXBEYXRhLmxlbmd0aDsgaisrKSB7XG4gICAgeU1pbiA9IHlNaW4gPiBncm91cERhdGFbal0ueSA/IGdyb3VwRGF0YVtqXS55IDogeU1pbjtcbiAgICB5TWF4ID0geU1heCA8IGdyb3VwRGF0YVtqXS55ID8gZ3JvdXBEYXRhW2pdLnkgOiB5TWF4O1xuICB9XG4gIHJldHVybiB7bWluOiB5TWluLCBtYXg6IHlNYXgsIHlBeGlzT3JpZW50YXRpb246IHRoaXMub3B0aW9ucy55QXhpc09yaWVudGF0aW9ufTtcbn07XG5cbi8qKlxuICogTGVnZW5kIGZvciBHcmFwaDJkXG4gKlxuICogQHBhcmFtIHt2aXMuR3JhcGgyZC5ib2R5fSBib2R5XG4gKiBAcGFyYW0ge3Zpcy5HcmFwaDJkLm9wdGlvbnN9IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaWRlXG4gKiBAcGFyYW0ge3Zpcy5MaW5lR3JhcGgub3B0aW9uc30gbGluZWdyYXBoT3B0aW9uc1xuICogQGNvbnN0cnVjdG9yIExlZ2VuZFxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIExlZ2VuZChib2R5LCBvcHRpb25zLCBzaWRlLCBsaW5lZ3JhcGhPcHRpb25zKSB7XG4gIHRoaXMuYm9keSA9IGJvZHk7XG4gIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgaWNvbnM6IHRydWUsXG4gICAgaWNvblNpemU6IDIwLFxuICAgIGljb25TcGFjaW5nOiA2LFxuICAgIGxlZnQ6IHtcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBwb3NpdGlvbjogJ3RvcC1sZWZ0JyAvLyB0b3AvYm90dG9tIC0gbGVmdCxjZW50ZXIscmlnaHRcbiAgICB9LFxuICAgIHJpZ2h0OiB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgcG9zaXRpb246ICd0b3AtcmlnaHQnIC8vIHRvcC9ib3R0b20gLSBsZWZ0LGNlbnRlcixyaWdodFxuICAgIH1cbiAgfTtcblxuICB0aGlzLnNpZGUgPSBzaWRlO1xuICB0aGlzLm9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0T3B0aW9ucyk7XG4gIHRoaXMubGluZWdyYXBoT3B0aW9ucyA9IGxpbmVncmFwaE9wdGlvbnM7XG5cbiAgdGhpcy5zdmdFbGVtZW50cyA9IHt9O1xuICB0aGlzLmRvbSA9IHt9O1xuICB0aGlzLmdyb3VwcyA9IHt9O1xuICB0aGlzLmFtb3VudE9mR3JvdXBzID0gMDtcbiAgdGhpcy5fY3JlYXRlKCk7XG4gIHRoaXMuZnJhbWV3b3JrID0ge3N2ZzogdGhpcy5zdmcsIHN2Z0VsZW1lbnRzOiB0aGlzLnN2Z0VsZW1lbnRzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIGdyb3VwczogdGhpcy5ncm91cHN9O1xuXG4gIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbn1cblxuTGVnZW5kLnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnQoKTtcblxuTGVnZW5kLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmdyb3VwcyA9IHt9O1xuICB0aGlzLmFtb3VudE9mR3JvdXBzID0gMDtcbn07XG5cbkxlZ2VuZC5wcm90b3R5cGUuYWRkR3JvdXAgPSBmdW5jdGlvbihsYWJlbCwgZ3JhcGhPcHRpb25zKSB7XG5cbiAgLy8gSW5jbHVkZSBhIGdyb3VwIG9ubHkgaWYgdGhlIGdyb3VwIG9wdGlvbiAnZXhjbHVkZUZyb21MZWdlbmQ6IGZhbHNlJyBpcyBub3Qgc2V0LlxuICBpZiAoZ3JhcGhPcHRpb25zLm9wdGlvbnMuZXhjbHVkZUZyb21MZWdlbmQgIT0gdHJ1ZSkge1xuICAgIGlmICghdGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkobGFiZWwpKSB7XG4gICAgICB0aGlzLmdyb3Vwc1tsYWJlbF0gPSBncmFwaE9wdGlvbnM7XG4gICAgfVxuICAgIHRoaXMuYW1vdW50T2ZHcm91cHMgKz0gMTtcbiAgfVxufTtcblxuTGVnZW5kLnByb3RvdHlwZS51cGRhdGVHcm91cCA9IGZ1bmN0aW9uKGxhYmVsLCBncmFwaE9wdGlvbnMpIHtcbiAgdGhpcy5ncm91cHNbbGFiZWxdID0gZ3JhcGhPcHRpb25zO1xufTtcblxuTGVnZW5kLnByb3RvdHlwZS5yZW1vdmVHcm91cCA9IGZ1bmN0aW9uKGxhYmVsKSB7XG4gIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShsYWJlbCkpIHtcbiAgICBkZWxldGUgdGhpcy5ncm91cHNbbGFiZWxdO1xuICAgIHRoaXMuYW1vdW50T2ZHcm91cHMgLT0gMTtcbiAgfVxufTtcblxuTGVnZW5kLnByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZG9tLmZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZG9tLmZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtbGVnZW5kJztcbiAgdGhpcy5kb20uZnJhbWUuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRvcCA9IFwiMTBweFwiO1xuICB0aGlzLmRvbS5mcmFtZS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXG4gIHRoaXMuZG9tLnRleHRBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMuZG9tLnRleHRBcmVhLmNsYXNzTmFtZSA9ICd2aXMtbGVnZW5kLXRleHQnO1xuICB0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcbiAgdGhpcy5kb20udGV4dEFyZWEuc3R5bGUudG9wID0gXCIwcHhcIjtcblxuICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFwic3ZnXCIpO1xuICB0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gIHRoaXMuc3ZnLnN0eWxlLnRvcCA9IDAgKydweCc7XG4gIHRoaXMuc3ZnLnN0eWxlLndpZHRoID0gdGhpcy5vcHRpb25zLmljb25TaXplICsgNSArICdweCc7XG4gIHRoaXMuc3ZnLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblxuICB0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG4gIHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLnRleHRBcmVhKTtcbn07XG5cbi8qKlxuICogSGlkZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIERPTVxuICovXG5MZWdlbmQucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVtb3ZlIHRoZSBmcmFtZSBjb250YWluaW5nIHRoZSBpdGVtc1xuICBpZiAodGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZSkge1xuICAgIHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpO1xuICB9XG59O1xuXG4vKipcbiAqIFNob3cgdGhlIGNvbXBvbmVudCBpbiB0aGUgRE9NICh3aGVuIG5vdCBhbHJlYWR5IHZpc2libGUpLlxuICovXG5MZWdlbmQucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2hvdyBmcmFtZSBjb250YWluaW5nIHRoZSBpdGVtc1xuICBpZiAoIXRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUpIHtcbiAgICB0aGlzLmJvZHkuZG9tLmNlbnRlci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSk7XG4gIH1cbn07XG5cbkxlZ2VuZC5wcm90b3R5cGUuc2V0T3B0aW9ucyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgdmFyIGZpZWxkcyA9IFsnZW5hYmxlZCcsJ29yaWVudGF0aW9uJywnaWNvbnMnLCdsZWZ0JywncmlnaHQnXTtcbiAgdXRpbC5zZWxlY3RpdmVEZWVwRXh0ZW5kKGZpZWxkcywgdGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbn07XG5cbkxlZ2VuZC5wcm90b3R5cGUucmVkcmF3ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhY3RpdmVHcm91cHMgPSAwO1xuICB2YXIgZ3JvdXBBcnJheSA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXBzKTtcbiAgZ3JvdXBBcnJheS5zb3J0KGZ1bmN0aW9uIChhLGIpIHtcbiAgICByZXR1cm4gKGEgPCBiID8gLTEgOiAxKTtcbiAgfSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGdyb3VwSWQgPSBncm91cEFycmF5W2ldO1xuICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cElkXS52aXNpYmxlID09IHRydWUgJiYgKHRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W2dyb3VwSWRdID09PSB1bmRlZmluZWQgfHwgdGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbZ3JvdXBJZF0gPT0gdHJ1ZSkpIHtcbiAgICAgIGFjdGl2ZUdyb3VwcysrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS52aXNpYmxlID09IGZhbHNlIHx8IHRoaXMuYW1vdW50T2ZHcm91cHMgPT0gMCB8fCB0aGlzLm9wdGlvbnMuZW5hYmxlZCA9PSBmYWxzZSB8fCBhY3RpdmVHcm91cHMgPT0gMCkge1xuICAgIHRoaXMuaGlkZSgpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuc2hvdygpO1xuICAgIGlmICh0aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbiA9PSAndG9wLWxlZnQnIHx8IHRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9uID09ICdib3R0b20tbGVmdCcpIHtcbiAgICAgIHRoaXMuZG9tLmZyYW1lLnN0eWxlLmxlZnQgPSAnNHB4JztcbiAgICAgIHRoaXMuZG9tLmZyYW1lLnN0eWxlLnRleHRBbGlnbiA9IFwibGVmdFwiO1xuICAgICAgdGhpcy5kb20udGV4dEFyZWEuc3R5bGUudGV4dEFsaWduID0gXCJsZWZ0XCI7XG4gICAgICB0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0ID0gKHRoaXMub3B0aW9ucy5pY29uU2l6ZSArIDE1KSArICdweCc7XG4gICAgICB0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodCA9ICcnO1xuICAgICAgdGhpcy5zdmcuc3R5bGUubGVmdCA9IDAgKydweCc7XG4gICAgICB0aGlzLnN2Zy5zdHlsZS5yaWdodCA9ICcnO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZG9tLmZyYW1lLnN0eWxlLnJpZ2h0ID0gJzRweCc7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5zdHlsZS50ZXh0QWxpZ24gPSBcInJpZ2h0XCI7XG4gICAgICB0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS50ZXh0QWxpZ24gPSBcInJpZ2h0XCI7XG4gICAgICB0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodCA9ICh0aGlzLm9wdGlvbnMuaWNvblNpemUgKyAxNSkgKyAncHgnO1xuICAgICAgdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGVmdCA9ICcnO1xuICAgICAgdGhpcy5zdmcuc3R5bGUucmlnaHQgPSAwICsncHgnO1xuICAgICAgdGhpcy5zdmcuc3R5bGUubGVmdCA9ICcnO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbiA9PSAndG9wLWxlZnQnIHx8IHRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9uID09ICd0b3AtcmlnaHQnKSB7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3AgPSA0IC0gTnVtYmVyKHRoaXMuYm9keS5kb20uY2VudGVyLnN0eWxlLnRvcC5yZXBsYWNlKFwicHhcIixcIlwiKSkgKyAncHgnO1xuICAgICAgdGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tID0gJyc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdmFyIHNjcm9sbGFibGVIZWlnaHQgPSB0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodCAtIHRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0O1xuICAgICAgdGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tID0gNCArIHNjcm9sbGFibGVIZWlnaHQgKyBOdW1iZXIodGhpcy5ib2R5LmRvbS5jZW50ZXIuc3R5bGUudG9wLnJlcGxhY2UoXCJweFwiLFwiXCIpKSArICdweCc7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3AgPSAnJztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmljb25zID09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRvbS5mcmFtZS5zdHlsZS53aWR0aCA9IHRoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoICsgMTAgKyAncHgnO1xuICAgICAgdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucmlnaHQgPSAnJztcbiAgICAgIHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxlZnQgPSAnJztcbiAgICAgIHRoaXMuc3ZnLnN0eWxlLndpZHRoID0gJzBweCc7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGggPSB0aGlzLm9wdGlvbnMuaWNvblNpemUgKyAxNSArIHRoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoICsgMTAgKyAncHgnO1xuICAgICAgdGhpcy5kcmF3TGVnZW5kSWNvbnMoKTtcbiAgICB9XG5cbiAgICB2YXIgY29udGVudCA9ICcnO1xuICAgIGZvciAoaSA9IDA7IGkgPCBncm91cEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBncm91cElkID0gZ3JvdXBBcnJheVtpXTtcbiAgICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cElkXS52aXNpYmxlID09IHRydWUgJiYgKHRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W2dyb3VwSWRdID09PSB1bmRlZmluZWQgfHwgdGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbZ3JvdXBJZF0gPT0gdHJ1ZSkpIHtcbiAgICAgICAgY29udGVudCArPSB0aGlzLmdyb3Vwc1tncm91cElkXS5jb250ZW50ICsgJzxiciAvPic7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZG9tLnRleHRBcmVhLmlubmVySFRNTCA9IHV0aWwueHNzKGNvbnRlbnQpO1xuICAgIHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxpbmVIZWlnaHQgPSAoKDAuNzUgKiB0aGlzLm9wdGlvbnMuaWNvblNpemUpICsgdGhpcy5vcHRpb25zLmljb25TcGFjaW5nKSArICdweCc7XG4gIH1cbn07XG5cbkxlZ2VuZC5wcm90b3R5cGUuZHJhd0xlZ2VuZEljb25zID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKSB7XG4gICAgdmFyIGdyb3VwQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLmdyb3Vwcyk7XG4gICAgZ3JvdXBBcnJheS5zb3J0KGZ1bmN0aW9uIChhLGIpIHtcbiAgICAgIHJldHVybiAoYSA8IGIgPyAtMSA6IDEpO1xuICAgIH0pO1xuXG4gICAgLy8gdGhpcyByZXNldHMgdGhlIGVsZW1lbnRzIHNvIHRoZSBvcmRlciBpcyBtYWludGFpbmVkXG4gICAgcmVzZXRFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTtcblxuICAgIHZhciBwYWRkaW5nID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kb20uZnJhbWUpLnBhZGRpbmdUb3A7XG4gICAgdmFyIGljb25PZmZzZXQgPSBOdW1iZXIocGFkZGluZy5yZXBsYWNlKCdweCcsJycpKTtcbiAgICB2YXIgeCA9IGljb25PZmZzZXQ7XG4gICAgdmFyIGljb25XaWR0aCA9IHRoaXMub3B0aW9ucy5pY29uU2l6ZTtcbiAgICB2YXIgaWNvbkhlaWdodCA9IDAuNzUgKiB0aGlzLm9wdGlvbnMuaWNvblNpemU7XG4gICAgdmFyIHkgPSBpY29uT2Zmc2V0ICsgMC41ICogaWNvbkhlaWdodCArIDM7XG5cbiAgICB0aGlzLnN2Zy5zdHlsZS53aWR0aCA9IGljb25XaWR0aCArIDUgKyBpY29uT2Zmc2V0ICsgJ3B4JztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXBBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGdyb3VwSWQgPSBncm91cEFycmF5W2ldO1xuICAgICAgaWYgKHRoaXMuZ3JvdXBzW2dyb3VwSWRdLnZpc2libGUgPT0gdHJ1ZSAmJiAodGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbZ3JvdXBJZF0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtncm91cElkXSA9PSB0cnVlKSkge1xuICAgICAgICB0aGlzLmdyb3Vwc1tncm91cElkXS5nZXRMZWdlbmQoaWNvbldpZHRoLCBpY29uSGVpZ2h0LCB0aGlzLmZyYW1ld29yaywgeCwgeSk7XG4gICAgICAgIHkgKz0gaWNvbkhlaWdodCArIHRoaXMub3B0aW9ucy5pY29uU3BhY2luZztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbnZhciBVTkdST1VQRUQkMyA9ICdfX3VuZ3JvdXBlZF9fJzsgLy8gcmVzZXJ2ZWQgZ3JvdXAgaWQgZm9yIHVuZ3JvdXBlZCBpdGVtc1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBMaW5lR3JhcGguIEl0IHJlcXVpcmVzIGEgVGltZWxpbmUgYm9keSBhbmQgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3Zpcy5UaW1lbGluZS5ib2R5fSBib2R5XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGNvbnN0cnVjdG9yIExpbmVHcmFwaFxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKi9cbmZ1bmN0aW9uIExpbmVHcmFwaChib2R5LCBvcHRpb25zKSB7XG4gIHRoaXMuaWQgPSB2NCgpO1xuICB0aGlzLmJvZHkgPSBib2R5O1xuXG4gIHRoaXMuZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgeUF4aXNPcmllbnRhdGlvbjogJ2xlZnQnLFxuICAgIGRlZmF1bHRHcm91cDogJ2RlZmF1bHQnLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgc2FtcGxpbmc6IHRydWUsXG4gICAgc3RhY2s6IGZhbHNlLFxuICAgIGdyYXBoSGVpZ2h0OiAnNDAwcHgnLFxuICAgIHNoYWRlZDoge1xuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICBvcmllbnRhdGlvbjogJ2JvdHRvbScgLy8gdG9wLCBib3R0b20sIHplcm9cbiAgICB9LFxuICAgIHN0eWxlOiAnbGluZScsIC8vIGxpbmUsIGJhclxuICAgIGJhckNoYXJ0OiB7XG4gICAgICB3aWR0aDogNTAsXG4gICAgICBzaWRlQnlTaWRlOiBmYWxzZSxcbiAgICAgIGFsaWduOiAnY2VudGVyJyAvLyBsZWZ0LCBjZW50ZXIsIHJpZ2h0XG4gICAgfSxcbiAgICBpbnRlcnBvbGF0aW9uOiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGFyYW1ldHJpemF0aW9uOiAnY2VudHJpcGV0YWwnLCAvLyB1bmlmb3JtIChhbHBoYSA9IDAuMCksIGNob3JkYWwgKGFscGhhID0gMS4wKSwgY2VudHJpcGV0YWwgKGFscGhhID0gMC41KVxuICAgICAgYWxwaGE6IDAuNVxuICAgIH0sXG4gICAgZHJhd1BvaW50czoge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHNpemU6IDYsXG4gICAgICBzdHlsZTogJ3NxdWFyZScgLy8gc3F1YXJlLCBjaXJjbGVcbiAgICB9LFxuICAgIGRhdGFBeGlzOiB7fSwgLy9EZWZhdWx0cyBhcmUgZG9uZSBvbiBEYXRhQXhpcyBsZXZlbFxuICAgIGxlZ2VuZDoge30sIC8vRGVmYXVsdHMgYXJlIGRvbmUgb24gTGVnZW5kIGxldmVsXG4gICAgZ3JvdXBzOiB7XG4gICAgICB2aXNpYmlsaXR5OiB7fVxuICAgIH1cbiAgfTtcblxuICAvLyBvcHRpb25zIGlzIHNoYXJlZCBieSB0aGlzIGxpbmVHcmFwaCBhbmQgYWxsIGl0cyBpdGVtc1xuICB0aGlzLm9wdGlvbnMgPSB1dGlsLmV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0T3B0aW9ucyk7XG4gIHRoaXMuZG9tID0ge307XG4gIHRoaXMucHJvcHMgPSB7fTtcbiAgdGhpcy5oYW1tZXIgPSBudWxsO1xuICB0aGlzLmdyb3VwcyA9IHt9O1xuICB0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZSA9IGZhbHNlO1xuICB0aGlzLnVwZGF0ZVNWR2hlaWdodCA9IGZhbHNlO1xuICB0aGlzLnVwZGF0ZVNWR2hlaWdodE9uUmVzaXplID0gZmFsc2U7XG4gIHRoaXMuZm9yY2VHcmFwaFVwZGF0ZSA9IHRydWU7XG5cbiAgdmFyIG1lID0gdGhpcztcbiAgdGhpcy5pdGVtc0RhdGEgPSBudWxsOyAgICAvLyBEYXRhU2V0XG4gIHRoaXMuZ3JvdXBzRGF0YSA9IG51bGw7ICAgLy8gRGF0YVNldFxuXG4gIC8vIGxpc3RlbmVycyBmb3IgdGhlIERhdGFTZXQgb2YgdGhlIGl0ZW1zXG4gIHRoaXMuaXRlbUxpc3RlbmVycyA9IHtcbiAgICAnYWRkJzogZnVuY3Rpb24gKGV2ZW50LCBwYXJhbXMsIHNlbmRlcklkKSB7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBtZS5fb25BZGQocGFyYW1zLml0ZW1zKTtcbiAgICB9LFxuICAgICd1cGRhdGUnOiBmdW5jdGlvbiAoZXZlbnQsIHBhcmFtcywgc2VuZGVySWQpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG1lLl9vblVwZGF0ZShwYXJhbXMuaXRlbXMpO1xuICAgIH0sXG4gICAgJ3JlbW92ZSc6IGZ1bmN0aW9uIChldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgbWUuX29uUmVtb3ZlKHBhcmFtcy5pdGVtcyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGxpc3RlbmVycyBmb3IgdGhlIERhdGFTZXQgb2YgdGhlIGdyb3Vwc1xuICB0aGlzLmdyb3VwTGlzdGVuZXJzID0ge1xuICAgICdhZGQnOiBmdW5jdGlvbiAoZXZlbnQsIHBhcmFtcywgc2VuZGVySWQpIHsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIG1lLl9vbkFkZEdyb3VwcyhwYXJhbXMuaXRlbXMpO1xuICAgIH0sXG4gICAgJ3VwZGF0ZSc6IGZ1bmN0aW9uIChldmVudCwgcGFyYW1zLCBzZW5kZXJJZCkgeyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgICAgbWUuX29uVXBkYXRlR3JvdXBzKHBhcmFtcy5pdGVtcyk7XG4gICAgfSxcbiAgICAncmVtb3ZlJzogZnVuY3Rpb24gKGV2ZW50LCBwYXJhbXMsIHNlbmRlcklkKSB7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICBtZS5fb25SZW1vdmVHcm91cHMocGFyYW1zLml0ZW1zKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5pdGVtcyA9IHt9OyAgICAgIC8vIG9iamVjdCB3aXRoIGFuIEl0ZW0gZm9yIGV2ZXJ5IGRhdGEgaXRlbVxuICB0aGlzLnNlbGVjdGlvbiA9IFtdOyAgLy8gbGlzdCB3aXRoIHRoZSBpZHMgb2YgYWxsIHNlbGVjdGVkIG5vZGVzXG4gIHRoaXMubGFzdFN0YXJ0ID0gdGhpcy5ib2R5LnJhbmdlLnN0YXJ0O1xuICB0aGlzLnRvdWNoUGFyYW1zID0ge307IC8vIHN0b3JlcyBwcm9wZXJ0aWVzIHdoaWxlIGRyYWdnaW5nXG5cbiAgdGhpcy5zdmdFbGVtZW50cyA9IHt9O1xuICB0aGlzLnNldE9wdGlvbnMob3B0aW9ucyk7XG4gIHRoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzID0gWzBdO1xuICB0aGlzLmJvZHkuZW1pdHRlci5vbigncmFuZ2VjaGFuZ2VkJywgZnVuY3Rpb24gKCkge1xuICAgIG1lLnN2Zy5zdHlsZS5sZWZ0ID0gdXRpbC5vcHRpb24uYXNTaXplKC1tZS5wcm9wcy53aWR0aCk7XG5cbiAgICBtZS5mb3JjZUdyYXBoVXBkYXRlID0gdHJ1ZTtcbiAgICAvL0lzIHRoaXMgbG9jYWwgcmVkcmF3IG5lY2Vzc2FyeT8gKENvcmUgYWxzbyBkb2VzIGEgY2hhbmdlIGV2ZW50ISlcbiAgICBtZS5yZWRyYXcuY2FsbChtZSk7XG4gIH0pO1xuXG4gIC8vIGNyZWF0ZSB0aGUgSFRNTCBET01cbiAgdGhpcy5fY3JlYXRlKCk7XG4gIHRoaXMuZnJhbWV3b3JrID0ge3N2ZzogdGhpcy5zdmcsIHN2Z0VsZW1lbnRzOiB0aGlzLnN2Z0VsZW1lbnRzLCBvcHRpb25zOiB0aGlzLm9wdGlvbnMsIGdyb3VwczogdGhpcy5ncm91cHN9O1xufVxuXG5MaW5lR3JhcGgucHJvdG90eXBlID0gbmV3IENvbXBvbmVudCgpO1xuXG4vKipcbiAqIENyZWF0ZSB0aGUgSFRNTCBET00gZm9yIHRoZSBJdGVtU2V0XG4gKi9cbkxpbmVHcmFwaC5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGZyYW1lLmNsYXNzTmFtZSA9ICd2aXMtbGluZS1ncmFwaCc7XG4gIHRoaXMuZG9tLmZyYW1lID0gZnJhbWU7XG5cbiAgLy8gY3JlYXRlIHN2ZyBlbGVtZW50IGZvciBncmFwaCBkcmF3aW5nLlxuICB0aGlzLnN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gIHRoaXMuc3ZnLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgdGhpcy5zdmcuc3R5bGUuaGVpZ2h0ID0gKCcnICsgdGhpcy5vcHRpb25zLmdyYXBoSGVpZ2h0KS5yZXBsYWNlKCdweCcsICcnKSArICdweCc7XG4gIHRoaXMuc3ZnLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICBmcmFtZS5hcHBlbmRDaGlsZCh0aGlzLnN2Zyk7XG5cbiAgLy8gZGF0YSBheGlzXG4gIHRoaXMub3B0aW9ucy5kYXRhQXhpcy5vcmllbnRhdGlvbiA9ICdsZWZ0JztcbiAgdGhpcy55QXhpc0xlZnQgPSBuZXcgRGF0YUF4aXModGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMuZGF0YUF4aXMsIHRoaXMuc3ZnLCB0aGlzLm9wdGlvbnMuZ3JvdXBzKTtcblxuICB0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb24gPSAncmlnaHQnO1xuICB0aGlzLnlBeGlzUmlnaHQgPSBuZXcgRGF0YUF4aXModGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMuZGF0YUF4aXMsIHRoaXMuc3ZnLCB0aGlzLm9wdGlvbnMuZ3JvdXBzKTtcbiAgZGVsZXRlIHRoaXMub3B0aW9ucy5kYXRhQXhpcy5vcmllbnRhdGlvbjtcblxuICAvLyBsZWdlbmRzXG4gIHRoaXMubGVnZW5kTGVmdCA9IG5ldyBMZWdlbmQodGhpcy5ib2R5LCB0aGlzLm9wdGlvbnMubGVnZW5kLCAnbGVmdCcsIHRoaXMub3B0aW9ucy5ncm91cHMpO1xuICB0aGlzLmxlZ2VuZFJpZ2h0ID0gbmV3IExlZ2VuZCh0aGlzLmJvZHksIHRoaXMub3B0aW9ucy5sZWdlbmQsICdyaWdodCcsIHRoaXMub3B0aW9ucy5ncm91cHMpO1xuXG4gIHRoaXMuc2hvdygpO1xufTtcblxuLyoqXG4gKiBzZXQgdGhlIG9wdGlvbnMgb2YgdGhlIExpbmVHcmFwaC4gdGhlIG1lcmdlT3B0aW9ucyBpcyB1c2VkIGZvciBzdWJPYmplY3RzIHRoYXQgaGF2ZSBhbiBlbmFibGVkIGVsZW1lbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucykge1xuICAgIHZhciBmaWVsZHMgPSBbJ3NhbXBsaW5nJywgJ2RlZmF1bHRHcm91cCcsICdzdGFjaycsICdoZWlnaHQnLCAnZ3JhcGhIZWlnaHQnLCAneUF4aXNPcmllbnRhdGlvbicsICdzdHlsZScsICdiYXJDaGFydCcsICdkYXRhQXhpcycsICdzb3J0JywgJ2dyb3VwcyddO1xuICAgIGlmIChvcHRpb25zLmdyYXBoSGVpZ2h0ID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy51cGRhdGVTVkdoZWlnaHQgPSB0cnVlO1xuICAgICAgdGhpcy51cGRhdGVTVkdoZWlnaHRPblJlc2l6ZSA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5ncmFwaEhlaWdodCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocGFyc2VJbnQoKG9wdGlvbnMuZ3JhcGhIZWlnaHQgKyAnJykucmVwbGFjZShcInB4XCIsICcnKSkgPCB0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVNWR2hlaWdodCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHV0aWwuc2VsZWN0aXZlRGVlcEV4dGVuZChmaWVsZHMsIHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdXRpbC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLCBvcHRpb25zLCAnaW50ZXJwb2xhdGlvbicpO1xuICAgIHV0aWwubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucywgb3B0aW9ucywgJ2RyYXdQb2ludHMnKTtcbiAgICB1dGlsLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMsICdzaGFkZWQnKTtcbiAgICB1dGlsLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsIG9wdGlvbnMsICdsZWdlbmQnKTtcblxuICAgIGlmIChvcHRpb25zLmludGVycG9sYXRpb24pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5pbnRlcnBvbGF0aW9uID09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24gPT0gJ3VuaWZvcm0nKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24gPT0gJ2Nob3JkYWwnKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYSA9IDEuMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24gPSAnY2VudHJpcGV0YWwnO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGEgPSAwLjU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMueUF4aXNMZWZ0KSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhQXhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMueUF4aXNMZWZ0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKTtcbiAgICAgICAgdGhpcy55QXhpc1JpZ2h0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWdlbmRMZWZ0KSB7XG4gICAgICBpZiAob3B0aW9ucy5sZWdlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxlZ2VuZExlZnQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMubGVnZW5kKTtcbiAgICAgICAgdGhpcy5sZWdlbmRSaWdodC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5sZWdlbmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShVTkdST1VQRUQkMykpIHtcbiAgICAgIHRoaXMuZ3JvdXBzW1VOR1JPVVBFRCQzXS5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRoaXMgaXMgdXNlZCB0byByZWRyYXcgdGhlIGdyYXBoIGlmIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBncm91cHMgaXMgY2hhbmdlZC5cbiAgaWYgKHRoaXMuZG9tLmZyYW1lKSB7IC8vbm90IG9uIGluaXRpYWwgcnVuP1xuICAgIHRoaXMuZm9yY2VHcmFwaFVwZGF0ZT10cnVlO1xuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiB0cnVlfSk7XG4gIH1cbn07XG5cbi8qKlxuICogSGlkZSB0aGUgY29tcG9uZW50IGZyb20gdGhlIERPTVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIHJlbW92ZSB0aGUgZnJhbWUgY29udGFpbmluZyB0aGUgaXRlbXNcbiAgaWYgKHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUpIHtcbiAgICB0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZyYW1lKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIFNob3cgdGhlIGNvbXBvbmVudCBpbiB0aGUgRE9NICh3aGVuIG5vdCBhbHJlYWR5IHZpc2libGUpLlxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIHNob3cgZnJhbWUgY29udGFpbmluZyB0aGUgaXRlbXNcbiAgaWYgKCF0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKSB7XG4gICAgdGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU2V0IGl0ZW1zXG4gKiBAcGFyYW0ge3Zpcy5EYXRhU2V0IHwgbnVsbH0gaXRlbXNcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5zZXRJdGVtcyA9IGZ1bmN0aW9uIChpdGVtcykge1xuICB2YXIgbWUgPSB0aGlzLFxuICAgIGlkcyxcbiAgICBvbGRJdGVtc0RhdGEgPSB0aGlzLml0ZW1zRGF0YTtcblxuICAvLyByZXBsYWNlIHRoZSBkYXRhc2V0XG4gIGlmICghaXRlbXMpIHtcbiAgICB0aGlzLml0ZW1zRGF0YSA9IG51bGw7XG4gIH1cbiAgZWxzZSBpZiAoaXNEYXRhVmlld0xpa2UoXCJpZFwiLCBpdGVtcykpIHtcbiAgICB0aGlzLml0ZW1zRGF0YSA9IHR5cGVDb2VyY2VEYXRhU2V0KGl0ZW1zKTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdEYXRhIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlldycpO1xuICB9XG5cbiAgaWYgKG9sZEl0ZW1zRGF0YSkge1xuICAgIC8vIHVuc3Vic2NyaWJlIGZyb20gb2xkIGRhdGFzZXRcbiAgICB1dGlsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLCBmdW5jdGlvbiAoY2FsbGJhY2ssIGV2ZW50KSB7XG4gICAgICBvbGRJdGVtc0RhdGEub2ZmKGV2ZW50LCBjYWxsYmFjayk7XG4gICAgfSk7XG5cbiAgICAvLyBzdG9wIG1haW50YWluaW5nIGEgY29lcmNlZCB2ZXJzaW9uIG9mIHRoZSBvbGQgZGF0YSBzZXRcbiAgICBvbGRJdGVtc0RhdGEuZGlzcG9zZSgpO1xuXG4gICAgLy8gcmVtb3ZlIGFsbCBkcmF3biBpdGVtc1xuICAgIGlkcyA9IG9sZEl0ZW1zRGF0YS5nZXRJZHMoKTtcbiAgICB0aGlzLl9vblJlbW92ZShpZHMpO1xuICB9XG5cbiAgaWYgKHRoaXMuaXRlbXNEYXRhKSB7XG4gICAgLy8gc3Vic2NyaWJlIHRvIG5ldyBkYXRhc2V0XG4gICAgdmFyIGlkID0gdGhpcy5pZDtcbiAgICB1dGlsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLCBmdW5jdGlvbiAoY2FsbGJhY2ssIGV2ZW50KSB7XG4gICAgICBtZS5pdGVtc0RhdGEub24oZXZlbnQsIGNhbGxiYWNrLCBpZCk7XG4gICAgfSk7XG5cbiAgICAvLyBhZGQgYWxsIG5ldyBpdGVtc1xuICAgIGlkcyA9IHRoaXMuaXRlbXNEYXRhLmdldElkcygpO1xuICAgIHRoaXMuX29uQWRkKGlkcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTZXQgZ3JvdXBzXG4gKiBAcGFyYW0ge3Zpcy5EYXRhU2V0fSBncm91cHNcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5zZXRHcm91cHMgPSBmdW5jdGlvbiAoZ3JvdXBzKSB7XG4gIHZhciBtZSA9IHRoaXM7XG4gIHZhciBpZHM7XG5cbiAgLy8gdW5zdWJzY3JpYmUgZnJvbSBjdXJyZW50IGRhdGFzZXRcbiAgaWYgKHRoaXMuZ3JvdXBzRGF0YSkge1xuICAgIHV0aWwuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLCBmdW5jdGlvbiAoY2FsbGJhY2ssIGV2ZW50KSB7XG4gICAgICBtZS5ncm91cHNEYXRhLm9mZihldmVudCwgY2FsbGJhY2spO1xuICAgIH0pO1xuXG4gICAgLy8gcmVtb3ZlIGFsbCBkcmF3biBncm91cHNcbiAgICBpZHMgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCk7XG4gICAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fcmVtb3ZlR3JvdXAoaWRzW2ldKTtcbiAgICB9XG4gIH1cblxuICAvLyByZXBsYWNlIHRoZSBkYXRhc2V0XG4gIGlmICghZ3JvdXBzKSB7XG4gICAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDtcbiAgfVxuICBlbHNlIGlmIChpc0RhdGFWaWV3TGlrZShcImlkXCIsIGdyb3VwcykpIHtcbiAgICB0aGlzLmdyb3Vwc0RhdGEgPSBncm91cHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGF0YSBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIG9mIERhdGFTZXQgb3IgRGF0YVZpZXcnKTtcbiAgfVxuXG4gIGlmICh0aGlzLmdyb3Vwc0RhdGEpIHtcbiAgICAvLyBzdWJzY3JpYmUgdG8gbmV3IGRhdGFzZXRcbiAgICB2YXIgaWQgPSB0aGlzLmlkO1xuICAgIHV0aWwuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLCBmdW5jdGlvbiAoY2FsbGJhY2ssIGV2ZW50KSB7XG4gICAgICBtZS5ncm91cHNEYXRhLm9uKGV2ZW50LCBjYWxsYmFjaywgaWQpO1xuICAgIH0pO1xuXG4gICAgLy8gZHJhdyBhbGwgbXNcbiAgICBpZHMgPSB0aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKCk7XG4gICAgdGhpcy5fb25BZGRHcm91cHMoaWRzKTtcbiAgfVxufTtcblxuTGluZUdyYXBoLnByb3RvdHlwZS5fb25VcGRhdGUgPSBmdW5jdGlvbiAoaWRzKSB7XG4gIHRoaXMuX3VwZGF0ZUFsbEdyb3VwRGF0YShpZHMpO1xufTtcbkxpbmVHcmFwaC5wcm90b3R5cGUuX29uQWRkID0gZnVuY3Rpb24gKGlkcykge1xuICB0aGlzLl9vblVwZGF0ZShpZHMpO1xufTtcbkxpbmVHcmFwaC5wcm90b3R5cGUuX29uUmVtb3ZlID0gZnVuY3Rpb24gKGlkcykge1xuICB0aGlzLl9vblVwZGF0ZShpZHMpO1xufTtcbkxpbmVHcmFwaC5wcm90b3R5cGUuX29uVXBkYXRlR3JvdXBzID0gZnVuY3Rpb24gKGdyb3VwSWRzKSB7XG4gIHRoaXMuX3VwZGF0ZUFsbEdyb3VwRGF0YShudWxsLCBncm91cElkcyk7XG59O1xuTGluZUdyYXBoLnByb3RvdHlwZS5fb25BZGRHcm91cHMgPSBmdW5jdGlvbiAoZ3JvdXBJZHMpIHtcbiAgdGhpcy5fb25VcGRhdGVHcm91cHMoZ3JvdXBJZHMpO1xufTtcblxuLyoqXG4gKiB0aGlzIGNsZWFucyB0aGUgZ3JvdXAgb3V0IG9mZiB0aGUgbGVnZW5kcyBhbmQgdGhlIGRhdGFheGlzLCB1cGRhdGVzIHRoZSB1bmdyb3VwZWQgYW5kIHVwZGF0ZXMgdGhlIGdyYXBoXG4gKiBAcGFyYW0ge0FycmF5fSBncm91cElkc1xuICogQHByaXZhdGVcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHMgPSBmdW5jdGlvbiAoZ3JvdXBJZHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cElkcy5sZW5ndGg7IGkrKykge1xuICAgIHRoaXMuX3JlbW92ZUdyb3VwKGdyb3VwSWRzW2ldKTtcbiAgfVxuICB0aGlzLmZvcmNlR3JhcGhVcGRhdGUgPSB0cnVlO1xuICB0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTogdHJ1ZX0pO1xufTtcblxuLyoqXG4gKiB0aGlzIGNsZWFucyB0aGUgZ3JvdXAgb3V0IG9mZiB0aGUgbGVnZW5kcyBhbmQgdGhlIGRhdGFheGlzXG4gKiBAcGFyYW0ge3Zpcy5HcmFwaEdyb3VwLmlkfSBncm91cElkXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl9yZW1vdmVHcm91cCA9IGZ1bmN0aW9uIChncm91cElkKSB7XG4gIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cElkXS5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24gPT0gJ3JpZ2h0Jykge1xuICAgICAgdGhpcy55QXhpc1JpZ2h0LnJlbW92ZUdyb3VwKGdyb3VwSWQpO1xuICAgICAgdGhpcy5sZWdlbmRSaWdodC5yZW1vdmVHcm91cChncm91cElkKTtcbiAgICAgIHRoaXMubGVnZW5kUmlnaHQucmVkcmF3KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZ3JvdXBJZCk7XG4gICAgICB0aGlzLmxlZ2VuZExlZnQucmVtb3ZlR3JvdXAoZ3JvdXBJZCk7XG4gICAgICB0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmdyb3Vwc1tncm91cElkXTtcbiAgfVxufTtcblxuLyoqXG4gKiB1cGRhdGUgYSBncm91cCBvYmplY3Qgd2l0aCB0aGUgZ3JvdXAgZGF0YXNldCBlbnRyZWVcbiAqXG4gKiBAcGFyYW0ge3Zpcy5HcmFwaEdyb3VwfSBncm91cFxuICogQHBhcmFtIHt2aXMuR3JhcGhHcm91cC5pZH0gZ3JvdXBJZFxuICogQHByaXZhdGVcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5fdXBkYXRlR3JvdXAgPSBmdW5jdGlvbiAoZ3JvdXAsIGdyb3VwSWQpIHtcbiAgaWYgKCF0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgIHRoaXMuZ3JvdXBzW2dyb3VwSWRdID0gbmV3IEdyYXBoR3JvdXAoZ3JvdXAsIGdyb3VwSWQsIHRoaXMub3B0aW9ucywgdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMpO1xuICAgIGlmICh0aGlzLmdyb3Vwc1tncm91cElkXS5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24gPT0gJ3JpZ2h0Jykge1xuICAgICAgdGhpcy55QXhpc1JpZ2h0LmFkZEdyb3VwKGdyb3VwSWQsIHRoaXMuZ3JvdXBzW2dyb3VwSWRdKTtcbiAgICAgIHRoaXMubGVnZW5kUmlnaHQuYWRkR3JvdXAoZ3JvdXBJZCwgdGhpcy5ncm91cHNbZ3JvdXBJZF0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMueUF4aXNMZWZ0LmFkZEdyb3VwKGdyb3VwSWQsIHRoaXMuZ3JvdXBzW2dyb3VwSWRdKTtcbiAgICAgIHRoaXMubGVnZW5kTGVmdC5hZGRHcm91cChncm91cElkLCB0aGlzLmdyb3Vwc1tncm91cElkXSk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuZ3JvdXBzW2dyb3VwSWRdLnVwZGF0ZShncm91cCk7XG4gICAgaWYgKHRoaXMuZ3JvdXBzW2dyb3VwSWRdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiA9PSAncmlnaHQnKSB7XG4gICAgICB0aGlzLnlBeGlzUmlnaHQudXBkYXRlR3JvdXAoZ3JvdXBJZCwgdGhpcy5ncm91cHNbZ3JvdXBJZF0pO1xuICAgICAgdGhpcy5sZWdlbmRSaWdodC51cGRhdGVHcm91cChncm91cElkLCB0aGlzLmdyb3Vwc1tncm91cElkXSk7XG4gICAgICAvL0lmIHlBeGlzT3JpZW50YXRpb24gY2hhbmdlZCwgY2xlYW4gb3V0IHRoZSBncm91cCBmcm9tIHRoZSBvdGhlciBheGlzLlxuICAgICAgdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZ3JvdXBJZCk7XG4gICAgICB0aGlzLmxlZ2VuZExlZnQucmVtb3ZlR3JvdXAoZ3JvdXBJZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy55QXhpc0xlZnQudXBkYXRlR3JvdXAoZ3JvdXBJZCwgdGhpcy5ncm91cHNbZ3JvdXBJZF0pO1xuICAgICAgdGhpcy5sZWdlbmRMZWZ0LnVwZGF0ZUdyb3VwKGdyb3VwSWQsIHRoaXMuZ3JvdXBzW2dyb3VwSWRdKTtcbiAgICAgIC8vSWYgeUF4aXNPcmllbnRhdGlvbiBjaGFuZ2VkLCBjbGVhbiBvdXQgdGhlIGdyb3VwIGZyb20gdGhlIG90aGVyIGF4aXMuXG4gICAgICB0aGlzLnlBeGlzUmlnaHQucmVtb3ZlR3JvdXAoZ3JvdXBJZCk7XG4gICAgICB0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKGdyb3VwSWQpO1xuICAgIH1cbiAgfVxuICB0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCk7XG4gIHRoaXMubGVnZW5kUmlnaHQucmVkcmF3KCk7XG59O1xuXG5cbi8qKlxuICogdGhpcyB1cGRhdGVzIGFsbCBncm91cHMsIGl0IGlzIHVzZWQgd2hlbiB0aGVyZSBpcyBhbiB1cGRhdGUgdGhlIHRoZSBpdGVtc2V0LlxuICpcbiAqIEBwYXJhbSAge0FycmF5fSBpZHNcbiAqIEBwYXJhbSAge0FycmF5fSBncm91cElkc1xuICogQHByaXZhdGVcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5fdXBkYXRlQWxsR3JvdXBEYXRhID0gZnVuY3Rpb24gKGlkcywgZ3JvdXBJZHMpIHtcbiAgaWYgKHRoaXMuaXRlbXNEYXRhICE9IG51bGwpIHtcbiAgICB2YXIgZ3JvdXBzQ29udGVudCA9IHt9O1xuICAgIHZhciBpdGVtcyA9IHRoaXMuaXRlbXNEYXRhLmdldCgpO1xuICAgIHZhciBmaWVsZElkID0gdGhpcy5pdGVtc0RhdGEuaWRQcm9wO1xuICAgIHZhciBpZE1hcCA9IHt9O1xuICAgIGlmIChpZHMpe1xuICAgICAgaWRzLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICAgICAgaWRNYXBbaWRdID0gaWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvL3ByZS1EZXRlcm1pbmUgYXJyYXkgc2l6ZXMsIGZvciBtb3JlIGVmZmljaWVudCBtZW1vcnkgY2xhaW1cbiAgICB2YXIgZ3JvdXBDb3VudHMgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgdmFyIGdyb3VwSWQgPSBpdGVtLmdyb3VwO1xuICAgICAgaWYgKGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGdyb3VwSWQgPSBVTkdST1VQRUQkMztcbiAgICAgIH1cbiAgICAgIGdyb3VwQ291bnRzLmhhc093blByb3BlcnR5KGdyb3VwSWQpID8gZ3JvdXBDb3VudHNbZ3JvdXBJZF0rKyA6IGdyb3VwQ291bnRzW2dyb3VwSWRdID0gMTtcbiAgICB9XG5cbiAgICAvL1ByZS1sb2FkIGFycmF5cyBmcm9tIGV4aXN0aW5nIGdyb3VwcyBpZiBpdGVtcyBhcmUgbm90IGNoYW5nZWQgKG5vdCBpbiBpZHMpXG4gICAgdmFyIGV4aXN0aW5nSXRlbXNNYXAgPSB7fTtcbiAgICBpZiAoIWdyb3VwSWRzICYmIGlkcykge1xuICAgICAgZm9yIChncm91cElkIGluIHRoaXMuZ3JvdXBzKSB7XG4gICAgICAgIGlmICh0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgICAgICAgIGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZF07XG4gICAgICAgICAgdmFyIGV4aXN0aW5nX2l0ZW1zID0gZ3JvdXAuZ2V0SXRlbXMoKTtcblxuICAgICAgICAgIGdyb3Vwc0NvbnRlbnRbZ3JvdXBJZF0gPSBleGlzdGluZ19pdGVtcy5maWx0ZXIoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgIGV4aXN0aW5nSXRlbXNNYXBbaXRlbVtmaWVsZElkXV0gPSBpdGVtW2ZpZWxkSWRdO1xuICAgICAgICAgICAgcmV0dXJuIChpdGVtW2ZpZWxkSWRdICE9PSBpZE1hcFtpdGVtW2ZpZWxkSWRdXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmFyIG5ld0xlbmd0aCA9IGdyb3VwQ291bnRzW2dyb3VwSWRdO1xuICAgICAgICAgIGdyb3VwQ291bnRzW2dyb3VwSWRdIC09IGdyb3Vwc0NvbnRlbnRbZ3JvdXBJZF0ubGVuZ3RoO1xuICAgICAgICAgIGlmIChncm91cHNDb250ZW50W2dyb3VwSWRdLmxlbmd0aCA8IG5ld0xlbmd0aCkge1xuICAgICAgICAgICAgZ3JvdXBzQ29udGVudFtncm91cElkXVtuZXdMZW5ndGggLSAxXSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vTm93IGluc2VydCBkYXRhIGludG8gdGhlIGFycmF5cy5cbiAgICBmb3IgKGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGl0ZW0gPSBpdGVtc1tpXTtcbiAgICAgIGdyb3VwSWQgPSBpdGVtLmdyb3VwO1xuICAgICAgaWYgKGdyb3VwSWQgPT09IG51bGwgfHwgZ3JvdXBJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGdyb3VwSWQgPSBVTkdST1VQRUQkMztcbiAgICAgIH1cbiAgICAgIGlmICghZ3JvdXBJZHMgJiYgaWRzICYmIChpdGVtW2ZpZWxkSWRdICE9PSBpZE1hcFtpdGVtW2ZpZWxkSWRdXSkgJiYgZXhpc3RpbmdJdGVtc01hcC5oYXNPd25Qcm9wZXJ0eShpdGVtW2ZpZWxkSWRdKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghZ3JvdXBzQ29udGVudC5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgICAgICBncm91cHNDb250ZW50W2dyb3VwSWRdID0gbmV3IEFycmF5KGdyb3VwQ291bnRzW2dyb3VwSWRdKTtcbiAgICAgIH1cbiAgICAgIC8vQ29weSBkYXRhIChiZWNhdXNlIG9mIHVubW9kaWZpYWJsZSBEYXRhVmlldyBpbnB1dC5cbiAgICAgIHZhciBleHRlbmRlZCA9IHV0aWwuYnJpZGdlT2JqZWN0KGl0ZW0pO1xuICAgICAgZXh0ZW5kZWQueCA9IHV0aWwuY29udmVydChpdGVtLngsICdEYXRlJyk7XG4gICAgICBleHRlbmRlZC5lbmQgPSB1dGlsLmNvbnZlcnQoaXRlbS5lbmQsICdEYXRlJyk7XG4gICAgICBleHRlbmRlZC5vcmdpbmFsWSA9IGl0ZW0ueTsgLy9yZWFsIFlcbiAgICAgIGV4dGVuZGVkLnkgPSBOdW1iZXIoaXRlbS55KTtcbiAgICAgIGV4dGVuZGVkW2ZpZWxkSWRdID0gaXRlbVtmaWVsZElkXTtcblxuICAgICAgdmFyIGluZGV4PSBncm91cHNDb250ZW50W2dyb3VwSWRdLmxlbmd0aCAtIGdyb3VwQ291bnRzW2dyb3VwSWRdLS07XG4gICAgICBncm91cHNDb250ZW50W2dyb3VwSWRdW2luZGV4XSA9IGV4dGVuZGVkO1xuICAgIH1cblxuICAgIC8vTWFrZSBzdXJlIGFsbCBncm91cHMgYXJlIHByZXNlbnQsIHRvIGFsbG93IHJlbW92YWwgb2Ygb2xkIGdyb3Vwc1xuICAgIGZvciAoZ3JvdXBJZCBpbiB0aGlzLmdyb3Vwcyl7XG4gICAgICBpZiAodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZ3JvdXBJZCkpe1xuICAgICAgICBpZiAoIWdyb3Vwc0NvbnRlbnQuaGFzT3duUHJvcGVydHkoZ3JvdXBJZCkpIHtcbiAgICAgICAgICBncm91cHNDb250ZW50W2dyb3VwSWRdID0gbmV3IEFycmF5KDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9VcGRhdGUgbGVnZW5kYXMsIHN0eWxlIGFuZCBheGlzXG4gICAgZm9yIChncm91cElkIGluIGdyb3Vwc0NvbnRlbnQpIHtcbiAgICAgIGlmIChncm91cHNDb250ZW50Lmhhc093blByb3BlcnR5KGdyb3VwSWQpKSB7XG4gICAgICAgIGlmIChncm91cHNDb250ZW50W2dyb3VwSWRdLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGdyb3VwSWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW1vdmVHcm91cChncm91cElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIGdyb3VwID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmdyb3Vwc0RhdGEgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBncm91cCA9IHRoaXMuZ3JvdXBzRGF0YS5nZXQoZ3JvdXBJZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChncm91cCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGdyb3VwID0ge2lkOiBncm91cElkLCBjb250ZW50OiB0aGlzLm9wdGlvbnMuZGVmYXVsdEdyb3VwICsgZ3JvdXBJZH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuX3VwZGF0ZUdyb3VwKGdyb3VwLCBncm91cElkKTtcbiAgICAgICAgICB0aGlzLmdyb3Vwc1tncm91cElkXS5zZXRJdGVtcyhncm91cHNDb250ZW50W2dyb3VwSWRdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmZvcmNlR3JhcGhVcGRhdGUgPSB0cnVlO1xuICAgIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiB0cnVlfSk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVkcmF3IHRoZSBjb21wb25lbnQsIG1hbmRhdG9yeSBmdW5jdGlvblxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgaXMgcmVzaXplZFxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlc2l6ZWQgPSBmYWxzZTtcblxuICAvLyBjYWxjdWxhdGUgYWN0dWFsIHNpemUgYW5kIHBvc2l0aW9uXG4gIHRoaXMucHJvcHMud2lkdGggPSB0aGlzLmRvbS5mcmFtZS5vZmZzZXRXaWR0aDtcbiAgdGhpcy5wcm9wcy5oZWlnaHQgPSB0aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodFxuICAgIC0gdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci50b3BcbiAgICAtIHRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIuYm90dG9tO1xuXG4gIC8vIGNoZWNrIGlmIHRoaXMgY29tcG9uZW50IGlzIHJlc2l6ZWRcbiAgcmVzaXplZCA9IHRoaXMuX2lzUmVzaXplZCgpIHx8IHJlc2l6ZWQ7XG5cbiAgLy8gY2hlY2sgd2hldGhlciB6b29tZWQgKGluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHJlLXN0YWNrIGV2ZXJ5dGhpbmcpXG4gIHZhciB2aXNpYmxlSW50ZXJ2YWwgPSB0aGlzLmJvZHkucmFuZ2UuZW5kIC0gdGhpcy5ib2R5LnJhbmdlLnN0YXJ0O1xuICB2YXIgem9vbWVkID0gKHZpc2libGVJbnRlcnZhbCAhPSB0aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWwpO1xuICB0aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWwgPSB2aXNpYmxlSW50ZXJ2YWw7XG5cblxuICAvLyB0aGUgc3ZnIGVsZW1lbnQgaXMgdGhyZWUgdGltZXMgYXMgYmlnIGFzIHRoZSB3aWR0aCwgdGhpcyBhbGxvd3MgZm9yIGZ1bGx5IGRyYWdnaW5nIGxlZnQgYW5kIHJpZ2h0XG4gIC8vIHdpdGhvdXQgcmVsb2FkaW5nIHRoZSBncmFwaC4gdGhlIGNvbnRyb2xzIGZvciB0aGlzIGFyZSBib3VuZCB0byBldmVudHMgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIGlmIChyZXNpemVkID09IHRydWUpIHtcbiAgICB0aGlzLnN2Zy5zdHlsZS53aWR0aCA9IHV0aWwub3B0aW9uLmFzU2l6ZSgzICogdGhpcy5wcm9wcy53aWR0aCk7XG4gICAgdGhpcy5zdmcuc3R5bGUubGVmdCA9IHV0aWwub3B0aW9uLmFzU2l6ZSgtdGhpcy5wcm9wcy53aWR0aCk7XG5cbiAgICAvLyBpZiB0aGUgaGVpZ2h0IG9mIHRoZSBncmFwaCBpcyBzZXQgYXMgcHJvcG9ydGlvbmFsLCBjaGFuZ2UgdGhlIGhlaWdodCBvZiB0aGUgc3ZnXG4gICAgaWYgKCh0aGlzLm9wdGlvbnMuaGVpZ2h0ICsgJycpLmluZGV4T2YoXCIlXCIpICE9IC0xIHx8IHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemUgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy51cGRhdGVTVkdoZWlnaHQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHVwZGF0ZSB0aGUgaGVpZ2h0IG9mIHRoZSBncmFwaCBvbiBlYWNoIHJlZHJhdyBvZiB0aGUgZ3JhcGguXG4gIGlmICh0aGlzLnVwZGF0ZVNWR2hlaWdodCA9PSB0cnVlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5ncmFwaEhlaWdodCAhPSB0aGlzLnByb3BzLmhlaWdodCArICdweCcpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5ncmFwaEhlaWdodCA9IHRoaXMucHJvcHMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgIHRoaXMuc3ZnLnN0eWxlLmhlaWdodCA9IHRoaXMucHJvcHMuaGVpZ2h0ICsgJ3B4JztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVTVkdoZWlnaHQgPSBmYWxzZTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLnN2Zy5zdHlsZS5oZWlnaHQgPSAoJycgKyB0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQpLnJlcGxhY2UoJ3B4JywgJycpICsgJ3B4JztcbiAgfVxuXG4gIC8vIHpvb21lZCBpcyBoZXJlIHRvIGVuc3VyZSB0aGF0IGFuaW1hdGlvbnMgYXJlIHNob3duIGNvcnJlY3RseS5cbiAgaWYgKHJlc2l6ZWQgPT0gdHJ1ZSB8fCB6b29tZWQgPT0gdHJ1ZSB8fCB0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZSA9PSB0cnVlIHx8IHRoaXMuZm9yY2VHcmFwaFVwZGF0ZSA9PSB0cnVlKSB7XG4gICAgcmVzaXplZCA9IHRoaXMuX3VwZGF0ZUdyYXBoKCkgfHwgcmVzaXplZDtcbiAgICB0aGlzLmZvcmNlR3JhcGhVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLmxhc3RTdGFydCA9IHRoaXMuYm9keS5yYW5nZS5zdGFydDtcbiAgICB0aGlzLnN2Zy5zdHlsZS5sZWZ0ID0gKC10aGlzLnByb3BzLndpZHRoKSArICdweCc7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gbW92ZSB0aGUgd2hvbGUgc3ZnIHdoaWxlIGRyYWdnaW5nXG4gICAgaWYgKHRoaXMubGFzdFN0YXJ0ICE9IDApIHtcbiAgICAgIHZhciBvZmZzZXQgPSB0aGlzLmJvZHkucmFuZ2Uuc3RhcnQgLSB0aGlzLmxhc3RTdGFydDtcbiAgICAgIHZhciByYW5nZSA9IHRoaXMuYm9keS5yYW5nZS5lbmQgLSB0aGlzLmJvZHkucmFuZ2Uuc3RhcnQ7XG4gICAgICBpZiAodGhpcy5wcm9wcy53aWR0aCAhPSAwKSB7XG4gICAgICAgIHZhciByYW5nZVBlclBpeGVsSW52ID0gdGhpcy5wcm9wcy53aWR0aCAvIHJhbmdlO1xuICAgICAgICB2YXIgeE9mZnNldCA9IG9mZnNldCAqIHJhbmdlUGVyUGl4ZWxJbnY7XG4gICAgICAgIHRoaXMuc3ZnLnN0eWxlLmxlZnQgPSAoLXRoaXMucHJvcHMud2lkdGggLSB4T2Zmc2V0KSArICdweCc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKTtcbiAgdGhpcy5sZWdlbmRSaWdodC5yZWRyYXcoKTtcbiAgcmV0dXJuIHJlc2l6ZWQ7XG59O1xuXG5cbkxpbmVHcmFwaC5wcm90b3R5cGUuX2dldFNvcnRlZEdyb3VwSWRzID0gZnVuY3Rpb24oKXtcbiAgLy8gZ2V0dGluZyBncm91cCBJZHNcbiAgdmFyIGdyb3VwbGlzdCA9IFtdO1xuICBmb3IgKHZhciBncm91cElkIGluIHRoaXMuZ3JvdXBzKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGdyb3VwSWQpKSB7XG4gICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkXTtcbiAgICAgIGlmIChncm91cC52aXNpYmxlID09IHRydWUgJiYgKHRoaXMub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtncm91cElkXSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVtncm91cElkXSA9PSB0cnVlKSkge1xuICAgICAgICBncm91cGxpc3QucHVzaCh7aWQ6Z3JvdXBJZCx6SW5kZXg6Z3JvdXAub3B0aW9ucy56SW5kZXh9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdXRpbC5pbnNlcnRTb3J0KGdyb3VwbGlzdCxmdW5jdGlvbihhLGIpe1xuICAgIHZhciBheiA9IGEuekluZGV4O1xuICAgIHZhciBieiA9IGIuekluZGV4O1xuICAgIGlmIChheiA9PT0gdW5kZWZpbmVkKSBhej0wO1xuICAgIGlmIChieiA9PT0gdW5kZWZpbmVkKSBiej0wO1xuICAgIHJldHVybiBhej09Yno/IDA6IChhejxieiA/IC0xOiAxKTtcbiAgfSk7XG4gIHZhciBncm91cElkcyA9IG5ldyBBcnJheShncm91cGxpc3QubGVuZ3RoKTtcbiAgZm9yICh2YXIgaT0wOyBpPCBncm91cGxpc3QubGVuZ3RoOyBpKyspe1xuICAgIGdyb3VwSWRzW2ldID0gZ3JvdXBsaXN0W2ldLmlkO1xuICB9XG4gIHJldHVybiBncm91cElkcztcbn07XG5cbi8qKlxuICogVXBkYXRlIGFuZCByZWRyYXcgdGhlIGdyYXBoLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICogQHByaXZhdGVcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5fdXBkYXRlR3JhcGggPSBmdW5jdGlvbiAoKSB7XG4gIC8vIHJlc2V0IHRoZSBzdmcgZWxlbWVudHNcbiAgcHJlcGFyZUVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpO1xuICBpZiAodGhpcy5wcm9wcy53aWR0aCAhPSAwICYmIHRoaXMuaXRlbXNEYXRhICE9IG51bGwpIHtcbiAgICB2YXIgZ3JvdXAsIGk7XG4gICAgdmFyIGdyb3VwUmFuZ2VzID0ge307XG4gICAgdmFyIGNoYW5nZUNhbGxlZCA9IGZhbHNlO1xuICAgIC8vIHRoaXMgaXMgdGhlIHJhbmdlIG9mIHRoZSBTVkcgY2FudmFzXG4gICAgdmFyIG1pbkRhdGUgPSB0aGlzLmJvZHkudXRpbC50b0dsb2JhbFRpbWUoLXRoaXMuYm9keS5kb21Qcm9wcy5yb290LndpZHRoKTtcbiAgICB2YXIgbWF4RGF0ZSA9IHRoaXMuYm9keS51dGlsLnRvR2xvYmFsVGltZSgyICogdGhpcy5ib2R5LmRvbVByb3BzLnJvb3Qud2lkdGgpO1xuXG4gICAgLy8gZ2V0dGluZyBncm91cCBJZHNcbiAgICB2YXIgZ3JvdXBJZHMgPSB0aGlzLl9nZXRTb3J0ZWRHcm91cElkcygpO1xuICAgIGlmIChncm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgZ3JvdXBzRGF0YSA9IHt9O1xuXG4gICAgICAvLyBmaWxsIGdyb3VwcyBkYXRhLCB0aGlzIG9ubHkgbG9hZHMgdGhlIGRhdGEgd2UgcmVxdWlyZSBiYXNlZCBvbiB0aGUgdGltZXdpbmRvd1xuICAgICAgdGhpcy5fZ2V0UmVsZXZhbnREYXRhKGdyb3VwSWRzLCBncm91cHNEYXRhLCBtaW5EYXRlLCBtYXhEYXRlKTtcblxuICAgICAgLy8gYXBwbHkgc2FtcGxpbmcsIGlmIGRpc2FibGVkLCBpdCB3aWxsIHBhc3MgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLlxuICAgICAgdGhpcy5fYXBwbHlTYW1wbGluZyhncm91cElkcywgZ3JvdXBzRGF0YSk7XG5cbiAgICAgIC8vIHdlIHRyYW5zZm9ybSB0aGUgWCBjb29yZGluYXRlcyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX2NvbnZlcnRYY29vcmRpbmF0ZXMoZ3JvdXBzRGF0YVtncm91cElkc1tpXV0pO1xuICAgICAgfVxuXG4gICAgICAvLyBub3cgYWxsIG5lZWRlZCBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZCB3ZSBzdGFydCB0aGUgcHJvY2Vzc2luZy5cbiAgICAgIHRoaXMuX2dldFlSYW5nZXMoZ3JvdXBJZHMsIGdyb3Vwc0RhdGEsIGdyb3VwUmFuZ2VzKTtcblxuICAgICAgLy8gdXBkYXRlIHRoZSBZIGF4aXMgZmlyc3QsIHdlIHVzZSB0aGlzIGRhdGEgdG8gZHJhdyBhdCB0aGUgY29ycmVjdCBZIHBvaW50c1xuICAgICAgY2hhbmdlQ2FsbGVkID0gdGhpcy5fdXBkYXRlWUF4aXMoZ3JvdXBJZHMsIGdyb3VwUmFuZ2VzKTtcblxuICAgICAgLy8gIGF0IGNoYW5nZUNhbGxlZCwgYWJvcnQgdGhpcyB1cGRhdGUgY3ljbGUgYXMgdGhlIGdyYXBoIG5lZWRzIGFub3RoZXIgdXBkYXRlIHdpdGggbmV3IFdpZHRoIGlucHV0IGZyb20gdGhlIFJlZHJhdyBjb250YWluZXIuXG4gICAgICAvLyAgQ2xlYW51cCBTVkcgZWxlbWVudHMgb24gYWJvcnQuXG4gICAgICBpZiAoY2hhbmdlQ2FsbGVkID09IHRydWUpIHtcbiAgICAgICAgY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpO1xuICAgICAgICB0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5hYm9ydGVkR3JhcGhVcGRhdGUgPSBmYWxzZTtcblxuICAgICAgLy8gV2l0aCB0aGUgeUF4aXMgc2NhbGVkIGNvcnJlY3RseSwgdXNlIHRoaXMgdG8gZ2V0IHRoZSBZIHZhbHVlcyBvZiB0aGUgcG9pbnRzLlxuICAgICAgdmFyIGJlbG93ID0gdW5kZWZpbmVkO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZHNbaV1dO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnN0YWNrID09PSB0cnVlICYmIHRoaXMub3B0aW9ucy5zdHlsZSA9PT0gJ2xpbmUnKSB7XG4gICAgICAgICAgaWYgKGdyb3VwLm9wdGlvbnMuZXhjbHVkZUZyb21TdGFja2luZyA9PSB1bmRlZmluZWQgfHwgIWdyb3VwLm9wdGlvbnMuZXhjbHVkZUZyb21TdGFja2luZykge1xuICAgICAgICAgICAgaWYgKGJlbG93ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB0aGlzLl9zdGFjayhncm91cHNEYXRhW2dyb3VwLmlkXSwgZ3JvdXBzRGF0YVtiZWxvdy5pZF0pO1xuICAgICAgICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCA9PSB0cnVlICYmIGdyb3VwLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uICE9PSBcImdyb3VwXCIpe1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbiA9PSBcInRvcFwiICYmIGJlbG93Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uICE9PSBcImdyb3VwXCIpe1xuICAgICAgICAgICAgICAgICAgYmVsb3cub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb249XCJncm91cFwiO1xuICAgICAgICAgICAgICAgICAgYmVsb3cub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD1ncm91cC5pZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZ3JvdXAub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb249XCJncm91cFwiO1xuICAgICAgICAgICAgICAgICAgZ3JvdXAub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD1iZWxvdy5pZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJlbG93ID0gZ3JvdXA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NvbnZlcnRZY29vcmRpbmF0ZXMoZ3JvdXBzRGF0YVtncm91cElkc1tpXV0sIGdyb3VwKTtcbiAgICAgIH1cblxuICAgICAgLy9QcmVjYWxjdWxhdGUgcGF0aHMgYW5kIGRyYXcgc2hhZGluZyBpZiBhcHByb3ByaWF0ZS4gVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgc2hhZGluZyBpcyBhbHdheXMgYmVoaW5kIGFueSBsaW5lcy5cbiAgICAgIHZhciBwYXRocyA9IHt9O1xuICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZHNbaV1dO1xuICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zdHlsZSA9PT0gJ2xpbmUnICYmIGdyb3VwLm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQgPT0gdHJ1ZSkge1xuICAgICAgICAgIHZhciBkYXRhc2V0ID0gZ3JvdXBzRGF0YVtncm91cElkc1tpXV07XG4gICAgICAgICAgaWYgKGRhdGFzZXQgPT0gbnVsbCB8fCBkYXRhc2V0Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwYXRocy5oYXNPd25Qcm9wZXJ0eShncm91cElkc1tpXSkpIHtcbiAgICAgICAgICAgIHBhdGhzW2dyb3VwSWRzW2ldXSA9IExpbmUuY2FsY1BhdGgoZGF0YXNldCwgZ3JvdXApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZ3JvdXAub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24gPT09IFwiZ3JvdXBcIikge1xuICAgICAgICAgICAgdmFyIHN1Ykdyb3VwSWQgPSBncm91cC5vcHRpb25zLnNoYWRlZC5ncm91cElkO1xuICAgICAgICAgICAgaWYgKGdyb3VwSWRzLmluZGV4T2Yoc3ViR3JvdXBJZCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGdyb3VwLmlkICsgXCI6IFVua25vd24gc2hhZGluZyBncm91cCB0YXJnZXQgZ2l2ZW46XCIgKyBzdWJHcm91cElkKTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhdGhzLmhhc093blByb3BlcnR5KHN1Ykdyb3VwSWQpKSB7XG4gICAgICAgICAgICAgIHBhdGhzW3N1Ykdyb3VwSWRdID0gTGluZS5jYWxjUGF0aChncm91cHNEYXRhW3N1Ykdyb3VwSWRdLCB0aGlzLmdyb3Vwc1tzdWJHcm91cElkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMaW5lLmRyYXdTaGFkaW5nKHBhdGhzW2dyb3VwSWRzW2ldXSwgZ3JvdXAsIHBhdGhzW3N1Ykdyb3VwSWRdLCB0aGlzLmZyYW1ld29yayk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTGluZS5kcmF3U2hhZGluZyhwYXRoc1tncm91cElkc1tpXV0sIGdyb3VwLCB1bmRlZmluZWQsIHRoaXMuZnJhbWV3b3JrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZHJhdyB0aGUgZ3JvdXBzLCBjYWxjdWxhdGluZyBwYXRocyBpZiBzdGlsbCBuZWNlc3NhcnkuXG4gICAgICBCYXJncmFwaC5kcmF3KGdyb3VwSWRzLCBncm91cHNEYXRhLCB0aGlzLmZyYW1ld29yayk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkc1tpXV07XG4gICAgICAgIGlmIChncm91cHNEYXRhW2dyb3VwSWRzW2ldXS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3dpdGNoIChncm91cC5vcHRpb25zLnN0eWxlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGluZVwiOlxuICAgICAgICAgICAgICBpZiAoIXBhdGhzLmhhc093blByb3BlcnR5KGdyb3VwSWRzW2ldKSkge1xuICAgICAgICAgICAgICAgIHBhdGhzW2dyb3VwSWRzW2ldXSA9IExpbmUuY2FsY1BhdGgoZ3JvdXBzRGF0YVtncm91cElkc1tpXV0sIGdyb3VwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBMaW5lLmRyYXcocGF0aHNbZ3JvdXBJZHNbaV1dLCBncm91cCwgdGhpcy5mcmFtZXdvcmspO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgICAgICAgICAgY2FzZSBcInBvaW50XCI6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgICAgICAgICBjYXNlIFwicG9pbnRzXCI6XG4gICAgICAgICAgICAgIGlmIChncm91cC5vcHRpb25zLnN0eWxlID09IFwicG9pbnRcIiB8fCBncm91cC5vcHRpb25zLnN0eWxlID09IFwicG9pbnRzXCIgfHwgZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLmVuYWJsZWQgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIFBvaW50cy5kcmF3KGdyb3Vwc0RhdGFbZ3JvdXBJZHNbaV1dLCBncm91cCwgdGhpcy5mcmFtZXdvcmspO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy9kbyBub3RoaW5nLi4uXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBjbGVhbnVwIHVudXNlZCBzdmcgZWxlbWVudHNcbiAgY2xlYW51cEVsZW1lbnRzKHRoaXMuc3ZnRWxlbWVudHMpO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5MaW5lR3JhcGgucHJvdG90eXBlLl9zdGFjayA9IGZ1bmN0aW9uIChkYXRhLCBzdWJEYXRhKSB7XG4gIHZhciBpbmRleCwgZHgsIGR5LCBzdWJQcmV2UG9pbnQsIHN1Yk5leHRQb2ludDtcbiAgaW5kZXggPSAwO1xuICAvLyBmb3IgZWFjaCBkYXRhIHBvaW50IHdlIGxvb2sgZm9yIGEgbWF0Y2hpbmcgb24gaW4gdGhlIHNldCBiZWxvd1xuICBmb3IgKHZhciBqID0gMDsgaiA8IGRhdGEubGVuZ3RoOyBqKyspIHtcbiAgICBzdWJQcmV2UG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgc3ViTmV4dFBvaW50ID0gdW5kZWZpbmVkO1xuICAgIC8vIHdlIGxvb2sgZm9yIHRpbWUgbWF0Y2hlcyBvciBhIGJlZm9yZS1hZnRlciBwb2ludFxuICAgIGZvciAodmFyIGsgPSBpbmRleDsgayA8IHN1YkRhdGEubGVuZ3RoOyBrKyspIHtcbiAgICAgIC8vIGlmIHRpbWVzIG1hdGNoIGV4YWN0bHlcbiAgICAgIGlmIChzdWJEYXRhW2tdLnggPT09IGRhdGFbal0ueCkge1xuICAgICAgICBzdWJQcmV2UG9pbnQgPSBzdWJEYXRhW2tdO1xuICAgICAgICBzdWJOZXh0UG9pbnQgPSBzdWJEYXRhW2tdO1xuICAgICAgICBpbmRleCA9IGs7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3ViRGF0YVtrXS54ID4gZGF0YVtqXS54KSB7IC8vIG92ZXJzaG9vdFxuICAgICAgICBzdWJOZXh0UG9pbnQgPSBzdWJEYXRhW2tdO1xuICAgICAgICBpZiAoayA9PSAwKSB7XG4gICAgICAgICAgc3ViUHJldlBvaW50ID0gc3ViTmV4dFBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHN1YlByZXZQb2ludCA9IHN1YkRhdGFbayAtIDFdO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gaztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGluIGNhc2UgdGhlIGxhc3QgZGF0YSBwb2ludCBoYXMgYmVlbiB1c2VkLCB3ZSBhc3N1bWUgaXQgc3RheXMgbGlrZSB0aGlzLlxuICAgIGlmIChzdWJOZXh0UG9pbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgc3ViUHJldlBvaW50ID0gc3ViRGF0YVtzdWJEYXRhLmxlbmd0aCAtIDFdO1xuICAgICAgc3ViTmV4dFBvaW50ID0gc3ViRGF0YVtzdWJEYXRhLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvblxuICAgIGR4ID0gc3ViTmV4dFBvaW50LnggLSBzdWJQcmV2UG9pbnQueDtcbiAgICBkeSA9IHN1Yk5leHRQb2ludC55IC0gc3ViUHJldlBvaW50Lnk7XG4gICAgaWYgKGR4ID09IDApIHtcbiAgICAgIGRhdGFbal0ueSA9IGRhdGFbal0ub3JnaW5hbFkgKyBzdWJOZXh0UG9pbnQueTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBkYXRhW2pdLnkgPSBkYXRhW2pdLm9yZ2luYWxZICsgKGR5IC8gZHgpICogKGRhdGFbal0ueCAtIHN1YlByZXZQb2ludC54KSArIHN1YlByZXZQb2ludC55OyAvLyBheCArIGIgd2hlcmUgYiBpcyBkYXRhW2pdLnlcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBmaXJzdCBzZWxlY3QgYW5kIHByZXByb2Nlc3MgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXNldHMuXG4gKiB0aGUgZ3JvdXBzIGhhdmUgdGhlaXIgcHJlc2VsZWN0aW9uIG9mIGRhdGEsIHdlIG5vdyBsb29wIG92ZXIgdGhpcyBkYXRhIHRvIHNlZVxuICogd2hhdCBkYXRhIHdlIG5lZWQgdG8gZHJhdy4gU29ydGVkIGRhdGEgaXMgbXVjaCBmYXN0ZXIuXG4gKiBtb3JlIG9wdGltaXphdGlvbiBpcyBwb3NzaWJsZSBieSBkb2luZyB0aGUgc2FtcGxpbmcgYmVmb3JlIGFuZCB1c2luZyB0aGUgYmluYXJ5IHNlYXJjaFxuICogdG8gZmluZCB0aGUgZW5kIGRhdGUgdG8gZGV0ZXJtaW5lIHRoZSBpbmNyZW1lbnQuXG4gKlxuICogQHBhcmFtIHthcnJheX0gIGdyb3VwSWRzXG4gKiBAcGFyYW0ge29iamVjdH0gZ3JvdXBzRGF0YVxuICogQHBhcmFtIHtkYXRlfSAgIG1pbkRhdGVcbiAqIEBwYXJhbSB7ZGF0ZX0gICBtYXhEYXRlXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl9nZXRSZWxldmFudERhdGEgPSBmdW5jdGlvbiAoZ3JvdXBJZHMsIGdyb3Vwc0RhdGEsIG1pbkRhdGUsIG1heERhdGUpIHtcbiAgdmFyIGdyb3VwLCBpLCBqLCBpdGVtO1xuICBpZiAoZ3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgIGZvciAoaSA9IDA7IGkgPCBncm91cElkcy5sZW5ndGg7IGkrKykge1xuICAgICAgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkc1tpXV07XG4gICAgICB2YXIgaXRlbXNEYXRhID0gZ3JvdXAuZ2V0SXRlbXMoKTtcbiAgICAgIC8vIG9wdGltaXphdGlvbiBmb3Igc29ydGVkIGRhdGFcbiAgICAgIGlmIChncm91cC5vcHRpb25zLnNvcnQgPT0gdHJ1ZSkge1xuICAgICAgICB2YXIgZGF0ZUNvbXBhcmF0b3IgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgIHJldHVybiBhLmdldFRpbWUoKSA9PSBiLmdldFRpbWUoKSA/IDAgOiBhIDwgYiA/IC0xIDogMVxuICAgICAgICB9O1xuICAgICAgICB2YXIgZmlyc3QgPSBNYXRoLm1heCgwLCB1dGlsLmJpbmFyeVNlYXJjaFZhbHVlKGl0ZW1zRGF0YSwgbWluRGF0ZSwgJ3gnLCAnYmVmb3JlJywgZGF0ZUNvbXBhcmF0b3IpKTtcbiAgICAgICAgdmFyIGxhc3QgPSBNYXRoLm1pbihpdGVtc0RhdGEubGVuZ3RoLCB1dGlsLmJpbmFyeVNlYXJjaFZhbHVlKGl0ZW1zRGF0YSwgbWF4RGF0ZSwgJ3gnLCAnYWZ0ZXInLCBkYXRlQ29tcGFyYXRvcikgKyAxKTtcbiAgICAgICAgaWYgKGxhc3QgPD0gMCkge1xuICAgICAgICAgIGxhc3QgPSBpdGVtc0RhdGEubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRhQ29udGFpbmVyID0gbmV3IEFycmF5KGxhc3QtZmlyc3QpO1xuICAgICAgICBmb3IgKGogPSBmaXJzdDsgaiA8IGxhc3Q7IGorKykge1xuICAgICAgICAgIGl0ZW0gPSBncm91cC5pdGVtc0RhdGFbal07XG4gICAgICAgICAgZGF0YUNvbnRhaW5lcltqLWZpcnN0XSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBzRGF0YVtncm91cElkc1tpXV0gPSBkYXRhQ29udGFpbmVyO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIElmIHVuc29ydGVkIGRhdGEsIGFsbCBkYXRhIGlzIHJlbGV2YW50LCBqdXN0IHJldHVybmluZyBlbnRpcmUgc3RydWN0dXJlXG4gICAgICAgIGdyb3Vwc0RhdGFbZ3JvdXBJZHNbaV1dID0gZ3JvdXAuaXRlbXNEYXRhO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5Ljx2aXMuR3JhcGhHcm91cC5pZD59IGdyb3VwSWRzXG4gKiBAcGFyYW0ge3Zpcy5EYXRhU2V0fSBncm91cHNEYXRhXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl9hcHBseVNhbXBsaW5nID0gZnVuY3Rpb24gKGdyb3VwSWRzLCBncm91cHNEYXRhKSB7XG4gIHZhciBncm91cDtcbiAgaWYgKGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBncm91cCA9IHRoaXMuZ3JvdXBzW2dyb3VwSWRzW2ldXTtcbiAgICAgIGlmIChncm91cC5vcHRpb25zLnNhbXBsaW5nID09IHRydWUpIHtcbiAgICAgICAgdmFyIGRhdGFDb250YWluZXIgPSBncm91cHNEYXRhW2dyb3VwSWRzW2ldXTtcbiAgICAgICAgaWYgKGRhdGFDb250YWluZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHZhciBpbmNyZW1lbnQgPSAxO1xuICAgICAgICAgIHZhciBhbW91bnRPZlBvaW50cyA9IGRhdGFDb250YWluZXIubGVuZ3RoO1xuXG4gICAgICAgICAgLy8gdGhlIGdsb2JhbCBzY3JlZW4gaXMgdXNlZCBiZWNhdXNlIGNoYW5naW5nIHRoZSB3aWR0aCBvZiB0aGUgeUF4aXMgbWF5IGFmZmVjdCB0aGUgaW5jcmVtZW50LCByZXN1bHRpbmcgaW4gYW4gZW5kbGVzcyBsb29wXG4gICAgICAgICAgLy8gb2Ygd2lkdGggY2hhbmdpbmcgb2YgdGhlIHlBeGlzLlxuICAgICAgICAgIC8vVE9ETzogVGhpcyBhc3N1bWVzIHNvcnRlZCBkYXRhLCBidXQgdGhhdCdzIG5vdCBndWFyYW50ZWVkIVxuICAgICAgICAgIHZhciB4RGlzdGFuY2UgPSB0aGlzLmJvZHkudXRpbC50b0dsb2JhbFNjcmVlbihkYXRhQ29udGFpbmVyW2RhdGFDb250YWluZXIubGVuZ3RoIC0gMV0ueCkgLSB0aGlzLmJvZHkudXRpbC50b0dsb2JhbFNjcmVlbihkYXRhQ29udGFpbmVyWzBdLngpO1xuICAgICAgICAgIHZhciBwb2ludHNQZXJQaXhlbCA9IGFtb3VudE9mUG9pbnRzIC8geERpc3RhbmNlO1xuICAgICAgICAgIGluY3JlbWVudCA9IE1hdGgubWluKE1hdGguY2VpbCgwLjIgKiBhbW91bnRPZlBvaW50cyksIE1hdGgubWF4KDEsIE1hdGgucm91bmQocG9pbnRzUGVyUGl4ZWwpKSk7XG5cbiAgICAgICAgICB2YXIgc2FtcGxlZERhdGEgPSBuZXcgQXJyYXkoYW1vdW50T2ZQb2ludHMpO1xuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW1vdW50T2ZQb2ludHM7IGogKz0gaW5jcmVtZW50KSB7XG4gICAgICAgICAgICB2YXIgaWR4ID0gTWF0aC5yb3VuZChqL2luY3JlbWVudCk7XG4gICAgICAgICAgICBzYW1wbGVkRGF0YVtpZHhdPWRhdGFDb250YWluZXJbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIGdyb3Vwc0RhdGFbZ3JvdXBJZHNbaV1dID0gc2FtcGxlZERhdGEuc3BsaWNlKDAsTWF0aC5yb3VuZChhbW91bnRPZlBvaW50cy9pbmNyZW1lbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5Ljx2aXMuR3JhcGhHcm91cC5pZD59IGdyb3VwSWRzXG4gKiBAcGFyYW0ge3Zpcy5EYXRhU2V0fSBncm91cHNEYXRhXG4gKiBAcGFyYW0ge29iamVjdH0gZ3JvdXBSYW5nZXMgIHwgdGhpcyBpcyBiZWluZyBmaWxsZWQgaGVyZVxuICogQHByaXZhdGVcbiAqL1xuTGluZUdyYXBoLnByb3RvdHlwZS5fZ2V0WVJhbmdlcyA9IGZ1bmN0aW9uIChncm91cElkcywgZ3JvdXBzRGF0YSwgZ3JvdXBSYW5nZXMpIHtcbiAgdmFyIGdyb3VwRGF0YSwgZ3JvdXAsIGk7XG4gIHZhciBjb21iaW5lZERhdGFMZWZ0ID0gW107XG4gIHZhciBjb21iaW5lZERhdGFSaWdodCA9IFtdO1xuICB2YXIgb3B0aW9ucztcbiAgaWYgKGdyb3VwSWRzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGdyb3VwRGF0YSA9IGdyb3Vwc0RhdGFbZ3JvdXBJZHNbaV1dO1xuICAgICAgb3B0aW9ucyA9IHRoaXMuZ3JvdXBzW2dyb3VwSWRzW2ldXS5vcHRpb25zO1xuICAgICAgaWYgKGdyb3VwRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGdyb3VwID0gdGhpcy5ncm91cHNbZ3JvdXBJZHNbaV1dO1xuICAgICAgICAvLyBpZiBiYXIgZ3JhcGhzIGFyZSBzdGFja2VkLCB0aGVpciByYW5nZSBuZWVkIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgYW5kIGFjY3VtdWxhdGVkIG92ZXIgYWxsIGdyb3Vwcy5cbiAgICAgICAgaWYgKG9wdGlvbnMuc3RhY2sgPT09IHRydWUgJiYgb3B0aW9ucy5zdHlsZSA9PT0gJ2JhcicpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy55QXhpc09yaWVudGF0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkRGF0YUxlZnQgPSBjb21iaW5lZERhdGFMZWZ0LmNvbmNhdChncm91cERhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbWJpbmVkRGF0YVJpZ2h0ID0gY29tYmluZWREYXRhUmlnaHQuY29uY2F0KGdyb3VwRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGdyb3VwUmFuZ2VzW2dyb3VwSWRzW2ldXSA9IGdyb3VwLmdldFlSYW5nZShncm91cERhdGEsIGdyb3VwSWRzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlmIGJhciBncmFwaHMgYXJlIHN0YWNrZWQsIHRoZWlyIHJhbmdlIG5lZWQgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSBhbmQgYWNjdW11bGF0ZWQgb3ZlciBhbGwgZ3JvdXBzLlxuICAgIEJhcmdyYXBoLmdldFN0YWNrZWRZUmFuZ2UoY29tYmluZWREYXRhTGVmdCwgZ3JvdXBSYW5nZXMsIGdyb3VwSWRzLCAnX19iYXJTdGFja0xlZnQnLCAnbGVmdCcpO1xuICAgIEJhcmdyYXBoLmdldFN0YWNrZWRZUmFuZ2UoY29tYmluZWREYXRhUmlnaHQsIGdyb3VwUmFuZ2VzLCBncm91cElkcywgJ19fYmFyU3RhY2tSaWdodCcsICdyaWdodCcpO1xuICB9XG59O1xuXG5cbi8qKlxuICogdGhpcyBzZXRzIHRoZSBZIHJhbmdlcyBmb3IgdGhlIFkgYXhpcy4gSXQgYWxzbyBkZXRlcm1pbmVzIHdoaWNoIG9mIHRoZSBheGlzIHNob3VsZCBiZSBzaG93biBvciBoaWRkZW4uXG4gKiBAcGFyYW0ge0FycmF5Ljx2aXMuR3JhcGhHcm91cC5pZD59IGdyb3VwSWRzXG4gKiBAcGFyYW0ge09iamVjdH0gZ3JvdXBSYW5nZXNcbiAqIEByZXR1cm5zIHtib29sZWFufSByZXNpemVkXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl91cGRhdGVZQXhpcyA9IGZ1bmN0aW9uIChncm91cElkcywgZ3JvdXBSYW5nZXMpIHtcbiAgdmFyIHJlc2l6ZWQgPSBmYWxzZTtcbiAgdmFyIHlBeGlzTGVmdFVzZWQgPSBmYWxzZTtcbiAgdmFyIHlBeGlzUmlnaHRVc2VkID0gZmFsc2U7XG4gIHZhciBtaW5MZWZ0ID0gMWU5LCBtaW5SaWdodCA9IDFlOSwgbWF4TGVmdCA9IC0xZTksIG1heFJpZ2h0ID0gLTFlOSwgbWluVmFsLCBtYXhWYWw7XG4gIC8vIGlmIGdyb3VwcyBhcmUgcHJlc2VudFxuICBpZiAoZ3JvdXBJZHMubGVuZ3RoID4gMCkge1xuICAgIC8vIHRoaXMgaXMgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gdGhlIGF4aXMgYnV0IHRoZXJlIGFyZSBncm91cHMsIHRoYXQgdGhlcmUgaXMgbm8gaW5maW5pdGUgZHJhdy9yZWRyYXcgbG9vcC5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZ3JvdXAgPSB0aGlzLmdyb3Vwc1tncm91cElkc1tpXV07XG4gICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAub3B0aW9ucy55QXhpc09yaWVudGF0aW9uICE9ICdyaWdodCcpIHtcbiAgICAgICAgeUF4aXNMZWZ0VXNlZCA9IHRydWU7XG4gICAgICAgIG1pbkxlZnQgPSAxZTk7XG4gICAgICAgIG1heExlZnQgPSAtMWU5O1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoZ3JvdXAgJiYgZ3JvdXAub3B0aW9ucy55QXhpc09yaWVudGF0aW9uKSB7XG4gICAgICAgIHlBeGlzUmlnaHRVc2VkID0gdHJ1ZTtcbiAgICAgICAgbWluUmlnaHQgPSAxZTk7XG4gICAgICAgIG1heFJpZ2h0ID0gLTFlOTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSBhcmUgaXRlbXM6XG4gICAgZm9yIChpID0gMDsgaSA8IGdyb3VwSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZ3JvdXBSYW5nZXMuaGFzT3duUHJvcGVydHkoZ3JvdXBJZHNbaV0pKSB7XG4gICAgICAgIGlmIChncm91cFJhbmdlc1tncm91cElkc1tpXV0uaWdub3JlICE9PSB0cnVlKSB7XG4gICAgICAgICAgbWluVmFsID0gZ3JvdXBSYW5nZXNbZ3JvdXBJZHNbaV1dLm1pbjtcbiAgICAgICAgICBtYXhWYWwgPSBncm91cFJhbmdlc1tncm91cElkc1tpXV0ubWF4O1xuXG4gICAgICAgICAgaWYgKGdyb3VwUmFuZ2VzW2dyb3VwSWRzW2ldXS55QXhpc09yaWVudGF0aW9uICE9ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHlBeGlzTGVmdFVzZWQgPSB0cnVlO1xuICAgICAgICAgICAgbWluTGVmdCA9IG1pbkxlZnQgPiBtaW5WYWwgPyBtaW5WYWwgOiBtaW5MZWZ0O1xuICAgICAgICAgICAgbWF4TGVmdCA9IG1heExlZnQgPCBtYXhWYWwgPyBtYXhWYWwgOiBtYXhMZWZ0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHlBeGlzUmlnaHRVc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIG1pblJpZ2h0ID0gbWluUmlnaHQgPiBtaW5WYWwgPyBtaW5WYWwgOiBtaW5SaWdodDtcbiAgICAgICAgICAgIG1heFJpZ2h0ID0gbWF4UmlnaHQgPCBtYXhWYWwgPyBtYXhWYWwgOiBtYXhSaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoeUF4aXNMZWZ0VXNlZCA9PSB0cnVlKSB7XG4gICAgICB0aGlzLnlBeGlzTGVmdC5zZXRSYW5nZShtaW5MZWZ0LCBtYXhMZWZ0KTtcbiAgICB9XG4gICAgaWYgKHlBeGlzUmlnaHRVc2VkID09IHRydWUpIHtcbiAgICAgIHRoaXMueUF4aXNSaWdodC5zZXRSYW5nZShtaW5SaWdodCwgbWF4UmlnaHQpO1xuICAgIH1cbiAgfVxuICByZXNpemVkID0gdGhpcy5fdG9nZ2xlQXhpc1Zpc2libGl0eSh5QXhpc0xlZnRVc2VkLCB0aGlzLnlBeGlzTGVmdCkgfHwgcmVzaXplZDtcbiAgcmVzaXplZCA9IHRoaXMuX3RvZ2dsZUF4aXNWaXNpYmxpdHkoeUF4aXNSaWdodFVzZWQsIHRoaXMueUF4aXNSaWdodCkgfHwgcmVzaXplZDtcblxuICBpZiAoeUF4aXNSaWdodFVzZWQgPT0gdHJ1ZSAmJiB5QXhpc0xlZnRVc2VkID09IHRydWUpIHtcbiAgICB0aGlzLnlBeGlzTGVmdC5kcmF3SWNvbnMgPSB0cnVlO1xuICAgIHRoaXMueUF4aXNSaWdodC5kcmF3SWNvbnMgPSB0cnVlO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMueUF4aXNMZWZ0LmRyYXdJY29ucyA9IGZhbHNlO1xuICAgIHRoaXMueUF4aXNSaWdodC5kcmF3SWNvbnMgPSBmYWxzZTtcbiAgfVxuICB0aGlzLnlBeGlzUmlnaHQubWFzdGVyID0gIXlBeGlzTGVmdFVzZWQ7XG4gIHRoaXMueUF4aXNSaWdodC5tYXN0ZXJBeGlzID0gdGhpcy55QXhpc0xlZnQ7XG5cbiAgaWYgKHRoaXMueUF4aXNSaWdodC5tYXN0ZXIgPT0gZmFsc2UpIHtcbiAgICBpZiAoeUF4aXNSaWdodFVzZWQgPT0gdHJ1ZSkge1xuICAgICAgdGhpcy55QXhpc0xlZnQubGluZU9mZnNldCA9IHRoaXMueUF4aXNSaWdodC53aWR0aDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnlBeGlzTGVmdC5saW5lT2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICByZXNpemVkID0gdGhpcy55QXhpc0xlZnQucmVkcmF3KCkgfHwgcmVzaXplZDtcbiAgICByZXNpemVkID0gdGhpcy55QXhpc1JpZ2h0LnJlZHJhdygpIHx8IHJlc2l6ZWQ7XG4gIH1cbiAgZWxzZSB7XG4gICAgcmVzaXplZCA9IHRoaXMueUF4aXNSaWdodC5yZWRyYXcoKSB8fCByZXNpemVkO1xuICB9XG5cbiAgLy8gY2xlYW4gdGhlIGFjY3VtdWxhdGVkIGxpc3RzXG4gIHZhciB0ZW1wR3JvdXBzID0gWydfX2JhclN0YWNrTGVmdCcsICdfX2JhclN0YWNrUmlnaHQnLCAnX19saW5lU3RhY2tMZWZ0JywgJ19fbGluZVN0YWNrUmlnaHQnXTtcbiAgZm9yIChpID0gMDsgaSA8IHRlbXBHcm91cHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZ3JvdXBJZHMuaW5kZXhPZih0ZW1wR3JvdXBzW2ldKSAhPSAtMSkge1xuICAgICAgZ3JvdXBJZHMuc3BsaWNlKGdyb3VwSWRzLmluZGV4T2YodGVtcEdyb3Vwc1tpXSksIDEpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNpemVkO1xufTtcblxuXG4vKipcbiAqIFRoaXMgc2hvd3Mgb3IgaGlkZXMgdGhlIFkgYXhpcyBpZiBuZWVkZWQuIElmIHRoZXJlIGlzIGEgY2hhbmdlLCB0aGUgY2hhbmdlZCBldmVudCBpcyBlbWl0dGVkIGJ5IHRoZSB1cGRhdGVZQXhpcyBmdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYXhpc1VzZWRcbiAqIEBwYXJhbSB7dmlzLkRhdGFBeGlzfSAgYXhpc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl90b2dnbGVBeGlzVmlzaWJsaXR5ID0gZnVuY3Rpb24gKGF4aXNVc2VkLCBheGlzKSB7XG4gIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gIGlmIChheGlzVXNlZCA9PSBmYWxzZSkge1xuICAgIGlmIChheGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlICYmIGF4aXMuaGlkZGVuID09IGZhbHNlKSB7XG4gICAgICBheGlzLmhpZGUoKTtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICBpZiAoIWF4aXMuZG9tLmZyYW1lLnBhcmVudE5vZGUgJiYgYXhpcy5oaWRkZW4gPT0gdHJ1ZSkge1xuICAgICAgYXhpcy5zaG93KCk7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNoYW5nZWQ7XG59O1xuXG5cbi8qKlxuICogVGhpcyB1c2VzIHRoZSBEYXRhQXhpcyBvYmplY3QgdG8gZ2VuZXJhdGUgdGhlIGNvcnJlY3QgWCBjb29yZGluYXRlIG9uIHRoZSBTVkcgd2luZG93LiBJdCB1c2VzIHRoZVxuICogdXRpbCBmdW5jdGlvbiB0b1NjcmVlbiB0byBnZXQgdGhlIHggY29vcmRpbmF0ZSBmcm9tIHRoZSB0aW1lc3RhbXAuIEl0IGFsc28gcHJlLWZpbHRlcnMgdGhlIGRhdGEgYW5kIGdldCB0aGUgbWluTWF4IHJhbmdlcyBmb3JcbiAqIHRoZSB5QXhpcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBkYXRhcG9pbnRzXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl9jb252ZXJ0WGNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGRhdGFwb2ludHMpIHtcbiAgdmFyIHRvU2NyZWVuID0gdGhpcy5ib2R5LnV0aWwudG9TY3JlZW47XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YXBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgIGRhdGFwb2ludHNbaV0uc2NyZWVuX3ggPSB0b1NjcmVlbihkYXRhcG9pbnRzW2ldLngpICsgdGhpcy5wcm9wcy53aWR0aDtcbiAgICBkYXRhcG9pbnRzW2ldLnNjcmVlbl95ID0gZGF0YXBvaW50c1tpXS55OyAvL3N0YXJ0aW5nIHBvaW50IGZvciByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICBpZiAoZGF0YXBvaW50c1tpXS5lbmQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBkYXRhcG9pbnRzW2ldLnNjcmVlbl9lbmQgPSB0b1NjcmVlbihkYXRhcG9pbnRzW2ldLmVuZCkgKyB0aGlzLnByb3BzLndpZHRoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGRhdGFwb2ludHNbaV0uc2NyZWVuX2VuZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBUaGlzIHVzZXMgdGhlIERhdGFBeGlzIG9iamVjdCB0byBnZW5lcmF0ZSB0aGUgY29ycmVjdCBYIGNvb3JkaW5hdGUgb24gdGhlIFNWRyB3aW5kb3cuIEl0IHVzZXMgdGhlXG4gKiB1dGlsIGZ1bmN0aW9uIHRvU2NyZWVuIHRvIGdldCB0aGUgeCBjb29yZGluYXRlIGZyb20gdGhlIHRpbWVzdGFtcC4gSXQgYWxzbyBwcmUtZmlsdGVycyB0aGUgZGF0YSBhbmQgZ2V0IHRoZSBtaW5NYXggcmFuZ2VzIGZvclxuICogdGhlIHlBeGlzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IGRhdGFwb2ludHNcbiAqIEBwYXJhbSB7dmlzLkdyYXBoR3JvdXB9IGdyb3VwXG4gKiBAcHJpdmF0ZVxuICovXG5MaW5lR3JhcGgucHJvdG90eXBlLl9jb252ZXJ0WWNvb3JkaW5hdGVzID0gZnVuY3Rpb24gKGRhdGFwb2ludHMsIGdyb3VwKSB7XG4gIHZhciBheGlzID0gdGhpcy55QXhpc0xlZnQ7XG4gIHZhciBzdmdIZWlnaHQgPSBOdW1iZXIodGhpcy5zdmcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoJ3B4JywgJycpKTtcbiAgaWYgKGdyb3VwLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiA9PSAncmlnaHQnKSB7XG4gICAgYXhpcyA9IHRoaXMueUF4aXNSaWdodDtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICBkYXRhcG9pbnRzW2ldLnNjcmVlbl95ID0gTWF0aC5yb3VuZChheGlzLmNvbnZlcnRWYWx1ZShkYXRhcG9pbnRzW2ldLnkpKTtcbiAgfVxuICBncm91cC5zZXRaZXJvUG9zaXRpb24oTWF0aC5taW4oc3ZnSGVpZ2h0LCBheGlzLmNvbnZlcnRWYWx1ZSgwKSkpO1xufTtcblxuLyoqXG4gKiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgcG9zc2libGUgb3B0aW9ucy4gSXQgd2lsbCBjaGVjayBpZiB0aGUgdHlwZXMgYXJlIGNvcnJlY3QsIGlmIHJlcXVpcmVkIGlmIHRoZSBvcHRpb24gaXMgb25lXG4gKiBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMuXG4gKlxuICogX19hbnlfXyBtZWFucyB0aGF0IHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBtYXR0ZXIuXG4gKiBfX3R5cGVfXyBpcyBhIHJlcXVpcmVkIGZpZWxkIGZvciBhbGwgb2JqZWN0cyBhbmQgY29udGFpbnMgdGhlIGFsbG93ZWQgdHlwZXMgb2YgYWxsIG9iamVjdHNcbiAqL1xubGV0IHN0cmluZyQxID0gJ3N0cmluZyc7XG5sZXQgYm9vbCQxID0gJ2Jvb2xlYW4nO1xubGV0IG51bWJlciQxID0gJ251bWJlcic7XG5sZXQgYXJyYXkkMSA9ICdhcnJheSc7XG5sZXQgZGF0ZSQxID0gJ2RhdGUnO1xubGV0IG9iamVjdCQxID0gJ29iamVjdCc7IC8vIHNob3VsZCBvbmx5IGJlIGluIGEgX190eXBlX18gcHJvcGVydHlcbmxldCBkb20kMSA9ICdkb20nO1xubGV0IG1vbWVudCQyID0gJ21vbWVudCc7XG5sZXQgYW55JDEgPSAnYW55JztcblxuXG5sZXQgYWxsT3B0aW9ucyQyID0ge1xuICBjb25maWd1cmU6IHtcbiAgICBlbmFibGVkOiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICAgIGZpbHRlcjogeydib29sZWFuJzogYm9vbCQxLCdmdW5jdGlvbic6ICdmdW5jdGlvbid9LFxuICAgIGNvbnRhaW5lcjoge2RvbTogZG9tJDF9LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMSwnYm9vbGVhbic6IGJvb2wkMSwnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfVxuICB9LFxuXG4gIC8vZ2xvYmFscyA6XG4gIGFsaWduQ3VycmVudFRpbWU6IHtzdHJpbmc6IHN0cmluZyQxLCAndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LCAgXG4gIHlBeGlzT3JpZW50YXRpb246IHtzdHJpbmc6WydsZWZ0JywncmlnaHQnXX0sXG4gIGRlZmF1bHRHcm91cDoge3N0cmluZzogc3RyaW5nJDF9LFxuICBzb3J0OiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICBzYW1wbGluZzogeydib29sZWFuJzogYm9vbCQxfSxcbiAgc3RhY2s6eydib29sZWFuJzogYm9vbCQxfSxcbiAgZ3JhcGhIZWlnaHQ6IHtzdHJpbmc6IHN0cmluZyQxLCBudW1iZXI6IG51bWJlciQxfSxcbiAgc2hhZGVkOiB7XG4gICAgZW5hYmxlZDogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBvcmllbnRhdGlvbjoge3N0cmluZzpbJ2JvdHRvbScsJ3RvcCcsJ3plcm8nLCdncm91cCddfSwgLy8gdG9wLCBib3R0b20sIHplcm8sIGdyb3VwXG4gICAgZ3JvdXBJZDoge29iamVjdDogb2JqZWN0JDF9LFxuICAgIF9fdHlwZV9fOiB7J2Jvb2xlYW4nOiBib29sJDEsb2JqZWN0OiBvYmplY3QkMX1cbiAgfSxcbiAgc3R5bGU6IHtzdHJpbmc6WydsaW5lJywnYmFyJywncG9pbnRzJ119LCAvLyBsaW5lLCBiYXJcbiAgYmFyQ2hhcnQ6IHtcbiAgICB3aWR0aDoge251bWJlcjogbnVtYmVyJDF9LFxuICAgIG1pbldpZHRoOiB7bnVtYmVyOiBudW1iZXIkMX0sXG4gICAgc2lkZUJ5U2lkZTogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBhbGlnbjoge3N0cmluZzpbJ2xlZnQnLCdjZW50ZXInLCdyaWdodCddfSxcbiAgICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9XG4gIH0sXG4gIGludGVycG9sYXRpb246IHtcbiAgICBlbmFibGVkOiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICAgIHBhcmFtZXRyaXphdGlvbjoge3N0cmluZzpbJ2NlbnRyaXBldGFsJywgJ2Nob3JkYWwnLCd1bmlmb3JtJ119LCAvLyB1bmlmb3JtIChhbHBoYSA9IDAuMCksIGNob3JkYWwgKGFscGhhID0gMS4wKSwgY2VudHJpcGV0YWwgKGFscGhhID0gMC41KVxuICAgIGFscGhhOiB7bnVtYmVyOiBudW1iZXIkMX0sXG4gICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxLCdib29sZWFuJzogYm9vbCQxfVxuICB9LFxuICBkcmF3UG9pbnRzOiB7XG4gICAgZW5hYmxlZDogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBvblJlbmRlcjogeyAnZnVuY3Rpb24nOiAnZnVuY3Rpb24nIH0sXG4gICAgc2l6ZToge251bWJlcjogbnVtYmVyJDF9LFxuICAgIHN0eWxlOiB7c3RyaW5nOlsnc3F1YXJlJywnY2lyY2xlJ119LCAvLyBzcXVhcmUsIGNpcmNsZVxuICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMSwnYm9vbGVhbic6IGJvb2wkMSwnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfVxuICB9LFxuICBkYXRhQXhpczoge1xuICAgIHNob3dNaW5vckxhYmVsczogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBzaG93TWFqb3JMYWJlbHM6IHsnYm9vbGVhbic6IGJvb2wkMX0sXG4gICAgc2hvd1dlZWtTY2FsZTogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBpY29uczogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICB3aWR0aDoge3N0cmluZzogc3RyaW5nJDEsIG51bWJlcjogbnVtYmVyJDF9LFxuICAgIHZpc2libGU6IHsnYm9vbGVhbic6IGJvb2wkMX0sXG4gICAgYWxpZ25aZXJvczogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBsZWZ0OntcbiAgICAgIHJhbmdlOiB7bWluOntudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sbWF4OntudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfX0sXG4gICAgICBmb3JtYXQ6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICAgIHRpdGxlOiB7dGV4dDp7c3RyaW5nOiBzdHJpbmckMSxudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sc3R5bGU6e3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9fSxcbiAgICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMX1cbiAgICB9LFxuICAgIHJpZ2h0OntcbiAgICAgIHJhbmdlOiB7bWluOntudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sbWF4OntudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfX0sXG4gICAgICBmb3JtYXQ6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgICAgIHRpdGxlOiB7dGV4dDp7c3RyaW5nOiBzdHJpbmckMSxudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sc3R5bGU6e3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9fSxcbiAgICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMX1cbiAgICB9LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMX1cbiAgfSxcbiAgbGVnZW5kOiB7XG4gICAgZW5hYmxlZDogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBpY29uczogeydib29sZWFuJzogYm9vbCQxfSxcbiAgICBsZWZ0OiB7XG4gICAgICB2aXNpYmxlOiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICAgICAgcG9zaXRpb246IHtzdHJpbmc6Wyd0b3AtcmlnaHQnLCdib3R0b20tcmlnaHQnLCd0b3AtbGVmdCcsJ2JvdHRvbS1sZWZ0J119LFxuICAgICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfVxuICAgIH0sXG4gICAgcmlnaHQ6IHtcbiAgICAgIHZpc2libGU6IHsnYm9vbGVhbic6IGJvb2wkMX0sXG4gICAgICBwb3NpdGlvbjoge3N0cmluZzpbJ3RvcC1yaWdodCcsJ2JvdHRvbS1yaWdodCcsJ3RvcC1sZWZ0JywnYm90dG9tLWxlZnQnXX0sXG4gICAgICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9XG4gICAgfSxcbiAgICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDEsJ2Jvb2xlYW4nOiBib29sJDF9XG4gIH0sXG4gIGdyb3Vwczoge1xuICAgIHZpc2liaWxpdHk6IHthbnk6IGFueSQxfSxcbiAgICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9XG4gIH0sXG5cbiAgYXV0b1Jlc2l6ZTogeydib29sZWFuJzogYm9vbCQxfSxcbiAgdGhyb3R0bGVSZWRyYXc6IHtudW1iZXI6IG51bWJlciQxfSwgLy8gVE9ETzogREVQUklDQVRFRCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FsbWVuZGUvdmlzL2lzc3Vlcy8yNTExXG4gIGNsaWNrVG9Vc2U6IHsnYm9vbGVhbic6IGJvb2wkMX0sXG4gIGVuZDoge251bWJlcjogbnVtYmVyJDEsIGRhdGU6IGRhdGUkMSwgc3RyaW5nOiBzdHJpbmckMSwgbW9tZW50OiBtb21lbnQkMn0sXG4gIGZvcm1hdDoge1xuICAgIG1pbm9yTGFiZWxzOiB7XG4gICAgICBtaWxsaXNlY29uZDoge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHNlY29uZDoge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIG1pbnV0ZToge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIGhvdXI6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICB3ZWVrZGF5OiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgZGF5OiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgd2Vlazoge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIG1vbnRoOiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgcXVhcnRlcjoge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHllYXI6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9XG4gICAgfSxcbiAgICBtYWpvckxhYmVsczoge1xuICAgICAgbWlsbGlzZWNvbmQ6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBzZWNvbmQ6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBtaW51dGU6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBob3VyOiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgd2Vla2RheToge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIGRheToge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHdlZWs6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICBtb250aDoge3N0cmluZzogc3RyaW5nJDEsJ3VuZGVmaW5lZCc6ICd1bmRlZmluZWQnfSxcbiAgICAgIHF1YXJ0ZXI6IHtzdHJpbmc6IHN0cmluZyQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgICB5ZWFyOiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfVxuICAgIH0sXG4gICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfVxuICB9LFxuICBtb21lbnQ6IHsnZnVuY3Rpb24nOiAnZnVuY3Rpb24nfSxcbiAgaGVpZ2h0OiB7c3RyaW5nOiBzdHJpbmckMSwgbnVtYmVyOiBudW1iZXIkMX0sXG4gIGhpZGRlbkRhdGVzOiB7XG4gICAgc3RhcnQ6IHtkYXRlOiBkYXRlJDEsIG51bWJlcjogbnVtYmVyJDEsIHN0cmluZzogc3RyaW5nJDEsIG1vbWVudDogbW9tZW50JDJ9LFxuICAgIGVuZDoge2RhdGU6IGRhdGUkMSwgbnVtYmVyOiBudW1iZXIkMSwgc3RyaW5nOiBzdHJpbmckMSwgbW9tZW50OiBtb21lbnQkMn0sXG4gICAgcmVwZWF0OiB7c3RyaW5nOiBzdHJpbmckMX0sXG4gICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxLCBhcnJheTogYXJyYXkkMX1cbiAgfSxcbiAgbG9jYWxlOntzdHJpbmc6IHN0cmluZyQxfSxcbiAgbG9jYWxlczp7XG4gICAgX19hbnlfXzoge2FueTogYW55JDF9LFxuICAgIF9fdHlwZV9fOiB7b2JqZWN0OiBvYmplY3QkMX1cbiAgfSxcbiAgbWF4OiB7ZGF0ZTogZGF0ZSQxLCBudW1iZXI6IG51bWJlciQxLCBzdHJpbmc6IHN0cmluZyQxLCBtb21lbnQ6IG1vbWVudCQyfSxcbiAgbWF4SGVpZ2h0OiB7bnVtYmVyOiBudW1iZXIkMSwgc3RyaW5nOiBzdHJpbmckMX0sXG4gIG1heE1pbm9yQ2hhcnM6IHtudW1iZXI6IG51bWJlciQxfSxcbiAgbWluOiB7ZGF0ZTogZGF0ZSQxLCBudW1iZXI6IG51bWJlciQxLCBzdHJpbmc6IHN0cmluZyQxLCBtb21lbnQ6IG1vbWVudCQyfSxcbiAgbWluSGVpZ2h0OiB7bnVtYmVyOiBudW1iZXIkMSwgc3RyaW5nOiBzdHJpbmckMX0sXG4gIG1vdmVhYmxlOiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICBtdWx0aXNlbGVjdDogeydib29sZWFuJzogYm9vbCQxfSxcbiAgb3JpZW50YXRpb246IHtzdHJpbmc6IHN0cmluZyQxfSxcbiAgc2hvd0N1cnJlbnRUaW1lOiB7J2Jvb2xlYW4nOiBib29sJDF9LFxuICBzaG93TWFqb3JMYWJlbHM6IHsnYm9vbGVhbic6IGJvb2wkMX0sXG4gIHNob3dNaW5vckxhYmVsczogeydib29sZWFuJzogYm9vbCQxfSxcbiAgc2hvd1dlZWtTY2FsZTogeydib29sZWFuJzogYm9vbCQxfSxcbiAgc25hcDogeydmdW5jdGlvbic6ICdmdW5jdGlvbicsICdudWxsJzogJ251bGwnfSxcbiAgc3RhcnQ6IHtkYXRlOiBkYXRlJDEsIG51bWJlcjogbnVtYmVyJDEsIHN0cmluZzogc3RyaW5nJDEsIG1vbWVudDogbW9tZW50JDJ9LFxuICB0aW1lQXhpczoge1xuICAgIHNjYWxlOiB7c3RyaW5nOiBzdHJpbmckMSwndW5kZWZpbmVkJzogJ3VuZGVmaW5lZCd9LFxuICAgIHN0ZXA6IHtudW1iZXI6IG51bWJlciQxLCd1bmRlZmluZWQnOiAndW5kZWZpbmVkJ30sXG4gICAgX190eXBlX186IHtvYmplY3Q6IG9iamVjdCQxfVxuICB9LFxuICB3aWR0aDoge3N0cmluZzogc3RyaW5nJDEsIG51bWJlcjogbnVtYmVyJDF9LFxuICB6b29tYWJsZTogeydib29sZWFuJzogYm9vbCQxfSxcbiAgem9vbUtleToge3N0cmluZzogWydjdHJsS2V5JywgJ2FsdEtleScsICdtZXRhS2V5JywgJyddfSxcbiAgem9vbU1heDoge251bWJlcjogbnVtYmVyJDF9LFxuICB6b29tTWluOiB7bnVtYmVyOiBudW1iZXIkMX0sXG4gIHpJbmRleDoge251bWJlcjogbnVtYmVyJDF9LFxuICBfX3R5cGVfXzoge29iamVjdDogb2JqZWN0JDF9XG59O1xuXG5sZXQgY29uZmlndXJlT3B0aW9ucyQxID0ge1xuICBnbG9iYWw6IHtcbiAgICBhbGlnbkN1cnJlbnRUaW1lOiBbJ25vbmUnLCAneWVhcicsICdtb250aCcsICdxdWFydGVyJywgJ3dlZWsnLCAnaXNvV2VlaycsICdkYXknLCAnZGF0ZScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnXSwgICBcbiAgICAvL3lBeGlzT3JpZW50YXRpb246IFsnbGVmdCcsJ3JpZ2h0J10sIC8vIFRET086IGVuYWJsZSBhcyBzb29uIGFzIEdyYWhwMmQgZG9lc24ndCBjcmFzaCB3aGVuIGNoYW5naW5nIHRoaXMgb24gdGhlIGZseVxuICAgIHNvcnQ6IHRydWUsXG4gICAgc2FtcGxpbmc6IHRydWUsXG4gICAgc3RhY2s6ZmFsc2UsXG4gICAgc2hhZGVkOiB7XG4gICAgICBlbmFibGVkOiBmYWxzZSxcbiAgICAgIG9yaWVudGF0aW9uOiBbJ3plcm8nLCd0b3AnLCdib3R0b20nLCdncm91cCddIC8vIHplcm8sIHRvcCwgYm90dG9tXG4gICAgfSxcbiAgICBzdHlsZTogWydsaW5lJywnYmFyJywncG9pbnRzJ10sIC8vIGxpbmUsIGJhclxuICAgIGJhckNoYXJ0OiB7XG4gICAgICB3aWR0aDogWzUwLDUsMTAwLDVdLFxuICAgICAgbWluV2lkdGg6IFs1MCw1LDEwMCw1XSxcbiAgICAgIHNpZGVCeVNpZGU6IGZhbHNlLFxuICAgICAgYWxpZ246IFsnbGVmdCcsJ2NlbnRlcicsJ3JpZ2h0J10gLy8gbGVmdCwgY2VudGVyLCByaWdodFxuICAgIH0sXG4gICAgaW50ZXJwb2xhdGlvbjoge1xuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHBhcmFtZXRyaXphdGlvbjogWydjZW50cmlwZXRhbCcsJ2Nob3JkYWwnLCd1bmlmb3JtJ10gLy8gdW5pZm9ybSAoYWxwaGEgPSAwLjApLCBjaG9yZGFsIChhbHBoYSA9IDEuMCksIGNlbnRyaXBldGFsIChhbHBoYSA9IDAuNSlcbiAgICB9LFxuICAgIGRyYXdQb2ludHM6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICBzaXplOiBbNiwyLDMwLDFdLFxuICAgICAgc3R5bGU6IFsnc3F1YXJlJywgJ2NpcmNsZSddIC8vIHNxdWFyZSwgY2lyY2xlXG4gICAgfSxcbiAgICBkYXRhQXhpczoge1xuICAgICAgc2hvd01pbm9yTGFiZWxzOiB0cnVlLFxuICAgICAgc2hvd01ham9yTGFiZWxzOiB0cnVlLFxuICAgICAgc2hvd1dlZWtTY2FsZTogZmFsc2UsXG4gICAgICBpY29uczogZmFsc2UsXG4gICAgICB3aWR0aDogWzQwLDAsMjAwLDFdLFxuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIGFsaWduWmVyb3M6IHRydWUsXG4gICAgICBsZWZ0OntcbiAgICAgICAgLy9yYW5nZToge21pbjondW5kZWZpbmVkJzogJ3VuZGVmaW5lZCdpbmVkLG1heDondW5kZWZpbmVkJzogJ3VuZGVmaW5lZCdpbmVkfSxcbiAgICAgICAgLy9mb3JtYXQ6IGZ1bmN0aW9uICh2YWx1ZSkge3JldHVybiB2YWx1ZTt9LFxuICAgICAgICB0aXRsZToge3RleHQ6Jycsc3R5bGU6Jyd9XG4gICAgICB9LFxuICAgICAgcmlnaHQ6e1xuICAgICAgICAvL3JhbmdlOiB7bWluOid1bmRlZmluZWQnOiAndW5kZWZpbmVkJ2luZWQsbWF4Oid1bmRlZmluZWQnOiAndW5kZWZpbmVkJ2luZWR9LFxuICAgICAgICAvL2Zvcm1hdDogZnVuY3Rpb24gKHZhbHVlKSB7cmV0dXJuIHZhbHVlO30sXG4gICAgICAgIHRpdGxlOiB7dGV4dDonJyxzdHlsZTonJ31cbiAgICAgIH1cbiAgICB9LFxuICAgIGxlZ2VuZDoge1xuICAgICAgZW5hYmxlZDogZmFsc2UsXG4gICAgICBpY29uczogdHJ1ZSxcbiAgICAgIGxlZnQ6IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgcG9zaXRpb246IFsndG9wLXJpZ2h0JywnYm90dG9tLXJpZ2h0JywndG9wLWxlZnQnLCdib3R0b20tbGVmdCddIC8vIHRvcC9ib3R0b20gLSBsZWZ0LHJpZ2h0XG4gICAgICB9LFxuICAgICAgcmlnaHQ6IHtcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgcG9zaXRpb246IFsndG9wLXJpZ2h0JywnYm90dG9tLXJpZ2h0JywndG9wLWxlZnQnLCdib3R0b20tbGVmdCddIC8vIHRvcC9ib3R0b20gLSBsZWZ0LHJpZ2h0XG4gICAgICB9XG4gICAgfSxcblxuICAgIGF1dG9SZXNpemU6IHRydWUsXG4gICAgY2xpY2tUb1VzZTogZmFsc2UsXG4gICAgZW5kOiAnJyxcbiAgICBmb3JtYXQ6IHtcbiAgICAgIG1pbm9yTGFiZWxzOiB7XG4gICAgICAgIG1pbGxpc2Vjb25kOidTU1MnLFxuICAgICAgICBzZWNvbmQ6ICAgICAncycsXG4gICAgICAgIG1pbnV0ZTogICAgICdISDptbScsXG4gICAgICAgIGhvdXI6ICAgICAgICdISDptbScsXG4gICAgICAgIHdlZWtkYXk6ICAgICdkZGQgRCcsXG4gICAgICAgIGRheTogICAgICAgICdEJyxcbiAgICAgICAgd2VlazogICAgICAgJ3cnLFxuICAgICAgICBtb250aDogICAgICAnTU1NJyxcbiAgICAgICAgcXVhcnRlcjogICAgJ1tRXVEnLFxuICAgICAgICB5ZWFyOiAgICAgICAnWVlZWSdcbiAgICAgIH0sXG4gICAgICBtYWpvckxhYmVsczoge1xuICAgICAgICBtaWxsaXNlY29uZDonSEg6bW06c3MnLFxuICAgICAgICBzZWNvbmQ6ICAgICAnRCBNTU1NIEhIOm1tJyxcbiAgICAgICAgbWludXRlOiAgICAgJ2RkZCBEIE1NTU0nLFxuICAgICAgICBob3VyOiAgICAgICAnZGRkIEQgTU1NTScsXG4gICAgICAgIHdlZWtkYXk6ICAgICdNTU1NIFlZWVknLFxuICAgICAgICBkYXk6ICAgICAgICAnTU1NTSBZWVlZJyxcbiAgICAgICAgd2VlazogICAgICAgJ01NTU0gWVlZWScsXG4gICAgICAgIG1vbnRoOiAgICAgICdZWVlZJyxcbiAgICAgICAgcXVhcnRlcjogICAgJ1lZWVknLFxuICAgICAgICB5ZWFyOiAgICAgICAnJ1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBoZWlnaHQ6ICcnLFxuICAgIGxvY2FsZTogJycsXG4gICAgbWF4OiAnJyxcbiAgICBtYXhIZWlnaHQ6ICcnLFxuICAgIG1heE1pbm9yQ2hhcnM6IFs3LCAwLCAyMCwgMV0sXG4gICAgbWluOiAnJyxcbiAgICBtaW5IZWlnaHQ6ICcnLFxuICAgIG1vdmVhYmxlOnRydWUsXG4gICAgb3JpZW50YXRpb246IFsnYm90aCcsICdib3R0b20nLCAndG9wJ10sXG4gICAgc2hvd0N1cnJlbnRUaW1lOiBmYWxzZSxcbiAgICBzaG93TWFqb3JMYWJlbHM6IHRydWUsXG4gICAgc2hvd01pbm9yTGFiZWxzOiB0cnVlLFxuICAgIHNob3dXZWVrU2NhbGU6IGZhbHNlLFxuICAgIHN0YXJ0OiAnJyxcbiAgICB3aWR0aDogJzEwMCUnLFxuICAgIHpvb21hYmxlOiB0cnVlLFxuICAgIHpvb21LZXk6IFsnY3RybEtleScsICdhbHRLZXknLCAnbWV0YUtleScsICcnXSxcbiAgICB6b29tTWF4OiBbMzE1MzYwMDAwMDAwMDAwLCAxMCwgMzE1MzYwMDAwMDAwMDAwLCAxXSxcbiAgICB6b29tTWluOiBbMTAsIDEwLCAzMTUzNjAwMDAwMDAwMDAsIDFdLFxuICAgIHpJbmRleDogMFxuICB9XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIHRpbWVsaW5lIHZpc3VhbGl6YXRpb25cbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGNvbnRhaW5lclxuICogQHBhcmFtIHt2aXMuRGF0YVNldCB8IEFycmF5fSBbaXRlbXNdXG4gKiBAcGFyYW0ge3Zpcy5EYXRhU2V0IHwgQXJyYXkgfCB2aXMuRGF0YVZpZXcgfCBPYmplY3R9IFtncm91cHNdXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdICBTZWUgR3JhcGgyZC5zZXRPcHRpb25zIGZvciB0aGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3IgR3JhcGgyZFxuICogQGV4dGVuZHMgQ29yZVxuICovXG5mdW5jdGlvbiBHcmFwaDJkIChjb250YWluZXIsIGl0ZW1zLCBncm91cHMsIG9wdGlvbnMpIHtcbiAgLy8gaWYgdGhlIHRoaXJkIGVsZW1lbnQgaXMgb3B0aW9ucywgdGhlIGZvcnRoIGlzIGdyb3VwcyAob3B0aW9uYWxseSk7XG4gIGlmICghKEFycmF5LmlzQXJyYXkoZ3JvdXBzKSB8fCBpc0RhdGFWaWV3TGlrZShcImlkXCIsIGdyb3VwcykpICYmIGdyb3VwcyBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgIHZhciBmb3J0aEFyZ3VtZW50ID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gZ3JvdXBzO1xuICAgIGdyb3VwcyA9IGZvcnRoQXJndW1lbnQ7XG4gIH1cblxuICAvLyBUT0RPOiBSRU1PVkUgVEhJUyBpbiB0aGUgbmV4dCBNQUpPUiByZWxlYXNlXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXMvaXNzdWVzLzI1MTFcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy50aHJvdHRsZVJlZHJhdykge1xuICAgIGNvbnNvbGUud2FybihcIkdyYXBoMmQgb3B0aW9uIFxcXCJ0aHJvdHRsZVJlZHJhd1xcXCIgaXMgREVQUklDQVRFRCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2UuXCIpO1xuICB9XG5cbiAgdmFyIG1lID0gdGhpcztcbiAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBzdGFydDogbnVsbCxcbiAgICBlbmQ6ICAgbnVsbCxcblxuICAgIGF1dG9SZXNpemU6IHRydWUsXG5cbiAgICBvcmllbnRhdGlvbjoge1xuICAgICAgYXhpczogJ2JvdHRvbScsICAgLy8gYXhpcyBvcmllbnRhdGlvbjogJ2JvdHRvbScsICd0b3AnLCBvciAnYm90aCdcbiAgICAgIGl0ZW06ICdib3R0b20nICAgIC8vIG5vdCByZWxldmFudCBmb3IgR3JhcGgyZFxuICAgIH0sXG5cbiAgICBtb21lbnQ6IG1vbWVudCxcblxuICAgIHdpZHRoOiBudWxsLFxuICAgIGhlaWdodDogbnVsbCxcbiAgICBtYXhIZWlnaHQ6IG51bGwsXG4gICAgbWluSGVpZ2h0OiBudWxsXG4gIH07XG4gIHRoaXMub3B0aW9ucyA9IHV0aWwuZGVlcEV4dGVuZCh7fSwgdGhpcy5kZWZhdWx0T3B0aW9ucyk7XG5cbiAgLy8gQ3JlYXRlIHRoZSBET00sIHByb3BzLCBhbmQgZW1pdHRlclxuICB0aGlzLl9jcmVhdGUoY29udGFpbmVyKTtcblxuICAvLyBhbGwgY29tcG9uZW50cyBsaXN0ZWQgaGVyZSB3aWxsIGJlIHJlcGFpbnRlZCBhdXRvbWF0aWNhbGx5XG4gIHRoaXMuY29tcG9uZW50cyA9IFtdO1xuXG4gIHRoaXMuYm9keSA9IHtcbiAgICBkb206IHRoaXMuZG9tLFxuICAgIGRvbVByb3BzOiB0aGlzLnByb3BzLFxuICAgIGVtaXR0ZXI6IHtcbiAgICAgIG9uOiB0aGlzLm9uLmJpbmQodGhpcyksXG4gICAgICBvZmY6IHRoaXMub2ZmLmJpbmQodGhpcyksXG4gICAgICBlbWl0OiB0aGlzLmVtaXQuYmluZCh0aGlzKVxuICAgIH0sXG4gICAgaGlkZGVuRGF0ZXM6IFtdLFxuICAgIHV0aWw6IHtcbiAgICAgIGdldFNjYWxlKCkge1xuICAgICAgICByZXR1cm4gbWUudGltZUF4aXMuc3RlcC5zY2FsZTtcbiAgICAgIH0sXG4gICAgICBnZXRTdGVwKCkge1xuICAgICAgICByZXR1cm4gbWUudGltZUF4aXMuc3RlcC5zdGVwO1xuICAgICAgfSxcblxuICAgICAgdG9TY3JlZW46IG1lLl90b1NjcmVlbi5iaW5kKG1lKSxcbiAgICAgIHRvR2xvYmFsU2NyZWVuOiBtZS5fdG9HbG9iYWxTY3JlZW4uYmluZChtZSksIC8vIHRoaXMgcmVmZXJzIHRvIHRoZSByb290LndpZHRoXG4gICAgICB0b1RpbWU6IG1lLl90b1RpbWUuYmluZChtZSksXG4gICAgICB0b0dsb2JhbFRpbWUgOiBtZS5fdG9HbG9iYWxUaW1lLmJpbmQobWUpXG4gICAgfVxuICB9O1xuXG4gIC8vIHJhbmdlXG4gIHRoaXMucmFuZ2UgPSBuZXcgUmFuZ2UodGhpcy5ib2R5KTtcbiAgdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSk7XG4gIHRoaXMuYm9keS5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgLy8gdGltZSBheGlzXG4gIHRoaXMudGltZUF4aXMgPSBuZXcgVGltZUF4aXModGhpcy5ib2R5KTtcbiAgdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy50aW1lQXhpcyk7XG4gIC8vdGhpcy5ib2R5LnV0aWwuc25hcCA9IHRoaXMudGltZUF4aXMuc25hcC5iaW5kKHRoaXMudGltZUF4aXMpO1xuXG4gIC8vIGN1cnJlbnQgdGltZSBiYXJcbiAgdGhpcy5jdXJyZW50VGltZSA9IG5ldyBDdXJyZW50VGltZSh0aGlzLmJvZHkpO1xuICB0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmN1cnJlbnRUaW1lKTtcblxuICAvLyBpdGVtIHNldFxuICB0aGlzLmxpbmVncmFwaCA9IG5ldyBMaW5lR3JhcGgodGhpcy5ib2R5KTtcblxuICB0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmxpbmVncmFwaCk7XG5cbiAgdGhpcy5pdGVtc0RhdGEgPSBudWxsOyAgICAgIC8vIERhdGFTZXRcbiAgdGhpcy5ncm91cHNEYXRhID0gbnVsbDsgICAgIC8vIERhdGFTZXRcblxuXG4gIHRoaXMub24oJ3RhcCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIG1lLmVtaXQoJ2NsaWNrJywgbWUuZ2V0RXZlbnRQcm9wZXJ0aWVzKGV2ZW50KSk7XG4gIH0pO1xuICB0aGlzLm9uKCdkb3VibGV0YXAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBtZS5lbWl0KCdkb3VibGVDbGljaycsIG1lLmdldEV2ZW50UHJvcGVydGllcyhldmVudCkpO1xuICB9KTtcbiAgdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgbWUuZW1pdCgnY29udGV4dG1lbnUnLCBtZS5nZXRFdmVudFByb3BlcnRpZXMoZXZlbnQpKTtcbiAgfTtcbiAgXG4gIC8vU2luZ2xlIHRpbWUgYXV0b3NjYWxlL2ZpdFxuICB0aGlzLmluaXRpYWxGaXREb25lID0gZmFsc2U7XG4gIHRoaXMub24oJ2NoYW5nZWQnLCBmdW5jdGlvbiAoKXtcbiAgICBpZiAobWUuaXRlbXNEYXRhID09IG51bGwpIHJldHVybjtcbiAgICBpZiAoIW1lLmluaXRpYWxGaXREb25lICYmICFtZS5vcHRpb25zLnJvbGxpbmdNb2RlKSB7XG4gICAgICBtZS5pbml0aWFsRml0RG9uZSA9IHRydWU7XG4gICAgICBpZiAobWUub3B0aW9ucy5zdGFydCAhPSB1bmRlZmluZWQgfHwgbWUub3B0aW9ucy5lbmQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChtZS5vcHRpb25zLnN0YXJ0ID09IHVuZGVmaW5lZCB8fCBtZS5vcHRpb25zLmVuZCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgcmFuZ2UgPSBtZS5nZXRJdGVtUmFuZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydCA9IG1lLm9wdGlvbnMuc3RhcnQgIT0gdW5kZWZpbmVkID8gbWUub3B0aW9ucy5zdGFydCA6IHJhbmdlLm1pbjtcbiAgICAgICAgdmFyIGVuZCAgID0gbWUub3B0aW9ucy5lbmQgICAhPSB1bmRlZmluZWQgPyBtZS5vcHRpb25zLmVuZCAgIDogcmFuZ2UubWF4O1xuICAgICAgICBtZS5zZXRXaW5kb3coc3RhcnQsIGVuZCwge2FuaW1hdGlvbjogZmFsc2V9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lLmZpdCh7YW5pbWF0aW9uOiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghbWUuaW5pdGlhbERyYXdEb25lICYmIChtZS5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lIHx8ICghbWUub3B0aW9ucy5zdGFydCAmJiAhbWUub3B0aW9ucy5lbmQpIFxuICAgICAgfHwgbWUub3B0aW9ucy5yb2xsaW5nTW9kZSkpIHtcbiAgICAgIG1lLmluaXRpYWxEcmF3RG9uZSA9IHRydWU7XG4gICAgICBtZS5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgbWUuZG9tLmxvYWRpbmdTY3JlZW4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZS5kb20ubG9hZGluZ1NjcmVlbik7XG4gICAgICBpZiAobWUub3B0aW9ucy5vbkluaXRpYWxEcmF3Q29tcGxldGUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG1lLm9wdGlvbnMub25Jbml0aWFsRHJhd0NvbXBsZXRlKCk7XG4gICAgICAgIH0sIDApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIFxuICAvLyBhcHBseSBvcHRpb25zXG4gIGlmIChvcHRpb25zKSB7XG4gICAgdGhpcy5zZXRPcHRpb25zKG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gSU1QT1JUQU5UOiBUSElTIEhBUFBFTlMgQkVGT1JFIFNFVCBJVEVNUyFcbiAgaWYgKGdyb3Vwcykge1xuICAgIHRoaXMuc2V0R3JvdXBzKGdyb3Vwcyk7XG4gIH1cblxuICAvLyBjcmVhdGUgaXRlbXNldFxuICBpZiAoaXRlbXMpIHtcbiAgICB0aGlzLnNldEl0ZW1zKGl0ZW1zKTtcbiAgfVxuXG4gIC8vIGRyYXcgZm9yIHRoZSBmaXJzdCB0aW1lXG4gIHRoaXMuX3JlZHJhdygpO1xufVxuXG4vLyBFeHRlbmQgdGhlIGZ1bmN0aW9uYWxpdHkgZnJvbSBDb3JlXG5HcmFwaDJkLnByb3RvdHlwZSA9IG5ldyBDb3JlKCk7XG5cbkdyYXBoMmQucHJvdG90eXBlLnNldE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAvLyB2YWxpZGF0ZSBvcHRpb25zXG4gIGxldCBlcnJvckZvdW5kID0gVmFsaWRhdG9yLnZhbGlkYXRlKG9wdGlvbnMsIGFsbE9wdGlvbnMkMik7XG4gIGlmIChlcnJvckZvdW5kID09PSB0cnVlKSB7XG4gICAgY29uc29sZS5sb2coJyVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuJywgcHJpbnRTdHlsZSk7XG4gIH1cblxuICBDb3JlLnByb3RvdHlwZS5zZXRPcHRpb25zLmNhbGwodGhpcywgb3B0aW9ucyk7XG59O1xuXG4vKipcbiAqIFNldCBpdGVtc1xuICogQHBhcmFtIHt2aXMuRGF0YVNldCB8IEFycmF5IHwgbnVsbH0gaXRlbXNcbiAqL1xuR3JhcGgyZC5wcm90b3R5cGUuc2V0SXRlbXMgPSBmdW5jdGlvbihpdGVtcykge1xuICB2YXIgaW5pdGlhbExvYWQgPSAodGhpcy5pdGVtc0RhdGEgPT0gbnVsbCk7XG5cbiAgLy8gY29udmVydCB0byB0eXBlIERhdGFTZXQgd2hlbiBuZWVkZWRcbiAgdmFyIG5ld0RhdGFTZXQ7XG4gIGlmICghaXRlbXMpIHtcbiAgICBuZXdEYXRhU2V0ID0gbnVsbDtcbiAgfVxuICBlbHNlIGlmIChpc0RhdGFWaWV3TGlrZShcImlkXCIsIG5ld0RhdGFTZXQpKSB7XG4gICAgbmV3RGF0YVNldCA9IHR5cGVDb2VyY2VEYXRhU2V0KGl0ZW1zKTtcbiAgfVxuICBlbHNlIHtcbiAgICAvLyB0dXJuIGFuIGFycmF5IGludG8gYSBkYXRhc2V0XG4gICAgbmV3RGF0YVNldCA9IHR5cGVDb2VyY2VEYXRhU2V0KG5ldyBEYXRhU2V0KGl0ZW1zKSk7XG4gIH1cblxuICAvLyBzZXQgaXRlbXNcbiAgaWYgKHRoaXMuaXRlbXNEYXRhKSB7XG4gICAgLy8gc3RvcCBtYWludGFpbmluZyBhIGNvZXJjZWQgdmVyc2lvbiBvZiB0aGUgb2xkIGRhdGEgc2V0XG4gICAgdGhpcy5pdGVtc0RhdGEuZGlzcG9zZSgpO1xuICB9XG4gIHRoaXMuaXRlbXNEYXRhID0gbmV3RGF0YVNldDtcbiAgdGhpcy5saW5lZ3JhcGggJiYgdGhpcy5saW5lZ3JhcGguc2V0SXRlbXMobmV3RGF0YVNldCAhPSBudWxsID8gbmV3RGF0YVNldC5yYXdEUyA6IG51bGwpO1xuXG4gIGlmIChpbml0aWFsTG9hZCkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuc3RhcnQgIT0gdW5kZWZpbmVkIHx8IHRoaXMub3B0aW9ucy5lbmQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YXIgc3RhcnQgPSB0aGlzLm9wdGlvbnMuc3RhcnQgIT0gdW5kZWZpbmVkID8gdGhpcy5vcHRpb25zLnN0YXJ0IDogbnVsbDtcbiAgICAgIHZhciBlbmQgICA9IHRoaXMub3B0aW9ucy5lbmQgIT0gdW5kZWZpbmVkICAgPyB0aGlzLm9wdGlvbnMuZW5kIDogbnVsbDtcbiAgICAgIHRoaXMuc2V0V2luZG93KHN0YXJ0LCBlbmQsIHthbmltYXRpb246IGZhbHNlfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maXQoe2FuaW1hdGlvbjogZmFsc2V9KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGdyb3Vwc1xuICogQHBhcmFtIHt2aXMuRGF0YVNldCB8IEFycmF5fSBncm91cHNcbiAqL1xuR3JhcGgyZC5wcm90b3R5cGUuc2V0R3JvdXBzID0gZnVuY3Rpb24oZ3JvdXBzKSB7XG4gIC8vIGNvbnZlcnQgdG8gdHlwZSBEYXRhU2V0IHdoZW4gbmVlZGVkXG4gIHZhciBuZXdEYXRhU2V0O1xuICBpZiAoIWdyb3Vwcykge1xuICAgIG5ld0RhdGFTZXQgPSBudWxsO1xuICB9XG4gIGVsc2UgaWYgKGlzRGF0YVZpZXdMaWtlKFwiaWRcIiwgZ3JvdXBzKSkge1xuICAgIG5ld0RhdGFTZXQgPSBncm91cHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gdHVybiBhbiBhcnJheSBpbnRvIGEgZGF0YXNldFxuICAgIG5ld0RhdGFTZXQgPSBuZXcgRGF0YVNldChncm91cHMpO1xuICB9XG5cbiAgdGhpcy5ncm91cHNEYXRhID0gbmV3RGF0YVNldDtcbiAgdGhpcy5saW5lZ3JhcGguc2V0R3JvdXBzKG5ld0RhdGFTZXQpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIG9iamVjdCBjb250YWluaW5nIGFuIFNWRyBlbGVtZW50IHdpdGggdGhlIGljb24gb2YgdGhlIGdyb3VwIChzaXplIGRldGVybWluZWQgYnkgaWNvbldpZHRoIGFuZCBpY29uSGVpZ2h0KSwgdGhlIGxhYmVsIG9mIHRoZSBncm91cCAoY29udGVudCkgYW5kIHRoZSB5QXhpc09yaWVudGF0aW9uIG9mIHRoZSBncm91cCAobGVmdCBvciByaWdodCkuXG4gKiBAcGFyYW0ge3Zpcy5HcmFwaEdyb3VwLmlkfSBncm91cElkXG4gKiBAcGFyYW0ge251bWJlcn0gd2lkdGhcbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHRcbiAqIEByZXR1cm5zIHt7aWNvbjogU1ZHRWxlbWVudCwgbGFiZWw6IHN0cmluZywgb3JpZW50YXRpb246IHN0cmluZ318c3RyaW5nfVxuICovXG5HcmFwaDJkLnByb3RvdHlwZS5nZXRMZWdlbmQgPSBmdW5jdGlvbihncm91cElkLCB3aWR0aCwgaGVpZ2h0KSB7XG4gIGlmICh3aWR0aCAgPT09IHVuZGVmaW5lZCkge3dpZHRoICA9IDE1O31cbiAgaWYgKGhlaWdodCA9PT0gdW5kZWZpbmVkKSB7aGVpZ2h0ID0gMTU7fVxuICBpZiAodGhpcy5saW5lZ3JhcGguZ3JvdXBzW2dyb3VwSWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGhpcy5saW5lZ3JhcGguZ3JvdXBzW2dyb3VwSWRdLmdldExlZ2VuZCh3aWR0aCxoZWlnaHQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHJldHVybiBcImNhbm5vdCBmaW5kIGdyb3VwOidcIiArICBncm91cElkICsgXCInXCI7XG4gIH1cbn07XG5cbi8qKlxuICogVGhpcyBjaGVja3MgaWYgdGhlIHZpc2libGUgb3B0aW9uIG9mIHRoZSBzdXBwbGllZCBncm91cCAoYnkgSUQpIGlzIHRydWUgb3IgZmFsc2UuXG4gKiBAcGFyYW0ge3Zpcy5HcmFwaEdyb3VwLmlkfSBncm91cElkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuR3JhcGgyZC5wcm90b3R5cGUuaXNHcm91cFZpc2libGUgPSBmdW5jdGlvbihncm91cElkKSB7XG4gIGlmICh0aGlzLmxpbmVncmFwaC5ncm91cHNbZ3JvdXBJZF0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAodGhpcy5saW5lZ3JhcGguZ3JvdXBzW2dyb3VwSWRdLnZpc2libGUgJiYgKHRoaXMubGluZWdyYXBoLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbZ3JvdXBJZF0gPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxpbmVncmFwaC5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W2dyb3VwSWRdID09IHRydWUpKTtcbiAgfVxuICBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBHZXQgdGhlIGRhdGEgcmFuZ2Ugb2YgdGhlIGl0ZW0gc2V0LlxuICogQHJldHVybnMge3ttaW46IERhdGUsIG1heDogRGF0ZX19IHJhbmdlICBBIHJhbmdlIHdpdGggYSBzdGFydCBhbmQgZW5kIERhdGUuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gbm8gbWluaW11bSBpcyBmb3VuZCwgbWluPT1udWxsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gbm8gbWF4aW11bSBpcyBmb3VuZCwgbWF4PT1udWxsXG4gKi9cbkdyYXBoMmQucHJvdG90eXBlLmdldERhdGFSYW5nZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbWluID0gbnVsbDtcbiAgdmFyIG1heCA9IG51bGw7XG5cbiAgLy8gY2FsY3VsYXRlIG1pbiBmcm9tIHN0YXJ0IGZpbGVkXG4gIGZvciAodmFyIGdyb3VwSWQgaW4gdGhpcy5saW5lZ3JhcGguZ3JvdXBzKSB7XG4gICAgaWYgKHRoaXMubGluZWdyYXBoLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShncm91cElkKSkge1xuICAgICAgaWYgKHRoaXMubGluZWdyYXBoLmdyb3Vwc1tncm91cElkXS52aXNpYmxlID09IHRydWUpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVncmFwaC5ncm91cHNbZ3JvdXBJZF0uaXRlbXNEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLmxpbmVncmFwaC5ncm91cHNbZ3JvdXBJZF0uaXRlbXNEYXRhW2ldO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IHV0aWwuY29udmVydChpdGVtLngsICdEYXRlJykudmFsdWVPZigpO1xuICAgICAgICAgIG1pbiA9IG1pbiA9PSBudWxsID8gdmFsdWUgOiBtaW4gPiB2YWx1ZSA/IHZhbHVlIDogbWluO1xuICAgICAgICAgIG1heCA9IG1heCA9PSBudWxsID8gdmFsdWUgOiBtYXggPCB2YWx1ZSA/IHZhbHVlIDogbWF4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtaW46IChtaW4gIT0gbnVsbCkgPyBuZXcgRGF0ZShtaW4pIDogbnVsbCxcbiAgICBtYXg6IChtYXggIT0gbnVsbCkgPyBuZXcgRGF0ZShtYXgpIDogbnVsbFxuICB9O1xufTtcblxuXG4vKipcbiAqIEdlbmVyYXRlIFRpbWVsaW5lIHJlbGF0ZWQgaW5mb3JtYXRpb24gZnJvbSBhbiBldmVudFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IHdpdGggcmVsYXRlZCBpbmZvcm1hdGlvbiwgbGlrZSBvbiB3aGljaCBhcmVhXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBldmVudCBoYXBwZW5lZCwgd2hldGhlciBjbGlja2VkIG9uIGFuIGl0ZW0sIGV0Yy5cbiAqL1xuR3JhcGgyZC5wcm90b3R5cGUuZ2V0RXZlbnRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gIHZhciBjbGllbnRYID0gZXZlbnQuY2VudGVyID8gZXZlbnQuY2VudGVyLnggOiBldmVudC5jbGllbnRYO1xuICB2YXIgY2xpZW50WSA9IGV2ZW50LmNlbnRlciA/IGV2ZW50LmNlbnRlci55IDogZXZlbnQuY2xpZW50WTtcbiAgdmFyIHggPSBjbGllbnRYIC0gdXRpbC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKTtcbiAgdmFyIHkgPSBjbGllbnRZIC0gdXRpbC5nZXRBYnNvbHV0ZVRvcCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpO1xuICB2YXIgdGltZSA9IHRoaXMuX3RvVGltZSh4KTtcblxuICB2YXIgY3VzdG9tVGltZSA9IEN1c3RvbVRpbWUuY3VzdG9tVGltZUZyb21UYXJnZXQoZXZlbnQpO1xuXG4gIHZhciBlbGVtZW50ID0gdXRpbC5nZXRUYXJnZXQoZXZlbnQpO1xuICB2YXIgd2hhdCA9IG51bGw7XG4gIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLnRpbWVBeGlzLmRvbS5mb3JlZ3JvdW5kKSkgICAgICAgICAgICAgIHt3aGF0ID0gJ2F4aXMnO31cbiAgZWxzZSBpZiAodGhpcy50aW1lQXhpczIgJiYgdXRpbC5oYXNQYXJlbnQoZWxlbWVudCwgdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpKSB7d2hhdCA9ICdheGlzJzt9XG4gIGVsc2UgaWYgKHV0aWwuaGFzUGFyZW50KGVsZW1lbnQsIHRoaXMubGluZWdyYXBoLnlBeGlzTGVmdC5kb20uZnJhbWUpKSAgIHt3aGF0ID0gJ2RhdGEtYXhpcyc7fVxuICBlbHNlIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLmxpbmVncmFwaC55QXhpc1JpZ2h0LmRvbS5mcmFtZSkpICB7d2hhdCA9ICdkYXRhLWF4aXMnO31cbiAgZWxzZSBpZiAodXRpbC5oYXNQYXJlbnQoZWxlbWVudCwgdGhpcy5saW5lZ3JhcGgubGVnZW5kTGVmdC5kb20uZnJhbWUpKSAge3doYXQgPSAnbGVnZW5kJzt9XG4gIGVsc2UgaWYgKHV0aWwuaGFzUGFyZW50KGVsZW1lbnQsIHRoaXMubGluZWdyYXBoLmxlZ2VuZFJpZ2h0LmRvbS5mcmFtZSkpIHt3aGF0ID0gJ2xlZ2VuZCc7fVxuICBlbHNlIGlmIChjdXN0b21UaW1lICE9IG51bGwpICAgICAgICAgICAgICAgIHt3aGF0ID0gJ2N1c3RvbS10aW1lJzt9XG4gIGVsc2UgaWYgKHV0aWwuaGFzUGFyZW50KGVsZW1lbnQsIHRoaXMuY3VycmVudFRpbWUuYmFyKSkgICAgICAgICAgICAgICAgIHt3aGF0ID0gJ2N1cnJlbnQtdGltZSc7fVxuICBlbHNlIGlmICh1dGlsLmhhc1BhcmVudChlbGVtZW50LCB0aGlzLmRvbS5jZW50ZXIpKSAgICAgICAgICAgICAgICAgICAgICB7d2hhdCA9ICdiYWNrZ3JvdW5kJzt9XG5cbiAgdmFyIHZhbHVlID0gW107XG4gIHZhciB5QXhpc0xlZnQgPSB0aGlzLmxpbmVncmFwaC55QXhpc0xlZnQ7XG4gIHZhciB5QXhpc1JpZ2h0ID0gdGhpcy5saW5lZ3JhcGgueUF4aXNSaWdodDtcbiAgaWYgKCF5QXhpc0xlZnQuaGlkZGVuICYmIHRoaXMuaXRlbXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICB2YWx1ZS5wdXNoKHlBeGlzTGVmdC5zY3JlZW5Ub1ZhbHVlKHkpKTtcbiAgfVxuICBpZiAoIXlBeGlzUmlnaHQuaGlkZGVuICYmIHRoaXMuaXRlbXNEYXRhLmxlbmd0aCA+IDApIHtcbiAgICB2YWx1ZS5wdXNoKHlBeGlzUmlnaHQuc2NyZWVuVG9WYWx1ZSh5KSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV2ZW50OiBldmVudCxcbiAgICBjdXN0b21UaW1lOiBjdXN0b21UaW1lID8gY3VzdG9tVGltZS5vcHRpb25zLmlkIDogbnVsbCxcbiAgICB3aGF0OiB3aGF0LFxuICAgIHBhZ2VYOiBldmVudC5zcmNFdmVudCA/IGV2ZW50LnNyY0V2ZW50LnBhZ2VYIDogZXZlbnQucGFnZVgsXG4gICAgcGFnZVk6IGV2ZW50LnNyY0V2ZW50ID8gZXZlbnQuc3JjRXZlbnQucGFnZVkgOiBldmVudC5wYWdlWSxcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAgdGltZTogdGltZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfVxufTtcblxuLyoqXG4gKiBMb2FkIGEgY29uZmlndXJhdG9yXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICovXG5HcmFwaDJkLnByb3RvdHlwZS5fY3JlYXRlQ29uZmlndXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IENvbmZpZ3VyYXRvcih0aGlzLCB0aGlzLmRvbS5jb250YWluZXIsIGNvbmZpZ3VyZU9wdGlvbnMkMSk7XG59O1xuXG4vLyBMb2NhbGVzIGhhdmUgdG8gYmUgc3VwcGxpZWQgYnkgdGhlIHVzZXIuXG5jb25zdCBkZWZhdWx0TGFuZ3VhZ2UgPSBnZXROYXZpZ2F0b3JMYW5ndWFnZSgpO1xubW9tZW50JDMubG9jYWxlKGRlZmF1bHRMYW5ndWFnZSk7XG5cbmNvbnN0IHRpbWVsaW5lID0ge1xuICBDb3JlLFxuICBEYXRlVXRpbCxcbiAgUmFuZ2UsXG4gIHN0YWNrOiBzdGFjayQxLFxuICBUaW1lU3RlcCxcblxuICBjb21wb25lbnRzOiB7XG4gICAgaXRlbXM6IHtcbiAgICAgIEl0ZW0sXG4gICAgICBCYWNrZ3JvdW5kSXRlbSxcbiAgICAgIEJveEl0ZW0sXG4gICAgICBDbHVzdGVySXRlbSxcbiAgICAgIFBvaW50SXRlbSxcbiAgICAgIFJhbmdlSXRlbVxuICAgIH0sXG5cbiAgICBCYWNrZ3JvdW5kR3JvdXAsXG4gICAgQ29tcG9uZW50LFxuICAgIEN1cnJlbnRUaW1lLFxuICAgIEN1c3RvbVRpbWUsXG4gICAgRGF0YUF4aXMsXG4gICAgRGF0YVNjYWxlLFxuICAgIEdyYXBoR3JvdXAsXG4gICAgR3JvdXAsXG4gICAgSXRlbVNldCxcbiAgICBMZWdlbmQsXG4gICAgTGluZUdyYXBoLFxuICAgIFRpbWVBeGlzXG4gIH1cbn07XG5cbmV4cG9ydCB7IEdyYXBoMmQsIFRpbWVsaW5lLCB0aW1lbGluZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlzLXRpbWVsaW5lLWdyYXBoMmQuanMubWFwXG4iLCIvKipcbiAqIHZpcy1kYXRhXG4gKiBodHRwOi8vdmlzanMub3JnL1xuICpcbiAqIE1hbmFnZSB1bnN0cnVjdHVyZWQgZGF0YSB1c2luZyBEYXRhU2V0LiBBZGQsIHVwZGF0ZSwgYW5kIHJlbW92ZSBkYXRhLCBhbmQgbGlzdGVuIGZvciBjaGFuZ2VzIGluIHRoZSBkYXRhLlxuICpcbiAqIEB2ZXJzaW9uIDcuMS4yXG4gKiBAZGF0ZSAgICAyMDIxLTAxLTA4VDIwOjM3OjExLjYwMVpcbiAqXG4gKiBAY29weXJpZ2h0IChjKSAyMDExLTIwMTcgQWxtZW5kZSBCLlYsIGh0dHA6Ly9hbG1lbmRlLmNvbVxuICogQGNvcHlyaWdodCAoYykgMjAxNy0yMDE5IHZpc2pzIGNvbnRyaWJ1dG9ycywgaHR0cHM6Ly9naXRodWIuY29tL3Zpc2pzXG4gKlxuICogQGxpY2Vuc2VcbiAqIHZpcy5qcyBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIGJvdGhcbiAqXG4gKiAgIDEuIFRoZSBBcGFjaGUgMi4wIExpY2Vuc2VcbiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogICBhbmRcbiAqXG4gKiAgIDIuIFRoZSBNSVQgTGljZW5zZVxuICogICAgICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogdmlzLmpzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBlaXRoZXIgbGljZW5zZS5cbiAqL1xuIWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/ZShleHBvcnRzKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImV4cG9ydHNcIl0sZSk6ZSgodD1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOnR8fHNlbGYpLnZpcz10LnZpc3x8e30pfSh0aGlzLChmdW5jdGlvbih0KXt2YXIgZT1cInVuZGVmaW5lZFwiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOlwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gcih0KXt2YXIgZT17ZXhwb3J0czp7fX07cmV0dXJuIHQoZSxlLmV4cG9ydHMpLGUuZXhwb3J0c312YXIgbj1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5NYXRoPT1NYXRoJiZ0fSxpPW4oXCJvYmplY3RcIj09dHlwZW9mIGdsb2JhbFRoaXMmJmdsb2JhbFRoaXMpfHxuKFwib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fG4oXCJvYmplY3RcIj09dHlwZW9mIHNlbGYmJnNlbGYpfHxuKFwib2JqZWN0XCI9PXR5cGVvZiBlJiZlKXx8ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKXx8RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpLG89ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX0sYT0hbygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LDEse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pWzFdfSkpLHU9e30ucHJvcGVydHlJc0VudW1lcmFibGUscz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGM9e2Y6cyYmIXUuY2FsbCh7MToyfSwxKT9mdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsdCk7cmV0dXJuISFlJiZlLmVudW1lcmFibGV9OnV9LGY9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19LGw9e30udG9TdHJpbmcsaD1mdW5jdGlvbih0KXtyZXR1cm4gbC5jYWxsKHQpLnNsaWNlKDgsLTEpfSxwPVwiXCIuc3BsaXQsdj1vKChmdW5jdGlvbigpe3JldHVybiFPYmplY3QoXCJ6XCIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVyblwiU3RyaW5nXCI9PWgodCk/cC5jYWxsKHQsXCJcIik6T2JqZWN0KHQpfTpPYmplY3QsZD1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiK3QpO3JldHVybiB0fSx5PWZ1bmN0aW9uKHQpe3JldHVybiB2KGQodCkpfSxnPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9LG09ZnVuY3Rpb24odCxlKXtpZighZyh0KSlyZXR1cm4gdDt2YXIgcixuO2lmKGUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKHI9dC50b1N0cmluZykmJiFnKG49ci5jYWxsKHQpKSlyZXR1cm4gbjtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZihyPXQudmFsdWVPZikmJiFnKG49ci5jYWxsKHQpKSlyZXR1cm4gbjtpZighZSYmXCJmdW5jdGlvblwiPT10eXBlb2Yocj10LnRvU3RyaW5nKSYmIWcobj1yLmNhbGwodCkpKXJldHVybiBuO3Rocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKX0sYj17fS5oYXNPd25Qcm9wZXJ0eSxfPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGIuY2FsbCh0LGUpfSx3PWkuZG9jdW1lbnQsRT1nKHcpJiZnKHcuY3JlYXRlRWxlbWVudCksTz1mdW5jdGlvbih0KXtyZXR1cm4gRT93LmNyZWF0ZUVsZW1lbnQodCk6e319LFQ9IWEmJiFvKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoTyhcImRpdlwiKSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKSxTPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IseD17ZjphP1M6ZnVuY3Rpb24odCxlKXtpZih0PXkodCksZT1tKGUsITApLFQpdHJ5e3JldHVybiBTKHQsZSl9Y2F0Y2godCl7fWlmKF8odCxlKSlyZXR1cm4gZighYy5mLmNhbGwodCxlKSx0W2VdKX19LGs9LyN8XFwucHJvdG90eXBlXFwuLyxBPWZ1bmN0aW9uKHQsZSl7dmFyIHI9SVtqKHQpXTtyZXR1cm4gcj09RHx8ciE9UCYmKFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/byhlKTohIWUpfSxqPUEubm9ybWFsaXplPWZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodCkucmVwbGFjZShrLFwiLlwiKS50b0xvd2VyQ2FzZSgpfSxJPUEuZGF0YT17fSxQPUEuTkFUSVZFPVwiTlwiLEQ9QS5QT0xZRklMTD1cIlBcIixMPUEsQz17fSxSPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KStcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtyZXR1cm4gdH0sTT1mdW5jdGlvbih0LGUscil7aWYoUih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChlKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdC5jYWxsKGUscil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24ocixuKXtyZXR1cm4gdC5jYWxsKGUscixuKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihyLG4saSl7cmV0dXJuIHQuY2FsbChlLHIsbixpKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX0sTj1mdW5jdGlvbih0KXtpZighZyh0KSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKHQpK1wiIGlzIG5vdCBhbiBvYmplY3RcIik7cmV0dXJuIHR9LEY9T2JqZWN0LmRlZmluZVByb3BlcnR5LHo9e2Y6YT9GOmZ1bmN0aW9uKHQsZSxyKXtpZihOKHQpLGU9bShlLCEwKSxOKHIpLFQpdHJ5e3JldHVybiBGKHQsZSxyKX1jYXRjaCh0KXt9aWYoXCJnZXRcImluIHJ8fFwic2V0XCJpbiByKXRocm93IFR5cGVFcnJvcihcIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkXCIpO3JldHVyblwidmFsdWVcImluIHImJih0W2VdPXIudmFsdWUpLHR9fSxxPWE/ZnVuY3Rpb24odCxlLHIpe3JldHVybiB6LmYodCxlLGYoMSxyKSl9OmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFtlXT1yLHR9LFk9eC5mLFU9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oZSxyLG4pe2lmKHRoaXMgaW5zdGFuY2VvZiB0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGUpO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZSxyKX1yZXR1cm4gbmV3IHQoZSxyLG4pfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIGUucHJvdG90eXBlPXQucHJvdG90eXBlLGV9LFg9ZnVuY3Rpb24odCxlKXt2YXIgcixuLG8sYSx1LHMsYyxmLGw9dC50YXJnZXQsaD10Lmdsb2JhbCxwPXQuc3RhdCx2PXQucHJvdG8sZD1oP2k6cD9pW2xdOihpW2xdfHx7fSkucHJvdG90eXBlLHk9aD9DOkNbbF18fChDW2xdPXt9KSxnPXkucHJvdG90eXBlO2ZvcihvIGluIGUpcj0hTChoP286bCsocD9cIi5cIjpcIiNcIikrbyx0LmZvcmNlZCkmJmQmJl8oZCxvKSx1PXlbb10sciYmKHM9dC5ub1RhcmdldEdldD8oZj1ZKGQsbykpJiZmLnZhbHVlOmRbb10pLGE9ciYmcz9zOmVbb10sciYmdHlwZW9mIHU9PXR5cGVvZiBhfHwoYz10LmJpbmQmJnI/TShhLGkpOnQud3JhcCYmcj9VKGEpOnYmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGE/TShGdW5jdGlvbi5jYWxsLGEpOmEsKHQuc2hhbXx8YSYmYS5zaGFtfHx1JiZ1LnNoYW0pJiZxKGMsXCJzaGFtXCIsITApLHlbb109Yyx2JiYoXyhDLG49bCtcIlByb3RvdHlwZVwiKXx8cShDLG4se30pLENbbl1bb109YSx0LnJlYWwmJmcmJiFnW29dJiZxKGcsbyxhKSkpfSxWPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVyblwiQXJyYXlcIj09aCh0KX0sVz1NYXRoLmNlaWwsRz1NYXRoLmZsb29yLEg9ZnVuY3Rpb24odCl7cmV0dXJuIGlzTmFOKHQ9K3QpPzA6KHQ+MD9HOlcpKHQpfSwkPU1hdGgubWluLEo9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8kKEgodCksOTAwNzE5OTI1NDc0MDk5MSk6MH0sUT1mdW5jdGlvbih0LGUscixuLGksbyxhLHUpe2Zvcih2YXIgcyxjPWksZj0wLGw9ISFhJiZNKGEsdSwzKTtmPG47KXtpZihmIGluIHIpe2lmKHM9bD9sKHJbZl0sZixlKTpyW2ZdLG8+MCYmVihzKSljPVEodCxlLHMsSihzLmxlbmd0aCksYyxvLTEpLTE7ZWxzZXtpZihjPj05MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcihcIkV4Y2VlZCB0aGUgYWNjZXB0YWJsZSBhcnJheSBsZW5ndGhcIik7dFtjXT1zfWMrK31mKyt9cmV0dXJuIGN9LEI9USxLPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QoZCh0KSl9LFo9XCJfX2NvcmUtanNfc2hhcmVkX19cIix0dD1pW1pdfHxmdW5jdGlvbih0LGUpe3RyeXtxKGksdCxlKX1jYXRjaChyKXtpW3RdPWV9cmV0dXJuIGV9KFose30pLGV0PXIoKGZ1bmN0aW9uKHQpeyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdHRbdF18fCh0dFt0XT12b2lkIDAhPT1lP2U6e30pfSkoXCJ2ZXJzaW9uc1wiLFtdKS5wdXNoKHt2ZXJzaW9uOlwiMy43LjBcIixtb2RlOlwicHVyZVwiLGNvcHlyaWdodDpcIsKpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSlcIn0pfSkpLHJ0PTAsbnQ9TWF0aC5yYW5kb20oKSxpdD1mdW5jdGlvbih0KXtyZXR1cm5cIlN5bWJvbChcIitTdHJpbmcodm9pZCAwPT09dD9cIlwiOnQpK1wiKV9cIisoKytydCtudCkudG9TdHJpbmcoMzYpfSxvdD0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFvKChmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSkpLGF0PW90JiYhU3ltYm9sLnNoYW0mJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IsdXQ9ZXQoXCJ3a3NcIiksc3Q9aS5TeW1ib2wsY3Q9YXQ/c3Q6c3QmJnN0LndpdGhvdXRTZXR0ZXJ8fGl0LGZ0PWZ1bmN0aW9uKHQpe3JldHVybiBfKHV0LHQpfHwob3QmJl8oc3QsdCk/dXRbdF09c3RbdF06dXRbdF09Y3QoXCJTeW1ib2wuXCIrdCkpLHV0W3RdfSxsdD1mdChcInNwZWNpZXNcIiksaHQ9ZnVuY3Rpb24odCxlKXt2YXIgcjtyZXR1cm4gVih0KSYmKFwiZnVuY3Rpb25cIiE9dHlwZW9mKHI9dC5jb25zdHJ1Y3Rvcil8fHIhPT1BcnJheSYmIVYoci5wcm90b3R5cGUpP2cocikmJm51bGw9PT0ocj1yW2x0XSkmJihyPXZvaWQgMCk6cj12b2lkIDApLG5ldyh2b2lkIDA9PT1yP0FycmF5OnIpKDA9PT1lPzA6ZSl9O1goe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITB9LHtmbGF0TWFwOmZ1bmN0aW9uKHQpe3ZhciBlLHI9Syh0aGlzKSxuPUooci5sZW5ndGgpO3JldHVybiBSKHQpLChlPWh0KHIsMCkpLmxlbmd0aD1CKGUscixyLG4sMCwxLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApLGV9fSk7dmFyIHB0LHZ0LGR0PWZ1bmN0aW9uKHQpe3JldHVybiBDW3QrXCJQcm90b3R5cGVcIl19LHl0PWR0KFwiQXJyYXlcIikuZmxhdE1hcCxndD1BcnJheS5wcm90b3R5cGUsbXQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5mbGF0TWFwO3JldHVybiB0PT09Z3R8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWd0LmZsYXRNYXA/eXQ6ZX0sYnQ9W10ucHVzaCxfdD1mdW5jdGlvbih0KXt2YXIgZT0xPT10LHI9Mj09dCxuPTM9PXQsaT00PT10LG89Nj09dCxhPTU9PXR8fG87cmV0dXJuIGZ1bmN0aW9uKHUscyxjLGYpe2Zvcih2YXIgbCxoLHA9Syh1KSxkPXYocCkseT1NKHMsYywzKSxnPUooZC5sZW5ndGgpLG09MCxiPWZ8fGh0LF89ZT9iKHUsZyk6cj9iKHUsMCk6dm9pZCAwO2c+bTttKyspaWYoKGF8fG0gaW4gZCkmJihoPXkobD1kW21dLG0scCksdCkpaWYoZSlfW21dPWg7ZWxzZSBpZihoKXN3aXRjaCh0KXtjYXNlIDM6cmV0dXJuITA7Y2FzZSA1OnJldHVybiBsO2Nhc2UgNjpyZXR1cm4gbTtjYXNlIDI6YnQuY2FsbChfLGwpfWVsc2UgaWYoaSlyZXR1cm4hMTtyZXR1cm4gbz8tMTpufHxpP2k6X319LHd0PXtmb3JFYWNoOl90KDApLG1hcDpfdCgxKSxmaWx0ZXI6X3QoMiksc29tZTpfdCgzKSxldmVyeTpfdCg0KSxmaW5kOl90KDUpLGZpbmRJbmRleDpfdCg2KX0sRXQ9ZnVuY3Rpb24odCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdD90OnZvaWQgMH0sT3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP0V0KENbdF0pfHxFdChpW3RdKTpDW3RdJiZDW3RdW2VdfHxpW3RdJiZpW3RdW2VdfSxUdD1PdChcIm5hdmlnYXRvclwiLFwidXNlckFnZW50XCIpfHxcIlwiLFN0PWkucHJvY2Vzcyx4dD1TdCYmU3QudmVyc2lvbnMsa3Q9eHQmJnh0LnY4O2t0P3Z0PShwdD1rdC5zcGxpdChcIi5cIikpWzBdK3B0WzFdOlR0JiYoIShwdD1UdC5tYXRjaCgvRWRnZVxcLyhcXGQrKS8pKXx8cHRbMV0+PTc0KSYmKHB0PVR0Lm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvKSkmJih2dD1wdFsxXSk7dmFyIEF0PXZ0JiYrdnQsanQ9ZnQoXCJzcGVjaWVzXCIpLEl0PWZ1bmN0aW9uKHQpe3JldHVybiBBdD49NTF8fCFvKChmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybihlLmNvbnN0cnVjdG9yPXt9KVtqdF09ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09ZVt0XShCb29sZWFuKS5mb299KSl9LFB0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxEdD17fSxMdD1mdW5jdGlvbih0KXt0aHJvdyB0fSxDdD1mdW5jdGlvbih0LGUpe2lmKF8oRHQsdCkpcmV0dXJuIER0W3RdO2V8fChlPXt9KTt2YXIgcj1bXVt0XSxuPSEhXyhlLFwiQUNDRVNTT1JTXCIpJiZlLkFDQ0VTU09SUyxpPV8oZSwwKT9lWzBdOkx0LHU9XyhlLDEpP2VbMV06dm9pZCAwO3JldHVybiBEdFt0XT0hIXImJiFvKChmdW5jdGlvbigpe2lmKG4mJiFhKXJldHVybiEwO3ZhciB0PXtsZW5ndGg6LTF9O24/UHQodCwxLHtlbnVtZXJhYmxlOiEwLGdldDpMdH0pOnRbMV09MSxyLmNhbGwodCxpLHUpfSkpfSxSdD13dC5tYXAsTXQ9SXQoXCJtYXBcIiksTnQ9Q3QoXCJtYXBcIik7WCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6IU10fHwhTnR9LHttYXA6ZnVuY3Rpb24odCl7cmV0dXJuIFJ0KHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSk7dmFyIEZ0PWR0KFwiQXJyYXlcIikubWFwLHp0PUFycmF5LnByb3RvdHlwZSxxdD1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PXp0fHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT16dC5tYXA/RnQ6ZX0sWXQ9d3QuZmlsdGVyLFV0PUl0KFwiZmlsdGVyXCIpLFh0PUN0KFwiZmlsdGVyXCIpO1goe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITAsZm9yY2VkOiFVdHx8IVh0fSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiBZdCh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pO3ZhciBWdD1kdChcIkFycmF5XCIpLmZpbHRlcixXdD1BcnJheS5wcm90b3R5cGUsR3Q9ZnVuY3Rpb24odCl7dmFyIGU9dC5maWx0ZXI7cmV0dXJuIHQ9PT1XdHx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09V3QuZmlsdGVyP1Z0OmV9LEh0PWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbixpKXtSKHIpO3ZhciBvPUsoZSksYT12KG8pLHU9SihvLmxlbmd0aCkscz10P3UtMTowLGM9dD8tMToxO2lmKG48Milmb3IoOzspe2lmKHMgaW4gYSl7aT1hW3NdLHMrPWM7YnJlYWt9aWYocys9Yyx0P3M8MDp1PD1zKXRocm93IFR5cGVFcnJvcihcIlJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWVcIil9Zm9yKDt0P3M+PTA6dT5zO3MrPWMpcyBpbiBhJiYoaT1yKGksYVtzXSxzLG8pKTtyZXR1cm4gaX19LCR0PXtsZWZ0Okh0KCExKSxyaWdodDpIdCghMCl9LEp0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9W11bdF07cmV0dXJuISFyJiZvKChmdW5jdGlvbigpe3IuY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KSl9LFF0PVwicHJvY2Vzc1wiPT1oKGkucHJvY2VzcyksQnQ9JHQubGVmdCxLdD1KdChcInJlZHVjZVwiKSxadD1DdChcInJlZHVjZVwiLHsxOjB9KTtYKHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDohS3R8fCFadHx8IVF0JiZBdD43OSYmQXQ8ODN9LHtyZWR1Y2U6ZnVuY3Rpb24odCl7cmV0dXJuIEJ0KHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgdGU9ZHQoXCJBcnJheVwiKS5yZWR1Y2UsZWU9QXJyYXkucHJvdG90eXBlLHJlPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVkdWNlO3JldHVybiB0PT09ZWV8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWVlLnJlZHVjZT90ZTplfSxuZT1bXS5zbGljZSxpZT17fSxvZT1mdW5jdGlvbih0LGUscil7aWYoIShlIGluIGllKSl7Zm9yKHZhciBuPVtdLGk9MDtpPGU7aSsrKW5baV09XCJhW1wiK2krXCJdXCI7aWVbZV09RnVuY3Rpb24oXCJDLGFcIixcInJldHVybiBuZXcgQyhcIituLmpvaW4oXCIsXCIpK1wiKVwiKX1yZXR1cm4gaWVbZV0odCxyKX0sYWU9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9Uih0aGlzKSxyPW5lLmNhbGwoYXJndW1lbnRzLDEpLG49ZnVuY3Rpb24oKXt2YXIgaT1yLmNvbmNhdChuZS5jYWxsKGFyZ3VtZW50cykpO3JldHVybiB0aGlzIGluc3RhbmNlb2Ygbj9vZShlLGkubGVuZ3RoLGkpOmUuYXBwbHkodCxpKX07cmV0dXJuIGcoZS5wcm90b3R5cGUpJiYobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLG59O1goe3RhcmdldDpcIkZ1bmN0aW9uXCIscHJvdG86ITB9LHtiaW5kOmFlfSk7dmFyIHVlPWR0KFwiRnVuY3Rpb25cIikuYmluZCxzZT1GdW5jdGlvbi5wcm90b3R5cGUsY2U9ZnVuY3Rpb24odCl7dmFyIGU9dC5iaW5kO3JldHVybiB0PT09c2V8fHQgaW5zdGFuY2VvZiBGdW5jdGlvbiYmZT09PXNlLmJpbmQ/dWU6ZX07dmFyIGZlPWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX07WCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6IWEsc2hhbTohYX0se2RlZmluZVByb3BlcnR5OnouZn0pO3ZhciBsZT1yKChmdW5jdGlvbih0KXt2YXIgZT1DLk9iamVjdCxyPXQuZXhwb3J0cz1mdW5jdGlvbih0LHIsbil7cmV0dXJuIGUuZGVmaW5lUHJvcGVydHkodCxyLG4pfTtlLmRlZmluZVByb3BlcnR5LnNoYW0mJihyLnNoYW09ITApfSkpLGhlPWxlO2Z1bmN0aW9uIHBlKHQsZSl7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLGhlKHQsbi5rZXksbil9fXZhciB2ZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGUmJnBlKHQucHJvdG90eXBlLGUpLHImJnBlKHQsciksdH07dmFyIGRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsbil7dmFyIGksbyxhO2ZlKHRoaXMsdCksdGhpcy5fc291cmNlPWUsdGhpcy5fdHJhbnNmb3JtZXJzPXIsdGhpcy5fdGFyZ2V0PW4sdGhpcy5fbGlzdGVuZXJzPXthZGQ6Y2UoaT10aGlzLl9hZGQpLmNhbGwoaSx0aGlzKSxyZW1vdmU6Y2Uobz10aGlzLl9yZW1vdmUpLmNhbGwobyx0aGlzKSx1cGRhdGU6Y2UoYT10aGlzLl91cGRhdGUpLmNhbGwoYSx0aGlzKX19cmV0dXJuIHZlKHQsW3trZXk6XCJhbGxcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl90YXJnZXQudXBkYXRlKHRoaXMuX3RyYW5zZm9ybUl0ZW1zKHRoaXMuX3NvdXJjZS5nZXQoKSkpLHRoaXN9fSx7a2V5Olwic3RhcnRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2Uub24oXCJhZGRcIix0aGlzLl9saXN0ZW5lcnMuYWRkKSx0aGlzLl9zb3VyY2Uub24oXCJyZW1vdmVcIix0aGlzLl9saXN0ZW5lcnMucmVtb3ZlKSx0aGlzLl9zb3VyY2Uub24oXCJ1cGRhdGVcIix0aGlzLl9saXN0ZW5lcnMudXBkYXRlKSx0aGlzfX0se2tleTpcInN0b3BcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zb3VyY2Uub2ZmKFwiYWRkXCIsdGhpcy5fbGlzdGVuZXJzLmFkZCksdGhpcy5fc291cmNlLm9mZihcInJlbW92ZVwiLHRoaXMuX2xpc3RlbmVycy5yZW1vdmUpLHRoaXMuX3NvdXJjZS5vZmYoXCJ1cGRhdGVcIix0aGlzLl9saXN0ZW5lcnMudXBkYXRlKSx0aGlzfX0se2tleTpcIl90cmFuc2Zvcm1JdGVtc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByZShlPXRoaXMuX3RyYW5zZm9ybWVycykuY2FsbChlLChmdW5jdGlvbih0LGUpe3JldHVybiBlKHQpfSksdCl9fSx7a2V5OlwiX2FkZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7bnVsbCE9ZSYmdGhpcy5fdGFyZ2V0LmFkZCh0aGlzLl90cmFuc2Zvcm1JdGVtcyh0aGlzLl9zb3VyY2UuZ2V0KGUuaXRlbXMpKSl9fSx7a2V5OlwiX3VwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7bnVsbCE9ZSYmdGhpcy5fdGFyZ2V0LnVwZGF0ZSh0aGlzLl90cmFuc2Zvcm1JdGVtcyh0aGlzLl9zb3VyY2UuZ2V0KGUuaXRlbXMpKSl9fSx7a2V5OlwiX3JlbW92ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7bnVsbCE9ZSYmdGhpcy5fdGFyZ2V0LnJlbW92ZSh0aGlzLl90cmFuc2Zvcm1JdGVtcyhlLm9sZERhdGEpKX19XSksdH0oKSx5ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7ZmUodGhpcyx0KSx0aGlzLl9zb3VyY2U9ZSx0aGlzLl90cmFuc2Zvcm1lcnM9W119cmV0dXJuIHZlKHQsW3trZXk6XCJmaWx0ZXJcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtZXJzLnB1c2goKGZ1bmN0aW9uKGUpe3JldHVybiBHdChlKS5jYWxsKGUsdCl9KSksdGhpc319LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdHJhbnNmb3JtZXJzLnB1c2goKGZ1bmN0aW9uKGUpe3JldHVybiBxdChlKS5jYWxsKGUsdCl9KSksdGhpc319LHtrZXk6XCJmbGF0TWFwXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybWVycy5wdXNoKChmdW5jdGlvbihlKXtyZXR1cm4gbXQoZSkuY2FsbChlLHQpfSkpLHRoaXN9fSx7a2V5OlwidG9cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRlKHRoaXMuX3NvdXJjZSx0aGlzLl90cmFuc2Zvcm1lcnMsdCl9fV0pLHR9KCksZ2U9bGUsbWU9TWF0aC5tYXgsYmU9TWF0aC5taW4sX2U9ZnVuY3Rpb24odCxlKXt2YXIgcj1IKHQpO3JldHVybiByPDA/bWUocitlLDApOmJlKHIsZSl9LHdlPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIsbil7dmFyIGksbz15KGUpLGE9SihvLmxlbmd0aCksdT1fZShuLGEpO2lmKHQmJnIhPXIpe2Zvcig7YT51OylpZigoaT1vW3UrK10pIT1pKXJldHVybiEwfWVsc2UgZm9yKDthPnU7dSsrKWlmKCh0fHx1IGluIG8pJiZvW3VdPT09cilyZXR1cm4gdHx8dXx8MDtyZXR1cm4hdCYmLTF9fSxFZT17aW5jbHVkZXM6d2UoITApLGluZGV4T2Y6d2UoITEpfSxPZT17fSxUZT1FZS5pbmRleE9mLFNlPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj15KHQpLGk9MCxvPVtdO2ZvcihyIGluIG4pIV8oT2UscikmJl8obixyKSYmby5wdXNoKHIpO2Zvcig7ZS5sZW5ndGg+aTspXyhuLHI9ZVtpKytdKSYmKH5UZShvLHIpfHxvLnB1c2gocikpO3JldHVybiBvfSx4ZT1bXCJjb25zdHJ1Y3RvclwiLFwiaGFzT3duUHJvcGVydHlcIixcImlzUHJvdG90eXBlT2ZcIixcInByb3BlcnR5SXNFbnVtZXJhYmxlXCIsXCJ0b0xvY2FsZVN0cmluZ1wiLFwidG9TdHJpbmdcIixcInZhbHVlT2ZcIl0sa2U9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiBTZSh0LHhlKX0sQWU9YT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe04odCk7Zm9yKHZhciByLG49a2UoZSksaT1uLmxlbmd0aCxvPTA7aT5vOyl6LmYodCxyPW5bbysrXSxlW3JdKTtyZXR1cm4gdH07WCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6IWEsc2hhbTohYX0se2RlZmluZVByb3BlcnRpZXM6QWV9KTt2YXIgamU9cigoZnVuY3Rpb24odCl7dmFyIGU9Qy5PYmplY3Qscj10LmV4cG9ydHM9ZnVuY3Rpb24odCxyKXtyZXR1cm4gZS5kZWZpbmVQcm9wZXJ0aWVzKHQscil9O2UuZGVmaW5lUHJvcGVydGllcy5zaGFtJiYoci5zaGFtPSEwKX0pKSxJZT14ZS5jb25jYXQoXCJsZW5ndGhcIixcInByb3RvdHlwZVwiKSxQZT17ZjpPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIFNlKHQsSWUpfX0sRGU9e2Y6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sTGU9T3QoXCJSZWZsZWN0XCIsXCJvd25LZXlzXCIpfHxmdW5jdGlvbih0KXt2YXIgZT1QZS5mKE4odCkpLHI9RGUuZjtyZXR1cm4gcj9lLmNvbmNhdChyKHQpKTplfSxDZT1mdW5jdGlvbih0LGUscil7dmFyIG49bShlKTtuIGluIHQ/ei5mKHQsbixmKDAscikpOnRbbl09cn07WCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxzaGFtOiFhfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yczpmdW5jdGlvbih0KXtmb3IodmFyIGUscixuPXkodCksaT14LmYsbz1MZShuKSxhPXt9LHU9MDtvLmxlbmd0aD51Oyl2b2lkIDAhPT0ocj1pKG4sZT1vW3UrK10pKSYmQ2UoYSxlLHIpO3JldHVybiBhfX0pO3ZhciBSZT1DLk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLE1lPXguZixOZT1vKChmdW5jdGlvbigpe01lKDEpfSkpO1goe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITAsZm9yY2VkOiFhfHxOZSxzaGFtOiFhfSx7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKHkodCksZSl9fSk7dmFyIEZlLHplPXIoKGZ1bmN0aW9uKHQpe3ZhciBlPUMuT2JqZWN0LHI9dC5leHBvcnRzPWZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscil9O2UuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLnNoYW0mJihyLnNoYW09ITApfSkpLHFlPU90KFwiZG9jdW1lbnRcIixcImRvY3VtZW50RWxlbWVudFwiKSxZZT1ldChcImtleXNcIiksVWU9ZnVuY3Rpb24odCl7cmV0dXJuIFllW3RdfHwoWWVbdF09aXQodCkpfSxYZT1VZShcIklFX1BST1RPXCIpLFZlPWZ1bmN0aW9uKCl7fSxXZT1mdW5jdGlvbih0KXtyZXR1cm5cIjxzY3JpcHQ+XCIrdCtcIjwvXCIrXCJzY3JpcHQ+XCJ9LEdlPWZ1bmN0aW9uKCl7dHJ5e0ZlPWRvY3VtZW50LmRvbWFpbiYmbmV3IEFjdGl2ZVhPYmplY3QoXCJodG1sZmlsZVwiKX1jYXRjaCh0KXt9dmFyIHQsZTtHZT1GZT9mdW5jdGlvbih0KXt0LndyaXRlKFdlKFwiXCIpKSx0LmNsb3NlKCk7dmFyIGU9dC5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiB0PW51bGwsZX0oRmUpOigoZT1PKFwiaWZyYW1lXCIpKS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHFlLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZyhcImphdmFzY3JpcHQ6XCIpLCh0PWUuY29udGVudFdpbmRvdy5kb2N1bWVudCkub3BlbigpLHQud3JpdGUoV2UoXCJkb2N1bWVudC5GPU9iamVjdFwiKSksdC5jbG9zZSgpLHQuRik7Zm9yKHZhciByPXhlLmxlbmd0aDtyLS07KWRlbGV0ZSBHZS5wcm90b3R5cGVbeGVbcl1dO3JldHVybiBHZSgpfTtPZVtYZV09ITA7dmFyIEhlPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIG51bGwhPT10PyhWZS5wcm90b3R5cGU9Tih0KSxyPW5ldyBWZSxWZS5wcm90b3R5cGU9bnVsbCxyW1hlXT10KTpyPUdlKCksdm9pZCAwPT09ZT9yOkFlKHIsZSl9LCRlPVBlLmYsSmU9e30udG9TdHJpbmcsUWU9XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLEJlPXtmOmZ1bmN0aW9uKHQpe3JldHVybiBRZSYmXCJbb2JqZWN0IFdpbmRvd11cIj09SmUuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuICRlKHQpfWNhdGNoKHQpe3JldHVybiBRZS5zbGljZSgpfX0odCk6JGUoeSh0KSl9fSxLZT1mdW5jdGlvbih0LGUscixuKXtuJiZuLmVudW1lcmFibGU/dFtlXT1yOnEodCxlLHIpfSxaZT17ZjpmdH0sdHI9ei5mLGVyPWZ1bmN0aW9uKHQpe3ZhciBlPUMuU3ltYm9sfHwoQy5TeW1ib2w9e30pO18oZSx0KXx8dHIoZSx0LHt2YWx1ZTpaZS5mKHQpfSl9LHJyPXt9O3JyW2Z0KFwidG9TdHJpbmdUYWdcIildPVwielwiO3ZhciBucj1cIltvYmplY3Qgel1cIj09PVN0cmluZyhyciksaXI9ZnQoXCJ0b1N0cmluZ1RhZ1wiKSxvcj1cIkFyZ3VtZW50c1wiPT1oKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSksYXI9bnI/aDpmdW5jdGlvbih0KXt2YXIgZSxyLG47cmV0dXJuIHZvaWQgMD09PXQ/XCJVbmRlZmluZWRcIjpudWxsPT09dD9cIk51bGxcIjpcInN0cmluZ1wiPT10eXBlb2Yocj1mdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gdFtlXX1jYXRjaCh0KXt9fShlPU9iamVjdCh0KSxpcikpP3I6b3I/aChlKTpcIk9iamVjdFwiPT0obj1oKGUpKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5jYWxsZWU/XCJBcmd1bWVudHNcIjpufSx1cj1ucj97fS50b1N0cmluZzpmdW5jdGlvbigpe3JldHVyblwiW29iamVjdCBcIithcih0aGlzKStcIl1cIn0sc3I9ei5mLGNyPWZ0KFwidG9TdHJpbmdUYWdcIiksZnI9ZnVuY3Rpb24odCxlLHIsbil7aWYodCl7dmFyIGk9cj90OnQucHJvdG90eXBlO18oaSxjcil8fHNyKGksY3Ise2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTplfSksbiYmIW5yJiZxKGksXCJ0b1N0cmluZ1wiLHVyKX19LGxyPUZ1bmN0aW9uLnRvU3RyaW5nO1wiZnVuY3Rpb25cIiE9dHlwZW9mIHR0Lmluc3BlY3RTb3VyY2UmJih0dC5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBsci5jYWxsKHQpfSk7dmFyIGhyLHByLHZyLGRyPXR0Lmluc3BlY3RTb3VyY2UseXI9aS5XZWFrTWFwLGdyPVwiZnVuY3Rpb25cIj09dHlwZW9mIHlyJiYvbmF0aXZlIGNvZGUvLnRlc3QoZHIoeXIpKSxtcj1pLldlYWtNYXA7aWYoZ3Ipe3ZhciBicj10dC5zdGF0ZXx8KHR0LnN0YXRlPW5ldyBtciksX3I9YnIuZ2V0LHdyPWJyLmhhcyxFcj1ici5zZXQ7aHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mYWNhZGU9dCxFci5jYWxsKGJyLHQsZSksZX0scHI9ZnVuY3Rpb24odCl7cmV0dXJuIF9yLmNhbGwoYnIsdCl8fHt9fSx2cj1mdW5jdGlvbih0KXtyZXR1cm4gd3IuY2FsbChicix0KX19ZWxzZXt2YXIgT3I9VWUoXCJzdGF0ZVwiKTtPZVtPcl09ITAsaHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mYWNhZGU9dCxxKHQsT3IsZSksZX0scHI9ZnVuY3Rpb24odCl7cmV0dXJuIF8odCxPcik/dFtPcl06e319LHZyPWZ1bmN0aW9uKHQpe3JldHVybiBfKHQsT3IpfX12YXIgVHI9e3NldDpocixnZXQ6cHIsaGFzOnZyLGVuZm9yY2U6ZnVuY3Rpb24odCl7cmV0dXJuIHZyKHQpP3ByKHQpOmhyKHQse30pfSxnZXR0ZXJGb3I6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByO2lmKCFnKGUpfHwocj1wcihlKSkudHlwZSE9PXQpdGhyb3cgVHlwZUVycm9yKFwiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCBcIit0K1wiIHJlcXVpcmVkXCIpO3JldHVybiByfX19LFNyPXd0LmZvckVhY2gseHI9VWUoXCJoaWRkZW5cIiksa3I9XCJTeW1ib2xcIixBcj1mdChcInRvUHJpbWl0aXZlXCIpLGpyPVRyLnNldCxJcj1Uci5nZXR0ZXJGb3Ioa3IpLFByPU9iamVjdC5wcm90b3R5cGUsRHI9aS5TeW1ib2wsTHI9T3QoXCJKU09OXCIsXCJzdHJpbmdpZnlcIiksQ3I9eC5mLFJyPXouZixNcj1CZS5mLE5yPWMuZixGcj1ldChcInN5bWJvbHNcIiksenI9ZXQoXCJvcC1zeW1ib2xzXCIpLHFyPWV0KFwic3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeVwiKSxZcj1ldChcInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnlcIiksVXI9ZXQoXCJ3a3NcIiksWHI9aS5RT2JqZWN0LFZyPSFYcnx8IVhyLnByb3RvdHlwZXx8IVhyLnByb3RvdHlwZS5maW5kQ2hpbGQsV3I9YSYmbygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9SGUoUnIoe30sXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiBScih0aGlzLFwiYVwiLHt2YWx1ZTo3fSkuYX19KSkuYX0pKT9mdW5jdGlvbih0LGUscil7dmFyIG49Q3IoUHIsZSk7biYmZGVsZXRlIFByW2VdLFJyKHQsZSxyKSxuJiZ0IT09UHImJlJyKFByLGUsbil9OlJyLEdyPWZ1bmN0aW9uKHQsZSl7dmFyIHI9RnJbdF09SGUoRHIucHJvdG90eXBlKTtyZXR1cm4ganIocix7dHlwZTprcix0YWc6dCxkZXNjcmlwdGlvbjplfSksYXx8KHIuZGVzY3JpcHRpb249ZSkscn0sSHI9YXQ/ZnVuY3Rpb24odCl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QodClpbnN0YW5jZW9mIERyfSwkcj1mdW5jdGlvbih0LGUscil7dD09PVByJiYkcih6cixlLHIpLE4odCk7dmFyIG49bShlLCEwKTtyZXR1cm4gTihyKSxfKEZyLG4pPyhyLmVudW1lcmFibGU/KF8odCx4cikmJnRbeHJdW25dJiYodFt4cl1bbl09ITEpLHI9SGUocix7ZW51bWVyYWJsZTpmKDAsITEpfSkpOihfKHQseHIpfHxScih0LHhyLGYoMSx7fSkpLHRbeHJdW25dPSEwKSxXcih0LG4scikpOlJyKHQsbixyKX0sSnI9ZnVuY3Rpb24odCxlKXtOKHQpO3ZhciByPXkoZSksbj1rZShyKS5jb25jYXQoWnIocikpO3JldHVybiBTcihuLChmdW5jdGlvbihlKXthJiYhUXIuY2FsbChyLGUpfHwkcih0LGUscltlXSl9KSksdH0sUXI9ZnVuY3Rpb24odCl7dmFyIGU9bSh0LCEwKSxyPU5yLmNhbGwodGhpcyxlKTtyZXR1cm4hKHRoaXM9PT1QciYmXyhGcixlKSYmIV8oenIsZSkpJiYoIShyfHwhXyh0aGlzLGUpfHwhXyhGcixlKXx8Xyh0aGlzLHhyKSYmdGhpc1t4cl1bZV0pfHxyKX0sQnI9ZnVuY3Rpb24odCxlKXt2YXIgcj15KHQpLG49bShlLCEwKTtpZihyIT09UHJ8fCFfKEZyLG4pfHxfKHpyLG4pKXt2YXIgaT1DcihyLG4pO3JldHVybiFpfHwhXyhGcixuKXx8XyhyLHhyKSYmclt4cl1bbl18fChpLmVudW1lcmFibGU9ITApLGl9fSxLcj1mdW5jdGlvbih0KXt2YXIgZT1Ncih5KHQpKSxyPVtdO3JldHVybiBTcihlLChmdW5jdGlvbih0KXtfKEZyLHQpfHxfKE9lLHQpfHxyLnB1c2godCl9KSkscn0sWnI9ZnVuY3Rpb24odCl7dmFyIGU9dD09PVByLHI9TXIoZT96cjp5KHQpKSxuPVtdO3JldHVybiBTcihyLChmdW5jdGlvbih0KXshXyhGcix0KXx8ZSYmIV8oUHIsdCl8fG4ucHVzaChGclt0XSl9KSksbn07aWYob3R8fChLZSgoRHI9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgRHIpdGhyb3cgVHlwZUVycm9yKFwiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yXCIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1pdCh0KSxyPWZ1bmN0aW9uKHQpe3RoaXM9PT1QciYmci5jYWxsKHpyLHQpLF8odGhpcyx4cikmJl8odGhpc1t4cl0sZSkmJih0aGlzW3hyXVtlXT0hMSksV3IodGhpcyxlLGYoMSx0KSl9O3JldHVybiBhJiZWciYmV3IoUHIsZSx7Y29uZmlndXJhYmxlOiEwLHNldDpyfSksR3IoZSx0KX0pLnByb3RvdHlwZSxcInRvU3RyaW5nXCIsKGZ1bmN0aW9uKCl7cmV0dXJuIElyKHRoaXMpLnRhZ30pKSxLZShEcixcIndpdGhvdXRTZXR0ZXJcIiwoZnVuY3Rpb24odCl7cmV0dXJuIEdyKGl0KHQpLHQpfSkpLGMuZj1Rcix6LmY9JHIseC5mPUJyLFBlLmY9QmUuZj1LcixEZS5mPVpyLFplLmY9ZnVuY3Rpb24odCl7cmV0dXJuIEdyKGZ0KHQpLHQpfSxhJiZScihEci5wcm90b3R5cGUsXCJkZXNjcmlwdGlvblwiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIElyKHRoaXMpLmRlc2NyaXB0aW9ufX0pKSxYKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IW90LHNoYW06IW90fSx7U3ltYm9sOkRyfSksU3Ioa2UoVXIpLChmdW5jdGlvbih0KXtlcih0KX0pKSxYKHt0YXJnZXQ6a3Isc3RhdDohMCxmb3JjZWQ6IW90fSx7Zm9yOmZ1bmN0aW9uKHQpe3ZhciBlPVN0cmluZyh0KTtpZihfKHFyLGUpKXJldHVybiBxcltlXTt2YXIgcj1EcihlKTtyZXR1cm4gcXJbZV09cixZcltyXT1lLHJ9LGtleUZvcjpmdW5jdGlvbih0KXtpZighSHIodCkpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgc3ltYm9sXCIpO2lmKF8oWXIsdCkpcmV0dXJuIFlyW3RdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtWcj0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7VnI9ITF9fSksWCh7dGFyZ2V0OlwiT2JqZWN0XCIsc3RhdDohMCxmb3JjZWQ6IW90LHNoYW06IWF9LHtjcmVhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT9IZSh0KTpKcihIZSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6JHIsZGVmaW5lUHJvcGVydGllczpKcixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6QnJ9KSxYKHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwLGZvcmNlZDohb3R9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOktyLGdldE93blByb3BlcnR5U3ltYm9sczpacn0pLFgoe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITAsZm9yY2VkOm8oKGZ1bmN0aW9uKCl7RGUuZigxKX0pKX0se2dldE93blByb3BlcnR5U3ltYm9sczpmdW5jdGlvbih0KXtyZXR1cm4gRGUuZihLKHQpKX19KSxMcil7dmFyIHRuPSFvdHx8bygoZnVuY3Rpb24oKXt2YXIgdD1EcigpO3JldHVyblwiW251bGxdXCIhPUxyKFt0XSl8fFwie31cIiE9THIoe2E6dH0pfHxcInt9XCIhPUxyKE9iamVjdCh0KSl9KSk7WCh7dGFyZ2V0OlwiSlNPTlwiLHN0YXQ6ITAsZm9yY2VkOnRufSx7c3RyaW5naWZ5OmZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG4saT1bdF0sbz0xO2FyZ3VtZW50cy5sZW5ndGg+bzspaS5wdXNoKGFyZ3VtZW50c1tvKytdKTtpZihuPWUsKGcoZSl8fHZvaWQgMCE9PXQpJiYhSHIodCkpcmV0dXJuIFYoZSl8fChlPWZ1bmN0aW9uKHQsZSl7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgbiYmKGU9bi5jYWxsKHRoaXMsdCxlKSksIUhyKGUpKXJldHVybiBlfSksaVsxXT1lLExyLmFwcGx5KG51bGwsaSl9fSl9RHIucHJvdG90eXBlW0FyXXx8cShEci5wcm90b3R5cGUsQXIsRHIucHJvdG90eXBlLnZhbHVlT2YpLGZyKERyLGtyKSxPZVt4cl09ITA7dmFyIGVuLHJuLG5uLG9uPUMuT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxhbj17fSx1bj0hbygoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pKSxzbj1VZShcIklFX1BST1RPXCIpLGNuPU9iamVjdC5wcm90b3R5cGUsZm49dW4/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0PUsodCksXyh0LHNuKT90W3NuXTpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P2NuOm51bGx9LGxuPShmdChcIml0ZXJhdG9yXCIpLCExKTtbXS5rZXlzJiYoXCJuZXh0XCJpbihubj1bXS5rZXlzKCkpPyhybj1mbihmbihubikpKSE9PU9iamVjdC5wcm90b3R5cGUmJihlbj1ybik6bG49ITApLG51bGw9PWVuJiYoZW49e30pO3ZhciBobj17SXRlcmF0b3JQcm90b3R5cGU6ZW4sQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpsbn0scG49aG4uSXRlcmF0b3JQcm90b3R5cGUsdm49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZG49T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoXCJfX3Byb3RvX19cImlue30/ZnVuY3Rpb24oKXt2YXIgdCxlPSExLHI9e307dHJ5eyh0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LnByb3RvdHlwZSxcIl9fcHJvdG9fX1wiKS5zZXQpLmNhbGwocixbXSksZT1yIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBOKHIpLGZ1bmN0aW9uKHQpe2lmKCFnKHQpJiZudWxsIT09dCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBzZXQgXCIrU3RyaW5nKHQpK1wiIGFzIGEgcHJvdG90eXBlXCIpfShuKSxlP3QuY2FsbChyLG4pOnIuX19wcm90b19fPW4scn19KCk6dm9pZCAwKSx5bj1obi5JdGVyYXRvclByb3RvdHlwZSxnbj1obi5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLG1uPWZ0KFwiaXRlcmF0b3JcIiksYm49XCJrZXlzXCIsX249XCJ2YWx1ZXNcIix3bj1cImVudHJpZXNcIixFbj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxPbj1mdW5jdGlvbih0LGUscixuLGksbyxhKXshZnVuY3Rpb24odCxlLHIpe3ZhciBuPWUrXCIgSXRlcmF0b3JcIjt0LnByb3RvdHlwZT1IZShwbix7bmV4dDpmKDEscil9KSxmcih0LG4sITEsITApLGFuW25dPXZufShyLGUsbik7dmFyIHUscyxjLGw9ZnVuY3Rpb24odCl7aWYodD09PWkmJnkpcmV0dXJuIHk7aWYoIWduJiZ0IGluIHYpcmV0dXJuIHZbdF07c3dpdGNoKHQpe2Nhc2UgYm46Y2FzZSBfbjpjYXNlIHduOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgcih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIodGhpcyl9fSxoPWUrXCIgSXRlcmF0b3JcIixwPSExLHY9dC5wcm90b3R5cGUsZD12W21uXXx8dltcIkBAaXRlcmF0b3JcIl18fGkmJnZbaV0seT0hZ24mJmR8fGwoaSksZz1cIkFycmF5XCI9PWUmJnYuZW50cmllc3x8ZDtpZihnJiYodT1mbihnLmNhbGwobmV3IHQpKSx5biE9PU9iamVjdC5wcm90b3R5cGUmJnUubmV4dCYmKGZyKHUsaCwhMCwhMCksYW5baF09RW4pKSxpPT1fbiYmZCYmZC5uYW1lIT09X24mJihwPSEwLHk9ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSksYSYmdlttbl0hPT15JiZxKHYsbW4seSksYW5bZV09eSxpKWlmKHM9e3ZhbHVlczpsKF9uKSxrZXlzOm8/eTpsKGJuKSxlbnRyaWVzOmwod24pfSxhKWZvcihjIGluIHMpKGdufHxwfHwhKGMgaW4gdikpJiZLZSh2LGMsc1tjXSk7ZWxzZSBYKHt0YXJnZXQ6ZSxwcm90bzohMCxmb3JjZWQ6Z258fHB9LHMpO3JldHVybiBzfSxUbj1cIkFycmF5IEl0ZXJhdG9yXCIsU249VHIuc2V0LHhuPVRyLmdldHRlckZvcihUbik7T24oQXJyYXksXCJBcnJheVwiLChmdW5jdGlvbih0LGUpe1NuKHRoaXMse3R5cGU6VG4sdGFyZ2V0OnkodCksaW5kZXg6MCxraW5kOmV9KX0pLChmdW5jdGlvbigpe3ZhciB0PXhuKHRoaXMpLGU9dC50YXJnZXQscj10LmtpbmQsbj10LmluZGV4Kys7cmV0dXJuIWV8fG4+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6XCJrZXlzXCI9PXI/e3ZhbHVlOm4sZG9uZTohMX06XCJ2YWx1ZXNcIj09cj97dmFsdWU6ZVtuXSxkb25lOiExfTp7dmFsdWU6W24sZVtuXV0sZG9uZTohMX19KSxcInZhbHVlc1wiKTthbi5Bcmd1bWVudHM9YW4uQXJyYXk7dmFyIGtuPWZ0KFwidG9TdHJpbmdUYWdcIik7Zm9yKHZhciBBbiBpbntDU1NSdWxlTGlzdDowLENTU1N0eWxlRGVjbGFyYXRpb246MCxDU1NWYWx1ZUxpc3Q6MCxDbGllbnRSZWN0TGlzdDowLERPTVJlY3RMaXN0OjAsRE9NU3RyaW5nTGlzdDowLERPTVRva2VuTGlzdDoxLERhdGFUcmFuc2Zlckl0ZW1MaXN0OjAsRmlsZUxpc3Q6MCxIVE1MQWxsQ29sbGVjdGlvbjowLEhUTUxDb2xsZWN0aW9uOjAsSFRNTEZvcm1FbGVtZW50OjAsSFRNTFNlbGVjdEVsZW1lbnQ6MCxNZWRpYUxpc3Q6MCxNaW1lVHlwZUFycmF5OjAsTmFtZWROb2RlTWFwOjAsTm9kZUxpc3Q6MSxQYWludFJlcXVlc3RMaXN0OjAsUGx1Z2luOjAsUGx1Z2luQXJyYXk6MCxTVkdMZW5ndGhMaXN0OjAsU1ZHTnVtYmVyTGlzdDowLFNWR1BhdGhTZWdMaXN0OjAsU1ZHUG9pbnRMaXN0OjAsU1ZHU3RyaW5nTGlzdDowLFNWR1RyYW5zZm9ybUxpc3Q6MCxTb3VyY2VCdWZmZXJMaXN0OjAsU3R5bGVTaGVldExpc3Q6MCxUZXh0VHJhY2tDdWVMaXN0OjAsVGV4dFRyYWNrTGlzdDowLFRvdWNoTGlzdDowfSl7dmFyIGpuPWlbQW5dLEluPWpuJiZqbi5wcm90b3R5cGU7SW4mJmFyKEluKSE9PWtuJiZxKEluLGtuLEFuKSxhbltBbl09YW4uQXJyYXl9dmFyIFBuPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLHIpe3ZhciBuLGksbz1TdHJpbmcoZChlKSksYT1IKHIpLHU9by5sZW5ndGg7cmV0dXJuIGE8MHx8YT49dT90P1wiXCI6dm9pZCAwOihuPW8uY2hhckNvZGVBdChhKSk8NTUyOTZ8fG4+NTYzMTl8fGErMT09PXV8fChpPW8uY2hhckNvZGVBdChhKzEpKTw1NjMyMHx8aT41NzM0Mz90P28uY2hhckF0KGEpOm46dD9vLnNsaWNlKGEsYSsyKTppLTU2MzIwKyhuLTU1Mjk2PDwxMCkrNjU1MzZ9fSxEbj17Y29kZUF0OlBuKCExKSxjaGFyQXQ6UG4oITApfS5jaGFyQXQsTG49XCJTdHJpbmcgSXRlcmF0b3JcIixDbj1Uci5zZXQsUm49VHIuZ2V0dGVyRm9yKExuKTtPbihTdHJpbmcsXCJTdHJpbmdcIiwoZnVuY3Rpb24odCl7Q24odGhpcyx7dHlwZTpMbixzdHJpbmc6U3RyaW5nKHQpLGluZGV4OjB9KX0pLChmdW5jdGlvbigpe3ZhciB0LGU9Um4odGhpcykscj1lLnN0cmluZyxuPWUuaW5kZXg7cmV0dXJuIG4+PXIubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9RG4ocixuKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KSk7dmFyIE1uPWZ0KFwiaXRlcmF0b3JcIiksTm49ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtNbl18fHRbXCJAQGl0ZXJhdG9yXCJdfHxhblthcih0KV19LEZuPWZ1bmN0aW9uKHQpe3ZhciBlPU5uKHQpO2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KStcIiBpcyBub3QgaXRlcmFibGVcIik7cmV0dXJuIE4oZS5jYWxsKHQpKX0sem49Tm4scW49ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXR1cm47aWYodm9pZCAwIT09ZSlyZXR1cm4gTihlLmNhbGwodCkpLnZhbHVlfSxZbj1mdW5jdGlvbih0LGUscixuKXt0cnl7cmV0dXJuIG4/ZShOKHIpWzBdLHJbMV0pOmUocil9Y2F0Y2goZSl7dGhyb3cgcW4odCksZX19LFVuPWZ0KFwiaXRlcmF0b3JcIiksWG49QXJyYXkucHJvdG90eXBlLFZuPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10JiYoYW4uQXJyYXk9PT10fHxYbltVbl09PT10KX0sV249ZnQoXCJpdGVyYXRvclwiKSxHbj0hMTt0cnl7dmFyIEhuPTAsJG49e25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTohIUhuKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtHbj0hMH19OyRuW1duXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKCRuLChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2godCl7fXZhciBKbj0hZnVuY3Rpb24odCxlKXtpZighZSYmIUduKXJldHVybiExO3ZhciByPSExO3RyeXt2YXIgbj17fTtuW1duXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6cj0hMH19fX0sdChuKX1jYXRjaCh0KXt9cmV0dXJuIHJ9KChmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSkpO1goe3RhcmdldDpcIkFycmF5XCIsc3RhdDohMCxmb3JjZWQ6Sm59LHtmcm9tOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYSx1PUsodCkscz1cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksYz1hcmd1bWVudHMubGVuZ3RoLGY9Yz4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsbD12b2lkIDAhPT1mLGg9Tm4odSkscD0wO2lmKGwmJihmPU0oZixjPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09aHx8cz09QXJyYXkmJlZuKGgpKWZvcihyPW5ldyBzKGU9Sih1Lmxlbmd0aCkpO2U+cDtwKyspYT1sP2YodVtwXSxwKTp1W3BdLENlKHIscCxhKTtlbHNlIGZvcihvPShpPWguY2FsbCh1KSkubmV4dCxyPW5ldyBzOyEobj1vLmNhbGwoaSkpLmRvbmU7cCsrKWE9bD9ZbihpLGYsW24udmFsdWUscF0sITApOm4udmFsdWUsQ2UocixwLGEpO3JldHVybiByLmxlbmd0aD1wLHJ9fSk7dmFyIFFuPUMuQXJyYXkuZnJvbSxCbj1RbjtYKHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwfSx7ZmlsbDpmdW5jdGlvbih0KXtmb3IodmFyIGU9Syh0aGlzKSxyPUooZS5sZW5ndGgpLG49YXJndW1lbnRzLmxlbmd0aCxpPV9lKG4+MT9hcmd1bWVudHNbMV06dm9pZCAwLHIpLG89bj4yP2FyZ3VtZW50c1syXTp2b2lkIDAsYT12b2lkIDA9PT1vP3I6X2UobyxyKTthPmk7KWVbaSsrXT10O3JldHVybiBlfX0pO2R0KFwiQXJyYXlcIikuZmlsbDt2YXIgS249W10uc2xpY2UsWm49L01TSUUgLlxcLi8udGVzdChUdCksdGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yLGk9bj9Lbi5jYWxsKGFyZ3VtZW50cywyKTp2b2lkIDA7cmV0dXJuIHQobj9mdW5jdGlvbigpeyhcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHRoaXMsaSl9OmUscil9fTtYKHtnbG9iYWw6ITAsYmluZDohMCxmb3JjZWQ6Wm59LHtzZXRUaW1lb3V0OnRpKGkuc2V0VGltZW91dCksc2V0SW50ZXJ2YWw6dGkoaS5zZXRJbnRlcnZhbCl9KTt2YXIgZWk9Qy5zZXRUaW1lb3V0LHJpPU90KFwiSlNPTlwiLFwic3RyaW5naWZ5XCIpLG5pPS9bXFx1RDgwMC1cXHVERkZGXS9nLGlpPS9eW1xcdUQ4MDAtXFx1REJGRl0kLyxvaT0vXltcXHVEQzAwLVxcdURGRkZdJC8sYWk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXIuY2hhckF0KGUtMSksaT1yLmNoYXJBdChlKzEpO3JldHVybiBpaS50ZXN0KHQpJiYhb2kudGVzdChpKXx8b2kudGVzdCh0KSYmIWlpLnRlc3Qobik/XCJcXFxcdVwiK3QuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik6dH0sdWk9bygoZnVuY3Rpb24oKXtyZXR1cm4nXCJcXFxcdWRmMDZcXFxcdWQ4MzRcIichPT1yaShcIlxcdWRmMDZcXHVkODM0XCIpfHwnXCJcXFxcdWRlYWRcIichPT1yaShcIlxcdWRlYWRcIil9KSk7cmkmJlgoe3RhcmdldDpcIkpTT05cIixzdGF0OiEwLGZvcmNlZDp1aX0se3N0cmluZ2lmeTpmdW5jdGlvbih0LGUscil7dmFyIG49cmkuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBuP24ucmVwbGFjZShuaSxhaSk6bn19KSxDLkpTT058fChDLkpTT049e3N0cmluZ2lmeTpKU09OLnN0cmluZ2lmeX0pO3ZhciBzaT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEMuSlNPTi5zdHJpbmdpZnkuYXBwbHkobnVsbCxhcmd1bWVudHMpfTtYKHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwLHNoYW06IWF9LHtjcmVhdGU6SGV9KTt2YXIgY2k9Qy5PYmplY3QsZmk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gY2kuY3JlYXRlKHQsZSl9LGxpPWZpO3ZhciBoaSxwaT1mdW5jdGlvbih0LGUscil7cmV0dXJuIGUgaW4gdD9oZSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPXIsdH0sdmk9XCJcXHRcXG5cXHZcXGZcXHIgwqDhmoDigIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK/igZ/jgIBcXHUyMDI4XFx1MjAyOVxcdWZlZmZcIixkaT1cIltcIit2aStcIl1cIix5aT1SZWdFeHAoXCJeXCIrZGkrZGkrXCIqXCIpLGdpPVJlZ0V4cChkaStkaStcIiokXCIpLG1pPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1TdHJpbmcoZChlKSk7cmV0dXJuIDEmdCYmKHI9ci5yZXBsYWNlKHlpLFwiXCIpKSwyJnQmJihyPXIucmVwbGFjZShnaSxcIlwiKSkscn19LGJpPXtzdGFydDptaSgxKSxlbmQ6bWkoMiksdHJpbTptaSgzKX0sX2k9YmkudHJpbTtYKHt0YXJnZXQ6XCJTdHJpbmdcIixwcm90bzohMCxmb3JjZWQ6KGhpPVwidHJpbVwiLG8oKGZ1bmN0aW9uKCl7cmV0dXJuISF2aVtoaV0oKXx8XCLigIvCheGgjlwiIT1cIuKAi8KF4aCOXCJbaGldKCl8fHZpW2hpXS5uYW1lIT09aGl9KSkpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBfaSh0aGlzKX19KTtkdChcIlN0cmluZ1wiKS50cmltO3ZhciB3aT1FZS5pbmRleE9mLEVpPVtdLmluZGV4T2YsT2k9ISFFaSYmMS9bMV0uaW5kZXhPZigxLC0wKTwwLFRpPUp0KFwiaW5kZXhPZlwiKSxTaT1DdChcImluZGV4T2ZcIix7QUNDRVNTT1JTOiEwLDE6MH0pO1goe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITAsZm9yY2VkOk9pfHwhVGl8fCFTaX0se2luZGV4T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIE9pP0VpLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MDp3aSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pO2R0KFwiQXJyYXlcIikuaW5kZXhPZjt2YXIgeGk9YmkudHJpbSxraT1pLnBhcnNlSW50LEFpPS9eWystXT8wW1h4XS8samk9OCE9PWtpKHZpK1wiMDhcIil8fDIyIT09a2kodmkrXCIweDE2XCIpP2Z1bmN0aW9uKHQsZSl7dmFyIHI9eGkoU3RyaW5nKHQpKTtyZXR1cm4ga2kocixlPj4+MHx8KEFpLnRlc3Qocik/MTY6MTApKX06a2k7WCh7Z2xvYmFsOiEwLGZvcmNlZDpwYXJzZUludCE9aml9LHtwYXJzZUludDpqaX0pO3ZhciBJaT1jLmYsUGk9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcixuPXkoZSksaT1rZShuKSxvPWkubGVuZ3RoLHU9MCxzPVtdO28+dTspcj1pW3UrK10sYSYmIUlpLmNhbGwobixyKXx8cy5wdXNoKHQ/W3IsbltyXV06bltyXSk7cmV0dXJuIHN9fSxEaT17ZW50cmllczpQaSghMCksdmFsdWVzOlBpKCExKX0udmFsdWVzO1goe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITB9LHt2YWx1ZXM6ZnVuY3Rpb24odCl7cmV0dXJuIERpKHQpfX0pO0MuT2JqZWN0LnZhbHVlczt2YXIgTGk9bygoZnVuY3Rpb24oKXtmbigxKX0pKTtYKHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwLGZvcmNlZDpMaSxzaGFtOiF1bn0se2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiBmbihLKHQpKX19KTt2YXIgQ2k9Qy5PYmplY3QuZ2V0UHJvdG90eXBlT2YsUmk9RWUuaW5jbHVkZXMsTWk9Q3QoXCJpbmRleE9mXCIse0FDQ0VTU09SUzohMCwxOjB9KTtYKHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDohTWl9LHtpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gUmkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTtkdChcIkFycmF5XCIpLmluY2x1ZGVzO3ZhciBOaT1mdChcIm1hdGNoXCIpLEZpPWZ1bmN0aW9uKHQpe2lmKGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBnKHQpJiYodm9pZCAwIT09KGU9dFtOaV0pPyEhZTpcIlJlZ0V4cFwiPT1oKHQpKX0odCkpdGhyb3cgVHlwZUVycm9yKFwiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zXCIpO3JldHVybiB0fSx6aT1mdChcIm1hdGNoXCIpO1goe3RhcmdldDpcIlN0cmluZ1wiLHByb3RvOiEwLGZvcmNlZDohZnVuY3Rpb24odCl7dmFyIGU9Ly4vO3RyeXtcIi8uL1wiW3RdKGUpfWNhdGNoKHIpe3RyeXtyZXR1cm4gZVt6aV09ITEsXCIvLi9cIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfShcImluY2x1ZGVzXCIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF+U3RyaW5nKGQodGhpcykpLmluZGV4T2YoRmkodCksYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pO2R0KFwiU3RyaW5nXCIpLmluY2x1ZGVzO3ZhciBxaT1PYmplY3QuYXNzaWduLFlpPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxVaT0hcWl8fG8oKGZ1bmN0aW9uKCl7aWYoYSYmMSE9PXFpKHtiOjF9LHFpKFlpKHt9LFwiYVwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe1lpKHRoaXMsXCJiXCIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgdD17fSxlPXt9LHI9U3ltYm9sKCksbj1cImFiY2RlZmdoaWprbG1ub3BxcnN0XCI7cmV0dXJuIHRbcl09NyxuLnNwbGl0KFwiXCIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbdF09dH0pKSw3IT1xaSh7fSx0KVtyXXx8a2UocWkoe30sZSkpLmpvaW4oXCJcIikhPW59KSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9Syh0KSxuPWFyZ3VtZW50cy5sZW5ndGgsaT0xLG89RGUuZix1PWMuZjtuPmk7KWZvcih2YXIgcyxmPXYoYXJndW1lbnRzW2krK10pLGw9bz9rZShmKS5jb25jYXQobyhmKSk6a2UoZiksaD1sLmxlbmd0aCxwPTA7aD5wOylzPWxbcCsrXSxhJiYhdS5jYWxsKGYscyl8fChyW3NdPWZbc10pO3JldHVybiByfTpxaTtYKHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09VWl9LHthc3NpZ246VWl9KTt2YXIgWGk9Qy5PYmplY3QuYXNzaWduLFZpPUl0KFwic3BsaWNlXCIpLFdpPUN0KFwic3BsaWNlXCIse0FDQ0VTU09SUzohMCwwOjAsMToyfSksR2k9TWF0aC5tYXgsSGk9TWF0aC5taW4sJGk9OTAwNzE5OTI1NDc0MDk5MSxKaT1cIk1heGltdW0gYWxsb3dlZCBsZW5ndGggZXhjZWVkZWRcIjtYKHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDohVml8fCFXaX0se3NwbGljZTpmdW5jdGlvbih0LGUpe3ZhciByLG4saSxvLGEsdSxzPUsodGhpcyksYz1KKHMubGVuZ3RoKSxmPV9lKHQsYyksbD1hcmd1bWVudHMubGVuZ3RoO2lmKDA9PT1sP3I9bj0wOjE9PT1sPyhyPTAsbj1jLWYpOihyPWwtMixuPUhpKEdpKEgoZSksMCksYy1mKSksYytyLW4+JGkpdGhyb3cgVHlwZUVycm9yKEppKTtmb3IoaT1odChzLG4pLG89MDtvPG47bysrKShhPWYrbylpbiBzJiZDZShpLG8sc1thXSk7aWYoaS5sZW5ndGg9bixyPG4pe2ZvcihvPWY7bzxjLW47bysrKXU9bytyLChhPW8rbilpbiBzP3NbdV09c1thXTpkZWxldGUgc1t1XTtmb3Iobz1jO28+Yy1uK3I7by0tKWRlbGV0ZSBzW28tMV19ZWxzZSBpZihyPm4pZm9yKG89Yy1uO28+ZjtvLS0pdT1vK3ItMSwoYT1vK24tMSlpbiBzP3NbdV09c1thXTpkZWxldGUgc1t1XTtmb3Iobz0wO288cjtvKyspc1tvK2ZdPWFyZ3VtZW50c1tvKzJdO3JldHVybiBzLmxlbmd0aD1jLW4rcixpfX0pO3ZhciBRaT1kdChcIkFycmF5XCIpLnNwbGljZSxCaT1BcnJheS5wcm90b3R5cGUsS2k9ZnVuY3Rpb24odCl7dmFyIGU9dC5zcGxpY2U7cmV0dXJuIHQ9PT1CaXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09Qmkuc3BsaWNlP1FpOmV9LFppPVtdLnJldmVyc2UsdG89WzEsMl07WCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6U3RyaW5nKHRvKT09PVN0cmluZyh0by5yZXZlcnNlKCkpfSx7cmV2ZXJzZTpmdW5jdGlvbigpe3JldHVybiBWKHRoaXMpJiYodGhpcy5sZW5ndGg9dGhpcy5sZW5ndGgpLFppLmNhbGwodGhpcyl9fSk7dmFyIGVvPWR0KFwiQXJyYXlcIikucmV2ZXJzZSxybz1BcnJheS5wcm90b3R5cGUsbm89ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXZlcnNlO3JldHVybiB0PT09cm98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PXJvLnJldmVyc2U/ZW86ZX0saW89d3QuZm9yRWFjaCxvbz1KdChcImZvckVhY2hcIiksYW89Q3QoXCJmb3JFYWNoXCIpLHVvPW9vJiZhbz9bXS5mb3JFYWNoOmZ1bmN0aW9uKHQpe3JldHVybiBpbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfTtYKHt0YXJnZXQ6XCJBcnJheVwiLHByb3RvOiEwLGZvcmNlZDpbXS5mb3JFYWNoIT11b30se2ZvckVhY2g6dW99KTt2YXIgc289ZHQoXCJBcnJheVwiKS5mb3JFYWNoLGNvPUFycmF5LnByb3RvdHlwZSxmbz17RE9NVG9rZW5MaXN0OiEwLE5vZGVMaXN0OiEwfSxsbz1mdW5jdGlvbih0KXt2YXIgZT10LmZvckVhY2g7cmV0dXJuIHQ9PT1jb3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09Y28uZm9yRWFjaHx8Zm8uaGFzT3duUHJvcGVydHkoYXIodCkpP3NvOmV9O1goe3RhcmdldDpcIkFycmF5XCIsc3RhdDohMH0se2lzQXJyYXk6Vn0pO3ZhciBobz1DLkFycmF5LmlzQXJyYXkscG89aG87dmFyIHZvPWZ1bmN0aW9uKHQpe2lmKHBvKHQpKXJldHVybiB0fSx5bz1mdChcIml0ZXJhdG9yXCIpLGdvPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVt5b118fFwiQEBpdGVyYXRvclwiaW4gZXx8YW4uaGFzT3duUHJvcGVydHkoYXIoZSkpfSxtbz1mdChcImlzQ29uY2F0U3ByZWFkYWJsZVwiKSxibz05MDA3MTk5MjU0NzQwOTkxLF9vPVwiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkXCIsd289QXQ+PTUxfHwhbygoZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFttb109ITEsdC5jb25jYXQoKVswXSE9PXR9KSksRW89SXQoXCJjb25jYXRcIiksT289ZnVuY3Rpb24odCl7aWYoIWcodCkpcmV0dXJuITE7dmFyIGU9dFttb107cmV0dXJuIHZvaWQgMCE9PWU/ISFlOlYodCl9O1goe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITAsZm9yY2VkOiF3b3x8IUVvfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLG8sYT1LKHRoaXMpLHU9aHQoYSwwKSxzPTA7Zm9yKGU9LTEsbj1hcmd1bWVudHMubGVuZ3RoO2U8bjtlKyspaWYoT28obz0tMT09PWU/YTphcmd1bWVudHNbZV0pKXtpZihzKyhpPUooby5sZW5ndGgpKT5ibyl0aHJvdyBUeXBlRXJyb3IoX28pO2ZvcihyPTA7cjxpO3IrKyxzKyspciBpbiBvJiZDZSh1LHMsb1tyXSl9ZWxzZXtpZihzPj1ibyl0aHJvdyBUeXBlRXJyb3IoX28pO0NlKHUscysrLG8pfXJldHVybiB1Lmxlbmd0aD1zLHV9fSksZXIoXCJhc3luY0l0ZXJhdG9yXCIpLGVyKFwiaGFzSW5zdGFuY2VcIiksZXIoXCJpc0NvbmNhdFNwcmVhZGFibGVcIiksZXIoXCJpdGVyYXRvclwiKSxlcihcIm1hdGNoXCIpLGVyKFwibWF0Y2hBbGxcIiksZXIoXCJyZXBsYWNlXCIpLGVyKFwic2VhcmNoXCIpLGVyKFwic3BlY2llc1wiKSxlcihcInNwbGl0XCIpLGVyKFwidG9QcmltaXRpdmVcIiksZXIoXCJ0b1N0cmluZ1RhZ1wiKSxlcihcInVuc2NvcGFibGVzXCIpLGZyKGkuSlNPTixcIkpTT05cIiwhMCk7dmFyIFRvPUMuU3ltYm9sO2VyKFwiYXN5bmNEaXNwb3NlXCIpLGVyKFwiZGlzcG9zZVwiKSxlcihcIm9ic2VydmFibGVcIiksZXIoXCJwYXR0ZXJuTWF0Y2hcIiksZXIoXCJyZXBsYWNlQWxsXCIpO3ZhciBTbz1Ubzt2YXIgeG89ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1TbyYmZ28oT2JqZWN0KHQpKSl7dmFyIHI9W10sbj0hMCxpPSExLG89dm9pZCAwO3RyeXtmb3IodmFyIGEsdT1Gbih0KTshKG49KGE9dS5uZXh0KCkpLmRvbmUpJiYoci5wdXNoKGEudmFsdWUpLCFlfHxyLmxlbmd0aCE9PWUpO249ITApO31jYXRjaCh0KXtpPSEwLG89dH1maW5hbGx5e3RyeXtufHxudWxsPT11LnJldHVybnx8dS5yZXR1cm4oKX1maW5hbGx5e2lmKGkpdGhyb3cgb319cmV0dXJuIHJ9fSxrbz1RbixBbz1JdChcInNsaWNlXCIpLGpvPUN0KFwic2xpY2VcIix7QUNDRVNTT1JTOiEwLDA6MCwxOjJ9KSxJbz1mdChcInNwZWNpZXNcIiksUG89W10uc2xpY2UsRG89TWF0aC5tYXg7WCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6IUFvfHwham99LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciByLG4saSxvPXkodGhpcyksYT1KKG8ubGVuZ3RoKSx1PV9lKHQsYSkscz1fZSh2b2lkIDA9PT1lP2E6ZSxhKTtpZihWKG8pJiYoXCJmdW5jdGlvblwiIT10eXBlb2Yocj1vLmNvbnN0cnVjdG9yKXx8ciE9PUFycmF5JiYhVihyLnByb3RvdHlwZSk/ZyhyKSYmbnVsbD09PShyPXJbSW9dKSYmKHI9dm9pZCAwKTpyPXZvaWQgMCxyPT09QXJyYXl8fHZvaWQgMD09PXIpKXJldHVybiBQby5jYWxsKG8sdSxzKTtmb3Iobj1uZXcodm9pZCAwPT09cj9BcnJheTpyKShEbyhzLXUsMCkpLGk9MDt1PHM7dSsrLGkrKyl1IGluIG8mJkNlKG4saSxvW3VdKTtyZXR1cm4gbi5sZW5ndGg9aSxufX0pO3ZhciBMbz1kdChcIkFycmF5XCIpLnNsaWNlLENvPUFycmF5LnByb3RvdHlwZSxSbz1mdW5jdGlvbih0KXt2YXIgZT10LnNsaWNlO3JldHVybiB0PT09Q298fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PUNvLnNsaWNlP0xvOmV9LE1vPVJvO3ZhciBObz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgcj0wLG49bmV3IEFycmF5KGUpO3I8ZTtyKyspbltyXT10W3JdO3JldHVybiBufTt2YXIgRm89ZnVuY3Rpb24odCxlKXt2YXIgcjtpZih0KXtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gTm8odCxlKTt2YXIgbj1NbyhyPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChyLDgsLTEpO3JldHVyblwiT2JqZWN0XCI9PT1uJiZ0LmNvbnN0cnVjdG9yJiYobj10LmNvbnN0cnVjdG9yLm5hbWUpLFwiTWFwXCI9PT1ufHxcIlNldFwiPT09bj9rbyh0KTpcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/Tm8odCxlKTp2b2lkIDB9fTt2YXIgem89ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfTt2YXIgcW89ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm8odCl8fHhvKHQsZSl8fEZvKHQsZSl8fHpvKCl9O1goe3RhcmdldDpcIkRhdGVcIixzdGF0OiEwfSx7bm93OmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9fSk7Qy5EYXRlLm5vdzt2YXIgWW89bygoZnVuY3Rpb24oKXtrZSgxKX0pKTtYKHt0YXJnZXQ6XCJPYmplY3RcIixzdGF0OiEwLGZvcmNlZDpZb30se2tleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGtlKEsodCkpfX0pO3ZhciBVbz1DLk9iamVjdC5rZXlzLFhvPWhvLFZvPVplLmYoXCJpdGVyYXRvclwiKSxXbz1WbyxHbz1yKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIpe3JldHVybiB0LmV4cG9ydHM9ZT1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTbyYmXCJzeW1ib2xcIj09dHlwZW9mIFdvP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIFNvJiZ0LmNvbnN0cnVjdG9yPT09U28mJnQhPT1Tby5wcm90b3R5cGU/XCJzeW1ib2xcIjp0eXBlb2YgdH0sZShyKX10LmV4cG9ydHM9ZX0pKTtYKHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMH0se293bktleXM6TGV9KTt2YXIgSG89Qy5SZWZsZWN0Lm93bktleXMsJG89Um87dmFyIEpvPWZ1bmN0aW9uKHQpe2lmKHBvKHQpKXJldHVybiBObyh0KX07dmFyIFFvPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PVNvJiZnbyhPYmplY3QodCkpKXJldHVybiBrbyh0KX07dmFyIEJvPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxcbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5cIil9O3ZhciBLbz1mdW5jdGlvbih0KXtyZXR1cm4gSm8odCl8fFFvKHQpfHxGbyh0KXx8Qm8oKX0sWm89ZHQoXCJBcnJheVwiKS5jb25jYXQsdGE9QXJyYXkucHJvdG90eXBlLGVhPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY29uY2F0O3JldHVybiB0PT09dGF8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PXRhLmNvbmNhdD9abzplfSxyYT1UbyxuYT1yKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2lmKHQpcmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiBlLnByb3RvdHlwZSl0W3JdPWUucHJvdG90eXBlW3JdO3JldHVybiB0fSh0KX10LmV4cG9ydHM9ZSxlLnByb3RvdHlwZS5vbj1lLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbXCIkXCIrdF09dGhpcy5fY2FsbGJhY2tzW1wiJFwiK3RdfHxbXSkucHVzaChlKSx0aGlzfSxlLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMub2ZmKHQsciksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHIuZm49ZSx0aGlzLm9uKHQsciksdGhpc30sZS5wcm90b3R5cGUub2ZmPWUucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWUucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1lLnByb3RvdHlwZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30sMD09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXt9LHRoaXM7dmFyIHIsbj10aGlzLl9jYWxsYmFja3NbXCIkXCIrdF07aWYoIW4pcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tcIiRcIit0XSx0aGlzO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKWlmKChyPW5baV0pPT09ZXx8ci5mbj09PWUpe24uc3BsaWNlKGksMSk7YnJlYWt9cmV0dXJuIDA9PT1uLmxlbmd0aCYmZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1tcIiRcIit0XSx0aGlzfSxlLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9O2Zvcih2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKSxyPXRoaXMuX2NhbGxiYWNrc1tcIiRcIit0XSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO2lmKHIpe249MDtmb3IodmFyIGk9KHI9ci5zbGljZSgwKSkubGVuZ3RoO248aTsrK24pcltuXS5hcHBseSh0aGlzLGUpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LHRoaXMuX2NhbGxiYWNrc1tcIiRcIit0XXx8W119LGUucHJvdG90eXBlLmhhc0xpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMubGlzdGVuZXJzKHQpLmxlbmd0aH19KSk7XG4vKiEgSGFtbWVyLkpTIC0gdjIuMC4xNy1yYyAtIDIwMTktMTItMTZcblx0ICogaHR0cDovL25hdmVyLmdpdGh1Yi5pby9lZ2pzXG5cdCAqXG5cdCAqIEZvcmtlZCBCeSBOYXZlciBlZ2pzXG5cdCAqIENvcHlyaWdodCAoYykgaGFtbWVyanNcblx0ICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlICovXG5mdW5jdGlvbiBpYSgpe3JldHVybihpYT1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgcj1hcmd1bWVudHNbZV07Zm9yKHZhciBuIGluIHIpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHIsbikmJih0W25dPXJbbl0pfXJldHVybiB0fSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIG9hKHQsZSl7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0Ll9fcHJvdG9fXz1lfWZ1bmN0aW9uIGFhKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO3JldHVybiB0fXZhciB1YSxzYT1cImZ1bmN0aW9uXCIhPXR5cGVvZiBPYmplY3QuYXNzaWduP2Z1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtmb3IodmFyIGU9T2JqZWN0KHQpLHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXt2YXIgbj1hcmd1bWVudHNbcl07aWYobnVsbCE9bilmb3IodmFyIGkgaW4gbiluLmhhc093blByb3BlcnR5KGkpJiYoZVtpXT1uW2ldKX1yZXR1cm4gZX06T2JqZWN0LmFzc2lnbixjYT1bXCJcIixcIndlYmtpdFwiLFwiTW96XCIsXCJNU1wiLFwibXNcIixcIm9cIl0sZmE9XCJ1bmRlZmluZWRcIj09dHlwZW9mIGRvY3VtZW50P3tzdHlsZTp7fX06ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxsYT1NYXRoLnJvdW5kLGhhPU1hdGguYWJzLHBhPURhdGUubm93O2Z1bmN0aW9uIHZhKHQsZSl7Zm9yKHZhciByLG4saT1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxvPTA7bzxjYS5sZW5ndGg7KXtpZigobj0ocj1jYVtvXSk/citpOmUpaW4gdClyZXR1cm4gbjtvKyt9fXVhPVwidW5kZWZpbmVkXCI9PXR5cGVvZiB3aW5kb3c/e306d2luZG93O3ZhciBkYT12YShmYS5zdHlsZSxcInRvdWNoQWN0aW9uXCIpLHlhPXZvaWQgMCE9PWRhO3ZhciBnYT1cImNvbXB1dGVcIixtYT1cImF1dG9cIixiYT1cIm1hbmlwdWxhdGlvblwiLF9hPVwibm9uZVwiLHdhPVwicGFuLXhcIixFYT1cInBhbi15XCIsT2E9ZnVuY3Rpb24oKXtpZigheWEpcmV0dXJuITE7dmFyIHQ9e30sZT11YS5DU1MmJnVhLkNTUy5zdXBwb3J0cztyZXR1cm5bXCJhdXRvXCIsXCJtYW5pcHVsYXRpb25cIixcInBhbi15XCIsXCJwYW4teFwiLFwicGFuLXggcGFuLXlcIixcIm5vbmVcIl0uZm9yRWFjaCgoZnVuY3Rpb24ocil7cmV0dXJuIHRbcl09IWV8fHVhLkNTUy5zdXBwb3J0cyhcInRvdWNoLWFjdGlvblwiLHIpfSkpLHR9KCksVGE9XCJvbnRvdWNoc3RhcnRcImluIHVhLFNhPXZvaWQgMCE9PXZhKHVhLFwiUG9pbnRlckV2ZW50XCIpLHhhPVRhJiYvbW9iaWxlfHRhYmxldHxpcChhZHxob25lfG9kKXxhbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxrYT1cInRvdWNoXCIsQWE9XCJtb3VzZVwiLGphPTE2LElhPTI0LFBhPVtcInhcIixcInlcIl0sRGE9W1wiY2xpZW50WFwiLFwiY2xpZW50WVwiXTtmdW5jdGlvbiBMYSh0LGUscil7dmFyIG47aWYodClpZih0LmZvckVhY2gpdC5mb3JFYWNoKGUscik7ZWxzZSBpZih2b2lkIDAhPT10Lmxlbmd0aClmb3Iobj0wO248dC5sZW5ndGg7KWUuY2FsbChyLHRbbl0sbix0KSxuKys7ZWxzZSBmb3IobiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmUuY2FsbChyLHRbbl0sbix0KX1mdW5jdGlvbiBDYSh0LGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5hcHBseShlJiZlWzBdfHx2b2lkIDAsZSk6dH1mdW5jdGlvbiBSYSh0LGUpe3JldHVybiB0LmluZGV4T2YoZSk+LTF9dmFyIE1hPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMubWFuYWdlcj10LHRoaXMuc2V0KGUpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLnNldD1mdW5jdGlvbih0KXt0PT09Z2EmJih0PXRoaXMuY29tcHV0ZSgpKSx5YSYmdGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGUmJk9hW3RdJiYodGhpcy5tYW5hZ2VyLmVsZW1lbnQuc3R5bGVbZGFdPXQpLHRoaXMuYWN0aW9ucz10LnRvTG93ZXJDYXNlKCkudHJpbSgpfSxlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuc2V0KHRoaXMubWFuYWdlci5vcHRpb25zLnRvdWNoQWN0aW9uKX0sZS5jb21wdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIExhKHRoaXMubWFuYWdlci5yZWNvZ25pemVycywoZnVuY3Rpb24oZSl7Q2EoZS5vcHRpb25zLmVuYWJsZSxbZV0pJiYodD10LmNvbmNhdChlLmdldFRvdWNoQWN0aW9uKCkpKX0pKSxmdW5jdGlvbih0KXtpZihSYSh0LF9hKSlyZXR1cm4gX2E7dmFyIGU9UmEodCx3YSkscj1SYSh0LEVhKTtyZXR1cm4gZSYmcj9fYTplfHxyP2U/d2E6RWE6UmEodCxiYSk/YmE6bWF9KHQuam9pbihcIiBcIikpfSxlLnByZXZlbnREZWZhdWx0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNyY0V2ZW50LHI9dC5vZmZzZXREaXJlY3Rpb247aWYodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKWUucHJldmVudERlZmF1bHQoKTtlbHNle3ZhciBuPXRoaXMuYWN0aW9ucyxpPVJhKG4sX2EpJiYhT2Eubm9uZSxvPVJhKG4sRWEpJiYhT2FbXCJwYW4teVwiXSxhPVJhKG4sd2EpJiYhT2FbXCJwYW4teFwiXTtpZihpKXt2YXIgdT0xPT09dC5wb2ludGVycy5sZW5ndGgscz10LmRpc3RhbmNlPDIsYz10LmRlbHRhVGltZTwyNTA7aWYodSYmcyYmYylyZXR1cm59aWYoIWF8fCFvKXJldHVybiBpfHxvJiY2JnJ8fGEmJnImSWE/dGhpcy5wcmV2ZW50U3JjKGUpOnZvaWQgMH19LGUucHJldmVudFNyYz1mdW5jdGlvbih0KXt0aGlzLm1hbmFnZXIuc2Vzc2lvbi5wcmV2ZW50ZWQ9ITAsdC5wcmV2ZW50RGVmYXVsdCgpfSx0fSgpO2Z1bmN0aW9uIE5hKHQsZSl7Zm9yKDt0Oyl7aWYodD09PWUpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gRmEodCl7dmFyIGU9dC5sZW5ndGg7aWYoMT09PWUpcmV0dXJue3g6bGEodFswXS5jbGllbnRYKSx5OmxhKHRbMF0uY2xpZW50WSl9O2Zvcih2YXIgcj0wLG49MCxpPTA7aTxlOylyKz10W2ldLmNsaWVudFgsbis9dFtpXS5jbGllbnRZLGkrKztyZXR1cm57eDpsYShyL2UpLHk6bGEobi9lKX19ZnVuY3Rpb24gemEodCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQucG9pbnRlcnMubGVuZ3RoOyllW3JdPXtjbGllbnRYOmxhKHQucG9pbnRlcnNbcl0uY2xpZW50WCksY2xpZW50WTpsYSh0LnBvaW50ZXJzW3JdLmNsaWVudFkpfSxyKys7cmV0dXJue3RpbWVTdGFtcDpwYSgpLHBvaW50ZXJzOmUsY2VudGVyOkZhKGUpLGRlbHRhWDp0LmRlbHRhWCxkZWx0YVk6dC5kZWx0YVl9fWZ1bmN0aW9uIHFhKHQsZSxyKXtyfHwocj1QYSk7dmFyIG49ZVtyWzBdXS10W3JbMF1dLGk9ZVtyWzFdXS10W3JbMV1dO3JldHVybiBNYXRoLnNxcnQobipuK2kqaSl9ZnVuY3Rpb24gWWEodCxlLHIpe3J8fChyPVBhKTt2YXIgbj1lW3JbMF1dLXRbclswXV0saT1lW3JbMV1dLXRbclsxXV07cmV0dXJuIDE4MCpNYXRoLmF0YW4yKGksbikvTWF0aC5QSX1mdW5jdGlvbiBVYSh0LGUpe3JldHVybiB0PT09ZT8xOmhhKHQpPj1oYShlKT90PDA/Mjo0OmU8MD84OmphfWZ1bmN0aW9uIFhhKHQsZSxyKXtyZXR1cm57eDplL3R8fDAseTpyL3R8fDB9fWZ1bmN0aW9uIFZhKHQsZSl7dmFyIHI9dC5zZXNzaW9uLG49ZS5wb2ludGVycyxpPW4ubGVuZ3RoO3IuZmlyc3RJbnB1dHx8KHIuZmlyc3RJbnB1dD16YShlKSksaT4xJiYhci5maXJzdE11bHRpcGxlP3IuZmlyc3RNdWx0aXBsZT16YShlKToxPT09aSYmKHIuZmlyc3RNdWx0aXBsZT0hMSk7dmFyIG89ci5maXJzdElucHV0LGE9ci5maXJzdE11bHRpcGxlLHU9YT9hLmNlbnRlcjpvLmNlbnRlcixzPWUuY2VudGVyPUZhKG4pO2UudGltZVN0YW1wPXBhKCksZS5kZWx0YVRpbWU9ZS50aW1lU3RhbXAtby50aW1lU3RhbXAsZS5hbmdsZT1ZYSh1LHMpLGUuZGlzdGFuY2U9cWEodSxzKSxmdW5jdGlvbih0LGUpe3ZhciByPWUuY2VudGVyLG49dC5vZmZzZXREZWx0YXx8e30saT10LnByZXZEZWx0YXx8e30sbz10LnByZXZJbnB1dHx8e307MSE9PWUuZXZlbnRUeXBlJiY0IT09by5ldmVudFR5cGV8fChpPXQucHJldkRlbHRhPXt4Om8uZGVsdGFYfHwwLHk6by5kZWx0YVl8fDB9LG49dC5vZmZzZXREZWx0YT17eDpyLngseTpyLnl9KSxlLmRlbHRhWD1pLngrKHIueC1uLngpLGUuZGVsdGFZPWkueSsoci55LW4ueSl9KHIsZSksZS5vZmZzZXREaXJlY3Rpb249VWEoZS5kZWx0YVgsZS5kZWx0YVkpO3ZhciBjLGYsbD1YYShlLmRlbHRhVGltZSxlLmRlbHRhWCxlLmRlbHRhWSk7ZS5vdmVyYWxsVmVsb2NpdHlYPWwueCxlLm92ZXJhbGxWZWxvY2l0eVk9bC55LGUub3ZlcmFsbFZlbG9jaXR5PWhhKGwueCk+aGEobC55KT9sLng6bC55LGUuc2NhbGU9YT8oYz1hLnBvaW50ZXJzLHFhKChmPW4pWzBdLGZbMV0sRGEpL3FhKGNbMF0sY1sxXSxEYSkpOjEsZS5yb3RhdGlvbj1hP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIFlhKGVbMV0sZVswXSxEYSkrWWEodFsxXSx0WzBdLERhKX0oYS5wb2ludGVycyxuKTowLGUubWF4UG9pbnRlcnM9ci5wcmV2SW5wdXQ/ZS5wb2ludGVycy5sZW5ndGg+ci5wcmV2SW5wdXQubWF4UG9pbnRlcnM/ZS5wb2ludGVycy5sZW5ndGg6ci5wcmV2SW5wdXQubWF4UG9pbnRlcnM6ZS5wb2ludGVycy5sZW5ndGgsZnVuY3Rpb24odCxlKXt2YXIgcixuLGksbyxhPXQubGFzdEludGVydmFsfHxlLHU9ZS50aW1lU3RhbXAtYS50aW1lU3RhbXA7aWYoOCE9PWUuZXZlbnRUeXBlJiYodT4yNXx8dm9pZCAwPT09YS52ZWxvY2l0eSkpe3ZhciBzPWUuZGVsdGFYLWEuZGVsdGFYLGM9ZS5kZWx0YVktYS5kZWx0YVksZj1YYSh1LHMsYyk7bj1mLngsaT1mLnkscj1oYShmLngpPmhhKGYueSk/Zi54OmYueSxvPVVhKHMsYyksdC5sYXN0SW50ZXJ2YWw9ZX1lbHNlIHI9YS52ZWxvY2l0eSxuPWEudmVsb2NpdHlYLGk9YS52ZWxvY2l0eVksbz1hLmRpcmVjdGlvbjtlLnZlbG9jaXR5PXIsZS52ZWxvY2l0eVg9bixlLnZlbG9jaXR5WT1pLGUuZGlyZWN0aW9uPW99KHIsZSk7dmFyIGgscD10LmVsZW1lbnQsdj1lLnNyY0V2ZW50O05hKGg9di5jb21wb3NlZFBhdGg/di5jb21wb3NlZFBhdGgoKVswXTp2LnBhdGg/di5wYXRoWzBdOnYudGFyZ2V0LHApJiYocD1oKSxlLnRhcmdldD1wfWZ1bmN0aW9uIFdhKHQsZSxyKXt2YXIgbj1yLnBvaW50ZXJzLmxlbmd0aCxpPXIuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxvPTEmZSYmbi1pPT0wLGE9MTImZSYmbi1pPT0wO3IuaXNGaXJzdD0hIW8sci5pc0ZpbmFsPSEhYSxvJiYodC5zZXNzaW9uPXt9KSxyLmV2ZW50VHlwZT1lLFZhKHQsciksdC5lbWl0KFwiaGFtbWVyLmlucHV0XCIsciksdC5yZWNvZ25pemUociksdC5zZXNzaW9uLnByZXZJbnB1dD1yfWZ1bmN0aW9uIEdhKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXFxzKy9nKX1mdW5jdGlvbiBIYSh0LGUscil7TGEoR2EoZSksKGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLHIsITEpfSkpfWZ1bmN0aW9uICRhKHQsZSxyKXtMYShHYShlKSwoZnVuY3Rpb24oZSl7dC5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMSl9KSl9ZnVuY3Rpb24gSmEodCl7dmFyIGU9dC5vd25lckRvY3VtZW50fHx0O3JldHVybiBlLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvd3x8d2luZG93fXZhciBRYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt2YXIgcj10aGlzO3RoaXMubWFuYWdlcj10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLmVsZW1lbnQ9dC5lbGVtZW50LHRoaXMudGFyZ2V0PXQub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oZSl7Q2EodC5vcHRpb25zLmVuYWJsZSxbdF0pJiZyLmhhbmRsZXIoZSl9LHRoaXMuaW5pdCgpfXZhciBlPXQucHJvdG90eXBlO3JldHVybiBlLmhhbmRsZXI9ZnVuY3Rpb24oKXt9LGUuaW5pdD1mdW5jdGlvbigpe3RoaXMuZXZFbCYmSGEodGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJkhhKHRoaXMudGFyZ2V0LHRoaXMuZXZUYXJnZXQsdGhpcy5kb21IYW5kbGVyKSx0aGlzLmV2V2luJiZIYShKYSh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5ldkVsJiYkYSh0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmJGEodGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJiRhKEphKHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfSx0fSgpO2Z1bmN0aW9uIEJhKHQsZSxyKXtpZih0LmluZGV4T2YmJiFyKXJldHVybiB0LmluZGV4T2YoZSk7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDspe2lmKHImJnRbbl1bcl09PWV8fCFyJiZ0W25dPT09ZSlyZXR1cm4gbjtuKyt9cmV0dXJuLTF9dmFyIEthPXtwb2ludGVyZG93bjoxLHBvaW50ZXJtb3ZlOjIscG9pbnRlcnVwOjQscG9pbnRlcmNhbmNlbDo4LHBvaW50ZXJvdXQ6OH0sWmE9ezI6a2EsMzpcInBlblwiLDQ6QWEsNTpcImtpbmVjdFwifSx0dT1cInBvaW50ZXJkb3duXCIsZXU9XCJwb2ludGVybW92ZSBwb2ludGVydXAgcG9pbnRlcmNhbmNlbFwiO3VhLk1TUG9pbnRlckV2ZW50JiYhdWEuUG9pbnRlckV2ZW50JiYodHU9XCJNU1BvaW50ZXJEb3duXCIsZXU9XCJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbFwiKTt2YXIgcnU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciByLG49ZS5wcm90b3R5cGU7cmV0dXJuIG4uZXZFbD10dSxuLmV2V2luPWV1LChyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzKS5zdG9yZT1yLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdLHJ9cmV0dXJuIG9hKGUsdCksZS5wcm90b3R5cGUuaGFuZGxlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0b3JlLHI9ITEsbj10LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwibXNcIixcIlwiKSxpPUthW25dLG89WmFbdC5wb2ludGVyVHlwZV18fHQucG9pbnRlclR5cGUsYT1vPT09a2EsdT1CYShlLHQucG9pbnRlcklkLFwicG9pbnRlcklkXCIpOzEmaSYmKDA9PT10LmJ1dHRvbnx8YSk/dTwwJiYoZS5wdXNoKHQpLHU9ZS5sZW5ndGgtMSk6MTImaSYmKHI9ITApLHU8MHx8KGVbdV09dCx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixpLHtwb2ludGVyczplLGNoYW5nZWRQb2ludGVyczpbdF0scG9pbnRlclR5cGU6byxzcmNFdmVudDp0fSksciYmZS5zcGxpY2UodSwxKSl9LGV9KFFhKTtmdW5jdGlvbiBudSh0KXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwKX1mdW5jdGlvbiBpdSh0LGUscil7Zm9yKHZhciBuPVtdLGk9W10sbz0wO288dC5sZW5ndGg7KXt2YXIgYT1lP3Rbb11bZV06dFtvXTtCYShpLGEpPDAmJm4ucHVzaCh0W29dKSxpW29dPWEsbysrfXJldHVybiByJiYobj1lP24uc29ydCgoZnVuY3Rpb24odCxyKXtyZXR1cm4gdFtlXT5yW2VdfSkpOm4uc29ydCgpKSxufXZhciBvdT17dG91Y2hzdGFydDoxLHRvdWNobW92ZToyLHRvdWNoZW5kOjQsdG91Y2hjYW5jZWw6OH0sYXU9XCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiLHV1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgcjtyZXR1cm4gZS5wcm90b3R5cGUuZXZUYXJnZXQ9YXUsKHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXMpLnRhcmdldElkcz17fSxyfXJldHVybiBvYShlLHQpLGUucHJvdG90eXBlLmhhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9b3VbdC50eXBlXSxyPXN1LmNhbGwodGhpcyx0LGUpO3ImJnRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGUse3BvaW50ZXJzOnJbMF0sY2hhbmdlZFBvaW50ZXJzOnJbMV0scG9pbnRlclR5cGU6a2Esc3JjRXZlbnQ6dH0pfSxlfShRYSk7ZnVuY3Rpb24gc3UodCxlKXt2YXIgcixuLGk9bnUodC50b3VjaGVzKSxvPXRoaXMudGFyZ2V0SWRzO2lmKDMmZSYmMT09PWkubGVuZ3RoKXJldHVybiBvW2lbMF0uaWRlbnRpZmllcl09ITAsW2ksaV07dmFyIGE9bnUodC5jaGFuZ2VkVG91Y2hlcyksdT1bXSxzPXRoaXMudGFyZ2V0O2lmKG49aS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBOYSh0LnRhcmdldCxzKX0pKSwxPT09ZSlmb3Iocj0wO3I8bi5sZW5ndGg7KW9bbltyXS5pZGVudGlmaWVyXT0hMCxyKys7Zm9yKHI9MDtyPGEubGVuZ3RoOylvW2Fbcl0uaWRlbnRpZmllcl0mJnUucHVzaChhW3JdKSwxMiZlJiZkZWxldGUgb1thW3JdLmlkZW50aWZpZXJdLHIrKztyZXR1cm4gdS5sZW5ndGg/W2l1KG4uY29uY2F0KHUpLFwiaWRlbnRpZmllclwiLCEwKSx1XTp2b2lkIDB9dmFyIGN1PXttb3VzZWRvd246MSxtb3VzZW1vdmU6Mixtb3VzZXVwOjR9LGZ1PVwibW91c2Vkb3duXCIsbHU9XCJtb3VzZW1vdmUgbW91c2V1cFwiLGh1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgcixuPWUucHJvdG90eXBlO3JldHVybiBuLmV2RWw9ZnUsbi5ldldpbj1sdSwocj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcykucHJlc3NlZD0hMSxyfXJldHVybiBvYShlLHQpLGUucHJvdG90eXBlLmhhbmRsZXI9ZnVuY3Rpb24odCl7dmFyIGU9Y3VbdC50eXBlXTsxJmUmJjA9PT10LmJ1dHRvbiYmKHRoaXMucHJlc3NlZD0hMCksMiZlJiYxIT09dC53aGljaCYmKGU9NCksdGhpcy5wcmVzc2VkJiYoNCZlJiYodGhpcy5wcmVzc2VkPSExKSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczpbdF0sY2hhbmdlZFBvaW50ZXJzOlt0XSxwb2ludGVyVHlwZTpBYSxzcmNFdmVudDp0fSkpfSxlfShRYSk7ZnVuY3Rpb24gcHUodCl7dmFyIGU9dC5jaGFuZ2VkUG9pbnRlcnNbMF07aWYoZS5pZGVudGlmaWVyPT09dGhpcy5wcmltYXJ5VG91Y2gpe3ZhciByPXt4OmUuY2xpZW50WCx5OmUuY2xpZW50WX0sbj10aGlzLmxhc3RUb3VjaGVzO3RoaXMubGFzdFRvdWNoZXMucHVzaChyKTtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciB0PW4uaW5kZXhPZihyKTt0Pi0xJiZuLnNwbGljZSh0LDEpfSksMjUwMCl9fWZ1bmN0aW9uIHZ1KHQsZSl7MSZ0Pyh0aGlzLnByaW1hcnlUb3VjaD1lLmNoYW5nZWRQb2ludGVyc1swXS5pZGVudGlmaWVyLHB1LmNhbGwodGhpcyxlKSk6MTImdCYmcHUuY2FsbCh0aGlzLGUpfWZ1bmN0aW9uIGR1KHQpe2Zvcih2YXIgZT10LnNyY0V2ZW50LmNsaWVudFgscj10LnNyY0V2ZW50LmNsaWVudFksbj0wO248dGhpcy5sYXN0VG91Y2hlcy5sZW5ndGg7bisrKXt2YXIgaT10aGlzLmxhc3RUb3VjaGVzW25dLG89TWF0aC5hYnMoZS1pLngpLGE9TWF0aC5hYnMoci1pLnkpO2lmKG88PTI1JiZhPD0yNSlyZXR1cm4hMH1yZXR1cm4hMX12YXIgeXU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIpe3ZhciBuO3JldHVybihuPXQuY2FsbCh0aGlzLGUscil8fHRoaXMpLmhhbmRsZXI9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXIucG9pbnRlclR5cGU9PT1rYSxvPXIucG9pbnRlclR5cGU9PT1BYTtpZighKG8mJnIuc291cmNlQ2FwYWJpbGl0aWVzJiZyLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSl7aWYoaSl2dS5jYWxsKGFhKGFhKG4pKSxlLHIpO2Vsc2UgaWYobyYmZHUuY2FsbChhYShhYShuKSkscikpcmV0dXJuO24uY2FsbGJhY2sodCxlLHIpfX0sbi50b3VjaD1uZXcgdXUobi5tYW5hZ2VyLG4uaGFuZGxlciksbi5tb3VzZT1uZXcgaHUobi5tYW5hZ2VyLG4uaGFuZGxlciksbi5wcmltYXJ5VG91Y2g9bnVsbCxuLmxhc3RUb3VjaGVzPVtdLG59cmV0dXJuIG9hKGUsdCksZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMudG91Y2guZGVzdHJveSgpLHRoaXMubW91c2UuZGVzdHJveSgpfSxlfShRYSl9KCk7ZnVuY3Rpb24gZ3UodCxlLHIpe3JldHVybiEhQXJyYXkuaXNBcnJheSh0KSYmKExhKHQscltlXSxyKSwhMCl9dmFyIG11PTMyLGJ1PTE7ZnVuY3Rpb24gX3UodCxlKXt2YXIgcj1lLm1hbmFnZXI7cmV0dXJuIHI/ci5nZXQodCk6dH1mdW5jdGlvbiB3dSh0KXtyZXR1cm4gMTYmdD9cImNhbmNlbFwiOjgmdD9cImVuZFwiOjQmdD9cIm1vdmVcIjoyJnQ/XCJzdGFydFwiOlwiXCJ9dmFyIEV1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy5vcHRpb25zPWlhKHtlbmFibGU6ITB9LHQpLHRoaXMuaWQ9YnUrKyx0aGlzLm1hbmFnZXI9bnVsbCx0aGlzLnN0YXRlPTEsdGhpcy5zaW11bHRhbmVvdXM9e30sdGhpcy5yZXF1aXJlRmFpbD1bXX12YXIgZT10LnByb3RvdHlwZTtyZXR1cm4gZS5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHNhKHRoaXMub3B0aW9ucyx0KSx0aGlzLm1hbmFnZXImJnRoaXMubWFuYWdlci50b3VjaEFjdGlvbi51cGRhdGUoKSx0aGlzfSxlLnJlY29nbml6ZVdpdGg9ZnVuY3Rpb24odCl7aWYoZ3UodCxcInJlY29nbml6ZVdpdGhcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gZVsodD1fdSh0LHRoaXMpKS5pZF18fChlW3QuaWRdPXQsdC5yZWNvZ25pemVXaXRoKHRoaXMpKSx0aGlzfSxlLmRyb3BSZWNvZ25pemVXaXRoPWZ1bmN0aW9uKHQpe3JldHVybiBndSh0LFwiZHJvcFJlY29nbml6ZVdpdGhcIix0aGlzKXx8KHQ9X3UodCx0aGlzKSxkZWxldGUgdGhpcy5zaW11bHRhbmVvdXNbdC5pZF0pLHRoaXN9LGUucmVxdWlyZUZhaWx1cmU9ZnVuY3Rpb24odCl7aWYoZ3UodCxcInJlcXVpcmVGYWlsdXJlXCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5yZXF1aXJlRmFpbDtyZXR1cm4tMT09PUJhKGUsdD1fdSh0LHRoaXMpKSYmKGUucHVzaCh0KSx0LnJlcXVpcmVGYWlsdXJlKHRoaXMpKSx0aGlzfSxlLmRyb3BSZXF1aXJlRmFpbHVyZT1mdW5jdGlvbih0KXtpZihndSh0LFwiZHJvcFJlcXVpcmVGYWlsdXJlXCIsdGhpcykpcmV0dXJuIHRoaXM7dD1fdSh0LHRoaXMpO3ZhciBlPUJhKHRoaXMucmVxdWlyZUZhaWwsdCk7cmV0dXJuIGU+LTEmJnRoaXMucmVxdWlyZUZhaWwuc3BsaWNlKGUsMSksdGhpc30sZS5oYXNSZXF1aXJlRmFpbHVyZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg+MH0sZS5jYW5SZWNvZ25pemVXaXRoPWZ1bmN0aW9uKHQpe3JldHVybiEhdGhpcy5zaW11bHRhbmVvdXNbdC5pZF19LGUuZW1pdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9dGhpcy5zdGF0ZTtmdW5jdGlvbiBuKHIpe2UubWFuYWdlci5lbWl0KHIsdCl9cjw4JiZuKGUub3B0aW9ucy5ldmVudCt3dShyKSksbihlLm9wdGlvbnMuZXZlbnQpLHQuYWRkaXRpb25hbEV2ZW50JiZuKHQuYWRkaXRpb25hbEV2ZW50KSxyPj04JiZuKGUub3B0aW9ucy5ldmVudCt3dShyKSl9LGUudHJ5RW1pdD1mdW5jdGlvbih0KXtpZih0aGlzLmNhbkVtaXQoKSlyZXR1cm4gdGhpcy5lbWl0KHQpO3RoaXMuc3RhdGU9bXV9LGUuY2FuRW1pdD1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKDMzJnRoaXMucmVxdWlyZUZhaWxbdF0uc3RhdGUpKXJldHVybiExO3QrK31yZXR1cm4hMH0sZS5yZWNvZ25pemU9ZnVuY3Rpb24odCl7dmFyIGU9c2Eoe30sdCk7aWYoIUNhKHRoaXMub3B0aW9ucy5lbmFibGUsW3RoaXMsZV0pKXJldHVybiB0aGlzLnJlc2V0KCksdm9pZCh0aGlzLnN0YXRlPW11KTs1NiZ0aGlzLnN0YXRlJiYodGhpcy5zdGF0ZT0xKSx0aGlzLnN0YXRlPXRoaXMucHJvY2VzcyhlKSwzMCZ0aGlzLnN0YXRlJiZ0aGlzLnRyeUVtaXQoZSl9LGUucHJvY2Vzcz1mdW5jdGlvbih0KXt9LGUuZ2V0VG91Y2hBY3Rpb249ZnVuY3Rpb24oKXt9LGUucmVzZXQ9ZnVuY3Rpb24oKXt9LHR9KCksT3U9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgcjtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLChyPXQuY2FsbCh0aGlzLGlhKHtldmVudDpcInRhcFwiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGUpKXx8dGhpcykucFRpbWU9ITEsci5wQ2VudGVyPSExLHIuX3RpbWVyPW51bGwsci5faW5wdXQ9bnVsbCxyLmNvdW50PTAscn1vYShlLHQpO3ZhciByPWUucHJvdG90eXBlO3JldHVybiByLmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW2JhXX0sci5wcm9jZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMscj10aGlzLm9wdGlvbnMsbj10LnBvaW50ZXJzLmxlbmd0aD09PXIucG9pbnRlcnMsaT10LmRpc3RhbmNlPHIudGhyZXNob2xkLG89dC5kZWx0YVRpbWU8ci50aW1lO2lmKHRoaXMucmVzZXQoKSwxJnQuZXZlbnRUeXBlJiYwPT09dGhpcy5jb3VudClyZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO2lmKGkmJm8mJm4pe2lmKDQhPT10LmV2ZW50VHlwZSlyZXR1cm4gdGhpcy5mYWlsVGltZW91dCgpO3ZhciBhPSF0aGlzLnBUaW1lfHx0LnRpbWVTdGFtcC10aGlzLnBUaW1lPHIuaW50ZXJ2YWwsdT0hdGhpcy5wQ2VudGVyfHxxYSh0aGlzLnBDZW50ZXIsdC5jZW50ZXIpPHIucG9zVGhyZXNob2xkO2lmKHRoaXMucFRpbWU9dC50aW1lU3RhbXAsdGhpcy5wQ2VudGVyPXQuY2VudGVyLHUmJmE/dGhpcy5jb3VudCs9MTp0aGlzLmNvdW50PTEsdGhpcy5faW5wdXQ9dCwwPT09dGhpcy5jb3VudCVyLnRhcHMpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5zdGF0ZT04LGUudHJ5RW1pdCgpfSksci5pbnRlcnZhbCksMik6OH1yZXR1cm4gbXV9LHIuZmFpbFRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl90aW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3Quc3RhdGU9bXV9KSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwpLG11fSxyLnJlc2V0PWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sci5lbWl0PWZ1bmN0aW9uKCl7OD09PXRoaXMuc3RhdGUmJih0aGlzLl9pbnB1dC50YXBDb3VudD10aGlzLmNvdW50LHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0aGlzLl9pbnB1dCkpfSxlfShFdSksVHU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLHQuY2FsbCh0aGlzLGlhKHtwb2ludGVyczoxfSxlKSl8fHRoaXN9b2EoZSx0KTt2YXIgcj1lLnByb3RvdHlwZTtyZXR1cm4gci5hdHRyVGVzdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMucG9pbnRlcnM7cmV0dXJuIDA9PT1lfHx0LnBvaW50ZXJzLmxlbmd0aD09PWV9LHIucHJvY2Vzcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0YXRlLHI9dC5ldmVudFR5cGUsbj02JmUsaT10aGlzLmF0dHJUZXN0KHQpO3JldHVybiBuJiYoOCZyfHwhaSk/MTZ8ZTpufHxpPzQmcj84fGU6MiZlPzR8ZToyOm11fSxlfShFdSk7ZnVuY3Rpb24gU3UodCl7cmV0dXJuIHQ9PT1qYT9cImRvd25cIjo4PT09dD9cInVwXCI6Mj09PXQ/XCJsZWZ0XCI6ND09PXQ/XCJyaWdodFwiOlwiXCJ9dmFyIHh1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIHI7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSwocj10LmNhbGwodGhpcyxpYSh7ZXZlbnQ6XCJwYW5cIix0aHJlc2hvbGQ6MTAscG9pbnRlcnM6MSxkaXJlY3Rpb246MzB9LGUpKXx8dGhpcykucFg9bnVsbCxyLnBZPW51bGwscn1vYShlLHQpO3ZhciByPWUucHJvdG90eXBlO3JldHVybiByLmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLmRpcmVjdGlvbixlPVtdO3JldHVybiA2JnQmJmUucHVzaChFYSksdCZJYSYmZS5wdXNoKHdhKSxlfSxyLmRpcmVjdGlvblRlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLHI9ITAsbj10LmRpc3RhbmNlLGk9dC5kaXJlY3Rpb24sbz10LmRlbHRhWCxhPXQuZGVsdGFZO3JldHVybiBpJmUuZGlyZWN0aW9ufHwoNiZlLmRpcmVjdGlvbj8oaT0wPT09bz8xOm88MD8yOjQscj1vIT09dGhpcy5wWCxuPU1hdGguYWJzKHQuZGVsdGFYKSk6KGk9MD09PWE/MTphPDA/ODpqYSxyPWEhPT10aGlzLnBZLG49TWF0aC5hYnModC5kZWx0YVkpKSksdC5kaXJlY3Rpb249aSxyJiZuPmUudGhyZXNob2xkJiZpJmUuZGlyZWN0aW9ufSxyLmF0dHJUZXN0PWZ1bmN0aW9uKHQpe3JldHVybiBUdS5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLHQpJiYoMiZ0aGlzLnN0YXRlfHwhKDImdGhpcy5zdGF0ZSkmJnRoaXMuZGlyZWN0aW9uVGVzdCh0KSl9LHIuZW1pdD1mdW5jdGlvbihlKXt0aGlzLnBYPWUuZGVsdGFYLHRoaXMucFk9ZS5kZWx0YVk7dmFyIHI9U3UoZS5kaXJlY3Rpb24pO3ImJihlLmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrciksdC5wcm90b3R5cGUuZW1pdC5jYWxsKHRoaXMsZSl9LGV9KFR1KSxrdT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT17fSksdC5jYWxsKHRoaXMsaWEoe2V2ZW50Olwic3dpcGVcIix0aHJlc2hvbGQ6MTAsdmVsb2NpdHk6LjMsZGlyZWN0aW9uOjMwLHBvaW50ZXJzOjF9LGUpKXx8dGhpc31vYShlLHQpO3ZhciByPWUucHJvdG90eXBlO3JldHVybiByLmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHh1LnByb3RvdHlwZS5nZXRUb3VjaEFjdGlvbi5jYWxsKHRoaXMpfSxyLmF0dHJUZXN0PWZ1bmN0aW9uKGUpe3ZhciByLG49dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gMzAmbj9yPWUub3ZlcmFsbFZlbG9jaXR5OjYmbj9yPWUub3ZlcmFsbFZlbG9jaXR5WDpuJklhJiYocj1lLm92ZXJhbGxWZWxvY2l0eVkpLHQucHJvdG90eXBlLmF0dHJUZXN0LmNhbGwodGhpcyxlKSYmbiZlLm9mZnNldERpcmVjdGlvbiYmZS5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZlLm1heFBvaW50ZXJzPT09dGhpcy5vcHRpb25zLnBvaW50ZXJzJiZoYShyKT50aGlzLm9wdGlvbnMudmVsb2NpdHkmJjQmZS5ldmVudFR5cGV9LHIuZW1pdD1mdW5jdGlvbih0KXt2YXIgZT1TdSh0Lm9mZnNldERpcmVjdGlvbik7ZSYmdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K2UsdCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHQpfSxlfShUdSksQXU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLHQuY2FsbCh0aGlzLGlhKHtldmVudDpcInBpbmNoXCIsdGhyZXNob2xkOjAscG9pbnRlcnM6Mn0sZSkpfHx0aGlzfW9hKGUsdCk7dmFyIHI9ZS5wcm90b3R5cGU7cmV0dXJuIHIuZ2V0VG91Y2hBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm5bX2FdfSxyLmF0dHJUZXN0PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsZSkmJihNYXRoLmFicyhlLnNjYWxlLTEpPnRoaXMub3B0aW9ucy50aHJlc2hvbGR8fDImdGhpcy5zdGF0ZSl9LHIuZW1pdD1mdW5jdGlvbihlKXtpZigxIT09ZS5zY2FsZSl7dmFyIHI9ZS5zY2FsZTwxP1wiaW5cIjpcIm91dFwiO2UuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtyfXQucHJvdG90eXBlLmVtaXQuY2FsbCh0aGlzLGUpfSxlfShUdSksanU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLHQuY2FsbCh0aGlzLGlhKHtldmVudDpcInJvdGF0ZVwiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGUpKXx8dGhpc31vYShlLHQpO3ZhciByPWUucHJvdG90eXBlO3JldHVybiByLmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW19hXX0sci5hdHRyVGVzdD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuYXR0clRlc3QuY2FsbCh0aGlzLGUpJiYoTWF0aC5hYnMoZS5yb3RhdGlvbik+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8MiZ0aGlzLnN0YXRlKX0sZX0oVHUpLEl1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIHI7cmV0dXJuIHZvaWQgMD09PWUmJihlPXt9KSwocj10LmNhbGwodGhpcyxpYSh7ZXZlbnQ6XCJwcmVzc1wiLHBvaW50ZXJzOjEsdGltZToyNTEsdGhyZXNob2xkOjl9LGUpKXx8dGhpcykuX3RpbWVyPW51bGwsci5faW5wdXQ9bnVsbCxyfW9hKGUsdCk7dmFyIHI9ZS5wcm90b3R5cGU7cmV0dXJuIHIuZ2V0VG91Y2hBY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm5bbWFdfSxyLnByb2Nlc3M9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxyPXRoaXMub3B0aW9ucyxuPXQucG9pbnRlcnMubGVuZ3RoPT09ci5wb2ludGVycyxpPXQuZGlzdGFuY2U8ci50aHJlc2hvbGQsbz10LmRlbHRhVGltZT5yLnRpbWU7aWYodGhpcy5faW5wdXQ9dCwhaXx8IW58fDEyJnQuZXZlbnRUeXBlJiYhbyl0aGlzLnJlc2V0KCk7ZWxzZSBpZigxJnQuZXZlbnRUeXBlKXRoaXMucmVzZXQoKSx0aGlzLl90aW1lcj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2Uuc3RhdGU9OCxlLnRyeUVtaXQoKX0pLHIudGltZSk7ZWxzZSBpZig0JnQuZXZlbnRUeXBlKXJldHVybiA4O3JldHVybiBtdX0sci5yZXNldD1mdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLl90aW1lcil9LHIuZW1pdD1mdW5jdGlvbih0KXs4PT09dGhpcy5zdGF0ZSYmKHQmJjQmdC5ldmVudFR5cGU/dGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50K1widXBcIix0KToodGhpcy5faW5wdXQudGltZVN0YW1wPXBhKCksdGhpcy5tYW5hZ2VyLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LHRoaXMuX2lucHV0KSkpfSxlfShFdSksUHU9e2RvbUV2ZW50czohMSx0b3VjaEFjdGlvbjpnYSxlbmFibGU6ITAsaW5wdXRUYXJnZXQ6bnVsbCxpbnB1dENsYXNzOm51bGwsY3NzUHJvcHM6e3VzZXJTZWxlY3Q6XCJub25lXCIsdG91Y2hTZWxlY3Q6XCJub25lXCIsdG91Y2hDYWxsb3V0Olwibm9uZVwiLGNvbnRlbnRab29taW5nOlwibm9uZVwiLHVzZXJEcmFnOlwibm9uZVwiLHRhcEhpZ2hsaWdodENvbG9yOlwicmdiYSgwLDAsMCwwKVwifX0sRHU9W1tqdSx7ZW5hYmxlOiExfV0sW0F1LHtlbmFibGU6ITF9LFtcInJvdGF0ZVwiXV0sW2t1LHtkaXJlY3Rpb246Nn1dLFt4dSx7ZGlyZWN0aW9uOjZ9LFtcInN3aXBlXCJdXSxbT3VdLFtPdSx7ZXZlbnQ6XCJkb3VibGV0YXBcIix0YXBzOjJ9LFtcInRhcFwiXV0sW0l1XV07ZnVuY3Rpb24gTHUodCxlKXt2YXIgcixuPXQuZWxlbWVudDtuLnN0eWxlJiYoTGEodC5vcHRpb25zLmNzc1Byb3BzLChmdW5jdGlvbihpLG8pe3I9dmEobi5zdHlsZSxvKSxlPyh0Lm9sZENzc1Byb3BzW3JdPW4uc3R5bGVbcl0sbi5zdHlsZVtyXT1pKTpuLnN0eWxlW3JdPXQub2xkQ3NzUHJvcHNbcl18fFwiXCJ9KSksZXx8KHQub2xkQ3NzUHJvcHM9e30pKX12YXIgQ3U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7dmFyIHIsbj10aGlzO3RoaXMub3B0aW9ucz1zYSh7fSxQdSxlfHx7fSksdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0PXRoaXMub3B0aW9ucy5pbnB1dFRhcmdldHx8dCx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLnJlY29nbml6ZXJzPVtdLHRoaXMub2xkQ3NzUHJvcHM9e30sdGhpcy5lbGVtZW50PXQsdGhpcy5pbnB1dD1uZXcoKHI9dGhpcykub3B0aW9ucy5pbnB1dENsYXNzfHwoU2E/cnU6eGE/dXU6VGE/eXU6aHUpKShyLFdhKSx0aGlzLnRvdWNoQWN0aW9uPW5ldyBNYSh0aGlzLHRoaXMub3B0aW9ucy50b3VjaEFjdGlvbiksTHUodGhpcywhMCksTGEodGhpcy5vcHRpb25zLnJlY29nbml6ZXJzLChmdW5jdGlvbih0KXt2YXIgZT1uLmFkZChuZXcgdFswXSh0WzFdKSk7dFsyXSYmZS5yZWNvZ25pemVXaXRoKHRbMl0pLHRbM10mJmUucmVxdWlyZUZhaWx1cmUodFszXSl9KSx0aGlzKX12YXIgZT10LnByb3RvdHlwZTtyZXR1cm4gZS5zZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHNhKHRoaXMub3B0aW9ucyx0KSx0LnRvdWNoQWN0aW9uJiZ0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpLHQuaW5wdXRUYXJnZXQmJih0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmlucHV0LnRhcmdldD10LmlucHV0VGFyZ2V0LHRoaXMuaW5wdXQuaW5pdCgpKSx0aGlzfSxlLnN0b3A9ZnVuY3Rpb24odCl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9dD8yOjF9LGUucmVjb2duaXplPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2Vzc2lvbjtpZighZS5zdG9wcGVkKXt2YXIgcjt0aGlzLnRvdWNoQWN0aW9uLnByZXZlbnREZWZhdWx0cyh0KTt2YXIgbj10aGlzLnJlY29nbml6ZXJzLGk9ZS5jdXJSZWNvZ25pemVyOyghaXx8aSYmOCZpLnN0YXRlKSYmKGUuY3VyUmVjb2duaXplcj1udWxsLGk9bnVsbCk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDspcj1uW29dLDI9PT1lLnN0b3BwZWR8fGkmJnIhPT1pJiYhci5jYW5SZWNvZ25pemVXaXRoKGkpP3IucmVzZXQoKTpyLnJlY29nbml6ZSh0KSwhaSYmMTQmci5zdGF0ZSYmKGUuY3VyUmVjb2duaXplcj1yLGk9ciksbysrfX0sZS5nZXQ9ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEV1KXJldHVybiB0O2Zvcih2YXIgZT10aGlzLnJlY29nbml6ZXJzLHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdLm9wdGlvbnMuZXZlbnQ9PT10KXJldHVybiBlW3JdO3JldHVybiBudWxsfSxlLmFkZD1mdW5jdGlvbih0KXtpZihndSh0LFwiYWRkXCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5nZXQodC5vcHRpb25zLmV2ZW50KTtyZXR1cm4gZSYmdGhpcy5yZW1vdmUoZSksdGhpcy5yZWNvZ25pemVycy5wdXNoKHQpLHQubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdH0sZS5yZW1vdmU9ZnVuY3Rpb24odCl7aWYoZ3UodCxcInJlbW92ZVwiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuZ2V0KHQpO2lmKHQpe3ZhciByPXRoaXMucmVjb2duaXplcnMsbj1CYShyLGUpOy0xIT09biYmKHIuc3BsaWNlKG4sMSksdGhpcy50b3VjaEFjdGlvbi51cGRhdGUoKSl9cmV0dXJuIHRoaXN9LGUub249ZnVuY3Rpb24odCxlKXtpZih2b2lkIDA9PT10fHx2b2lkIDA9PT1lKXJldHVybiB0aGlzO3ZhciByPXRoaXMuaGFuZGxlcnM7cmV0dXJuIExhKEdhKHQpLChmdW5jdGlvbih0KXtyW3RdPXJbdF18fFtdLHJbdF0ucHVzaChlKX0pKSx0aGlzfSxlLm9mZj1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXQpcmV0dXJuIHRoaXM7dmFyIHI9dGhpcy5oYW5kbGVycztyZXR1cm4gTGEoR2EodCksKGZ1bmN0aW9uKHQpe2U/clt0XSYmclt0XS5zcGxpY2UoQmEoclt0XSxlKSwxKTpkZWxldGUgclt0XX0pKSx0aGlzfSxlLmVtaXQ9ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZmdW5jdGlvbih0LGUpe3ZhciByPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiRXZlbnRcIik7ci5pbml0RXZlbnQodCwhMCwhMCksci5nZXN0dXJlPWUsZS50YXJnZXQuZGlzcGF0Y2hFdmVudChyKX0odCxlKTt2YXIgcj10aGlzLmhhbmRsZXJzW3RdJiZ0aGlzLmhhbmRsZXJzW3RdLnNsaWNlKCk7aWYociYmci5sZW5ndGgpe2UudHlwZT10LGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXtlLnNyY0V2ZW50LnByZXZlbnREZWZhdWx0KCl9O2Zvcih2YXIgbj0wO248ci5sZW5ndGg7KXJbbl0oZSksbisrfX0sZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZMdSh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH0sdH0oKSxSdT17dG91Y2hzdGFydDoxLHRvdWNobW92ZToyLHRvdWNoZW5kOjQsdG91Y2hjYW5jZWw6OH0sTXU9XCJ0b3VjaHN0YXJ0XCIsTnU9XCJ0b3VjaHN0YXJ0IHRvdWNobW92ZSB0b3VjaGVuZCB0b3VjaGNhbmNlbFwiLEZ1PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgcixuPWUucHJvdG90eXBlO3JldHVybiBuLmV2VGFyZ2V0PU11LG4uZXZXaW49TnUsKHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXMpLnN0YXJ0ZWQ9ITEscn1yZXR1cm4gb2EoZSx0KSxlLnByb3RvdHlwZS5oYW5kbGVyPWZ1bmN0aW9uKHQpe3ZhciBlPVJ1W3QudHlwZV07aWYoMT09PWUmJih0aGlzLnN0YXJ0ZWQ9ITApLHRoaXMuc3RhcnRlZCl7dmFyIHI9enUuY2FsbCh0aGlzLHQsZSk7MTImZSYmclswXS5sZW5ndGgtclsxXS5sZW5ndGg9PTAmJih0aGlzLnN0YXJ0ZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGUse3BvaW50ZXJzOnJbMF0sY2hhbmdlZFBvaW50ZXJzOnJbMV0scG9pbnRlclR5cGU6a2Esc3JjRXZlbnQ6dH0pfX0sZX0oUWEpO2Z1bmN0aW9uIHp1KHQsZSl7dmFyIHI9bnUodC50b3VjaGVzKSxuPW51KHQuY2hhbmdlZFRvdWNoZXMpO3JldHVybiAxMiZlJiYocj1pdShyLmNvbmNhdChuKSxcImlkZW50aWZpZXJcIiwhMCkpLFtyLG5dfWZ1bmN0aW9uIHF1KHQsZSxyKXt2YXIgbj1cIkRFUFJFQ0FURUQgTUVUSE9EOiBcIitlK1wiXFxuXCIrcitcIiBBVCBcXG5cIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoXCJnZXQtc3RhY2stdHJhY2VcIikscj1lJiZlLnN0YWNrP2Uuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLFwiXCIpLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLFwiXCIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5cXHMqXFwoL2dtLFwie2Fub255bW91c30oKUBcIik6XCJVbmtub3duIFN0YWNrIFRyYWNlXCIsaT13aW5kb3cuY29uc29sZSYmKHdpbmRvdy5jb25zb2xlLndhcm58fHdpbmRvdy5jb25zb2xlLmxvZyk7cmV0dXJuIGkmJmkuY2FsbCh3aW5kb3cuY29uc29sZSxuLHIpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX12YXIgWXU9cXUoKGZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG49T2JqZWN0LmtleXMoZSksaT0wO2k8bi5sZW5ndGg7KSghcnx8ciYmdm9pZCAwPT09dFtuW2ldXSkmJih0W25baV1dPWVbbltpXV0pLGkrKztyZXR1cm4gdH0pLFwiZXh0ZW5kXCIsXCJVc2UgYGFzc2lnbmAuXCIpLFV1PXF1KChmdW5jdGlvbih0LGUpe3JldHVybiBZdSh0LGUsITApfSksXCJtZXJnZVwiLFwiVXNlIGBhc3NpZ25gLlwiKTtmdW5jdGlvbiBYdSh0LGUscil7dmFyIG4saT1lLnByb3RvdHlwZTsobj10LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGkpKS5jb25zdHJ1Y3Rvcj10LG4uX3N1cGVyPWksciYmc2EobixyKX1mdW5jdGlvbiBWdSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KGUsYXJndW1lbnRzKX19dmFyIFd1PWZ1bmN0aW9uKCl7dmFyIHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9e30pLG5ldyBDdSh0LGlhKHtyZWNvZ25pemVyczpEdS5jb25jYXQoKX0sZSkpfTtyZXR1cm4gdC5WRVJTSU9OPVwiMi4wLjE3LXJjXCIsdC5ESVJFQ1RJT05fQUxMPTMwLHQuRElSRUNUSU9OX0RPV049amEsdC5ESVJFQ1RJT05fTEVGVD0yLHQuRElSRUNUSU9OX1JJR0hUPTQsdC5ESVJFQ1RJT05fVVA9OCx0LkRJUkVDVElPTl9IT1JJWk9OVEFMPTYsdC5ESVJFQ1RJT05fVkVSVElDQUw9SWEsdC5ESVJFQ1RJT05fTk9ORT0xLHQuRElSRUNUSU9OX0RPV049amEsdC5JTlBVVF9TVEFSVD0xLHQuSU5QVVRfTU9WRT0yLHQuSU5QVVRfRU5EPTQsdC5JTlBVVF9DQU5DRUw9OCx0LlNUQVRFX1BPU1NJQkxFPTEsdC5TVEFURV9CRUdBTj0yLHQuU1RBVEVfQ0hBTkdFRD00LHQuU1RBVEVfRU5ERUQ9OCx0LlNUQVRFX1JFQ09HTklaRUQ9OCx0LlNUQVRFX0NBTkNFTExFRD0xNix0LlNUQVRFX0ZBSUxFRD1tdSx0Lk1hbmFnZXI9Q3UsdC5JbnB1dD1RYSx0LlRvdWNoQWN0aW9uPU1hLHQuVG91Y2hJbnB1dD11dSx0Lk1vdXNlSW5wdXQ9aHUsdC5Qb2ludGVyRXZlbnRJbnB1dD1ydSx0LlRvdWNoTW91c2VJbnB1dD15dSx0LlNpbmdsZVRvdWNoSW5wdXQ9RnUsdC5SZWNvZ25pemVyPUV1LHQuQXR0clJlY29nbml6ZXI9VHUsdC5UYXA9T3UsdC5QYW49eHUsdC5Td2lwZT1rdSx0LlBpbmNoPUF1LHQuUm90YXRlPWp1LHQuUHJlc3M9SXUsdC5vbj1IYSx0Lm9mZj0kYSx0LmVhY2g9TGEsdC5tZXJnZT1VdSx0LmV4dGVuZD1ZdSx0LmJpbmRGbj1WdSx0LmFzc2lnbj1zYSx0LmluaGVyaXQ9WHUsdC5iaW5kRm49VnUsdC5wcmVmaXhlZD12YSx0LnRvQXJyYXk9bnUsdC5pbkFycmF5PUJhLHQudW5pcXVlQXJyYXk9aXUsdC5zcGxpdFN0cj1HYSx0LmJvb2xPckZuPUNhLHQuaGFzUGFyZW50PU5hLHQuYWRkRXZlbnRMaXN0ZW5lcnM9SGEsdC5yZW1vdmVFdmVudExpc3RlbmVycz0kYSx0LmRlZmF1bHRzPXNhKHt9LFB1LHtwcmVzZXQ6RHV9KSx0fSgpO2Z1bmN0aW9uIEd1KHQsZSl7dmFyIHI7aWYodm9pZCAwPT09cmF8fG51bGw9PXpuKHQpKXtpZihYbyh0KXx8KHI9ZnVuY3Rpb24odCxlKXt2YXIgcjtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIEh1KHQsZSk7dmFyIG49JG8ocj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwociw4LC0xKTtcIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZihcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4pcmV0dXJuIEJuKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gSHUodCxlKX0odCkpfHxlJiZ0JiZcIm51bWJlclwiPT10eXBlb2YgdC5sZW5ndGgpe3ImJih0PXIpO3ZhciBuPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIG4+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W24rK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfXZhciBvLGE9ITAsdT0hMTtyZXR1cm57czpmdW5jdGlvbigpe3I9Rm4odCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1yLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXt1PSEwLG89dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1yLnJldHVybnx8ci5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgb319fX1mdW5jdGlvbiBIdSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgcj0wLG49bmV3IEFycmF5KGUpO3I8ZTtyKyspbltyXT10W3JdO3JldHVybiBufXZhciAkdT1yYShcIkRFTEVURVwiKTtmdW5jdGlvbiBKdSgpe3ZhciB0PVF1LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpO3JldHVybiBLdSh0KSx0fWZ1bmN0aW9uIFF1KCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspZVtyXT1hcmd1bWVudHNbcl07aWYoZS5sZW5ndGg8MilyZXR1cm4gZVswXTt2YXIgbjtpZihlLmxlbmd0aD4yKXJldHVybiBRdS5hcHBseSh2b2lkIDAsZWEobj1bSnUoZVswXSxlWzFdKV0pLmNhbGwobixLbygkbyhlKS5jYWxsKGUsMikpKSk7dmFyIGksbz1lWzBdLGE9ZVsxXSx1PUd1KEhvKGEpKTt0cnl7Zm9yKHUucygpOyEoaT11Lm4oKSkuZG9uZTspe3ZhciBzPWkudmFsdWU7T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGEscykmJihhW3NdPT09JHU/ZGVsZXRlIG9bc106bnVsbD09PW9bc118fG51bGw9PT1hW3NdfHxcIm9iamVjdFwiIT09R28ob1tzXSl8fFwib2JqZWN0XCIhPT1HbyhhW3NdKXx8WG8ob1tzXSl8fFhvKGFbc10pP29bc109QnUoYVtzXSk6b1tzXT1RdShvW3NdLGFbc10pKX19Y2F0Y2godCl7dS5lKHQpfWZpbmFsbHl7dS5mKCl9cmV0dXJuIG99ZnVuY3Rpb24gQnUodCl7cmV0dXJuIFhvKHQpP3F0KHQpLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIEJ1KHQpfSkpOlwib2JqZWN0XCI9PT1Hbyh0KSYmbnVsbCE9PXQ/UXUoe30sdCk6dH1mdW5jdGlvbiBLdSh0KXtmb3IodmFyIGU9MCxyPVVvKHQpO2U8ci5sZW5ndGg7ZSsrKXt2YXIgbj1yW2VdO3Rbbl09PT0kdT9kZWxldGUgdFtuXTpcIm9iamVjdFwiPT09R28odFtuXSkmJm51bGwhPT10W25dJiZLdSh0W25dKX19dmFyIFp1PVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3c/d2luZG93LkhhbW1lcnx8V3U6ZnVuY3Rpb24oKXtyZXR1cm57b246dD1mdW5jdGlvbigpe30sb2ZmOnQsZGVzdHJveTp0LGVtaXQ6dCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57c2V0OnR9fX07dmFyIHR9O2Z1bmN0aW9uIHRzKHQpe3ZhciBlLHI9dGhpczt0aGlzLl9jbGVhbnVwUXVldWU9W10sdGhpcy5hY3RpdmU9ITEsdGhpcy5fZG9tPXtjb250YWluZXI6dCxvdmVybGF5OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIil9LHRoaXMuX2RvbS5vdmVybGF5LmNsYXNzTGlzdC5hZGQoXCJ2aXMtb3ZlcmxheVwiKSx0aGlzLl9kb20uY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuX2RvbS5vdmVybGF5KSx0aGlzLl9jbGVhbnVwUXVldWUucHVzaCgoZnVuY3Rpb24oKXtyLl9kb20ub3ZlcmxheS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIuX2RvbS5vdmVybGF5KX0pKTt2YXIgbj1adSh0aGlzLl9kb20ub3ZlcmxheSk7bi5vbihcInRhcFwiLGNlKGU9dGhpcy5fb25UYXBPdmVybGF5KS5jYWxsKGUsdGhpcykpLHRoaXMuX2NsZWFudXBRdWV1ZS5wdXNoKChmdW5jdGlvbigpe24uZGVzdHJveSgpfSkpO3ZhciBpPVtcInRhcFwiLFwiZG91YmxldGFwXCIsXCJwcmVzc1wiLFwicGluY2hcIixcInBhblwiLFwicGFuc3RhcnRcIixcInBhbm1vdmVcIixcInBhbmVuZFwiXTtsbyhpKS5jYWxsKGksKGZ1bmN0aW9uKHQpe24ub24odCwoZnVuY3Rpb24odCl7dC5zcmNFdmVudC5zdG9wUHJvcGFnYXRpb24oKX0pKX0pKSxkb2N1bWVudCYmZG9jdW1lbnQuYm9keSYmKHRoaXMuX29uQ2xpY2s9ZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQsZSl7Zm9yKDt0Oyl7aWYodD09PWUpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9KShlLnRhcmdldCx0KXx8ci5kZWFjdGl2YXRlKCl9LGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsdGhpcy5fb25DbGljayksdGhpcy5fY2xlYW51cFF1ZXVlLnB1c2goKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIixyLl9vbkNsaWNrKX0pKSksdGhpcy5fZXNjTGlzdGVuZXI9ZnVuY3Rpb24odCl7KFwia2V5XCJpbiB0P1wiRXNjYXBlXCI9PT10LmtleToyNz09PXQua2V5Q29kZSkmJnIuZGVhY3RpdmF0ZSgpfX1uYSh0cy5wcm90b3R5cGUpLHRzLmN1cnJlbnQ9bnVsbCx0cy5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciB0LGU7dGhpcy5kZWFjdGl2YXRlKCk7dmFyIHIsbj1HdShubyh0PUtpKGU9dGhpcy5fY2xlYW51cFF1ZXVlKS5jYWxsKGUsMCkpLmNhbGwodCkpO3RyeXtmb3Iobi5zKCk7IShyPW4ubigpKS5kb25lOyl7KDAsci52YWx1ZSkoKX19Y2F0Y2godCl7bi5lKHQpfWZpbmFsbHl7bi5mKCl9fSx0cy5wcm90b3R5cGUuYWN0aXZhdGU9ZnVuY3Rpb24oKXt0cy5jdXJyZW50JiZ0cy5jdXJyZW50LmRlYWN0aXZhdGUoKSx0cy5jdXJyZW50PXRoaXMsdGhpcy5hY3RpdmU9ITAsdGhpcy5fZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLl9kb20uY29udGFpbmVyLmNsYXNzTGlzdC5hZGQoXCJ2aXMtYWN0aXZlXCIpLHRoaXMuZW1pdChcImNoYW5nZVwiKSx0aGlzLmVtaXQoXCJhY3RpdmF0ZVwiKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdGhpcy5fZXNjTGlzdGVuZXIpfSx0cy5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWN0aXZlPSExLHRoaXMuX2RvbS5vdmVybGF5LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuX2RvbS5jb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcInZpcy1hY3RpdmVcIiksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMuX2VzY0xpc3RlbmVyKSx0aGlzLmVtaXQoXCJjaGFuZ2VcIiksdGhpcy5lbWl0KFwiZGVhY3RpdmF0ZVwiKX0sdHMucHJvdG90eXBlLl9vblRhcE92ZXJsYXk9ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmF0ZSgpLHQuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCl9O3ZhciBlcz1PdChcIlJlZmxlY3RcIixcImNvbnN0cnVjdFwiKSxycz1vKChmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIShlcygoZnVuY3Rpb24oKXt9KSxbXSx0KWluc3RhbmNlb2YgdCl9KSksbnM9IW8oKGZ1bmN0aW9uKCl7ZXMoKGZ1bmN0aW9uKCl7fSkpfSkpLGlzPXJzfHxucztYKHt0YXJnZXQ6XCJSZWZsZWN0XCIsc3RhdDohMCxmb3JjZWQ6aXMsc2hhbTppc30se2NvbnN0cnVjdDpmdW5jdGlvbih0LGUpe1IodCksTihlKTt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPDM/dDpSKGFyZ3VtZW50c1syXSk7aWYobnMmJiFycylyZXR1cm4gZXModCxlLHIpO2lmKHQ9PXIpe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pfXZhciBuPVtudWxsXTtyZXR1cm4gbi5wdXNoLmFwcGx5KG4sZSksbmV3KGFlLmFwcGx5KHQsbikpfXZhciBpPXIucHJvdG90eXBlLG89SGUoZyhpKT9pOk9iamVjdC5wcm90b3R5cGUpLGE9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LG8sZSk7cmV0dXJuIGcoYSk/YTpvfX0pO3ZhciBvcz1DLlJlZmxlY3QuY29uc3RydWN0LGFzPWR0KFwiQXJyYXlcIikuZW50cmllcyx1cz1BcnJheS5wcm90b3R5cGUsc3M9e0RPTVRva2VuTGlzdDohMCxOb2RlTGlzdDohMH0sY3M9ZnVuY3Rpb24odCl7dmFyIGU9dC5lbnRyaWVzO3JldHVybiB0PT09dXN8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PXVzLmVudHJpZXN8fHNzLmhhc093blByb3BlcnR5KGFyKHQpKT9hczplfSxmcz1yKChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXt2YXIgZSxyPU9iamVjdC5wcm90b3R5cGUsbj1yLmhhc093blByb3BlcnR5LGk9XCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxvPWkuaXRlcmF0b3J8fFwiQEBpdGVyYXRvclwiLGE9aS5hc3luY0l0ZXJhdG9yfHxcIkBAYXN5bmNJdGVyYXRvclwiLHU9aS50b1N0cmluZ1RhZ3x8XCJAQHRvU3RyaW5nVGFnXCI7ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSx0W2VdfXRyeXtzKHt9LFwiXCIpfWNhdGNoKHQpe3M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0W2VdPXJ9fWZ1bmN0aW9uIGModCxlLHIsbil7dmFyIGk9ZSYmZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB5P2U6eSxvPU9iamVjdC5jcmVhdGUoaS5wcm90b3R5cGUpLGE9bmV3IEEobnx8W10pO3JldHVybiBvLl9pbnZva2U9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWw7cmV0dXJuIGZ1bmN0aW9uKGksbyl7aWYobj09PXApdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtpZihuPT09dil7aWYoXCJ0aHJvd1wiPT09aSl0aHJvdyBvO3JldHVybiBJKCl9Zm9yKHIubWV0aG9kPWksci5hcmc9bzs7KXt2YXIgYT1yLmRlbGVnYXRlO2lmKGEpe3ZhciB1PVMoYSxyKTtpZih1KXtpZih1PT09ZCljb250aW51ZTtyZXR1cm4gdX19aWYoXCJuZXh0XCI9PT1yLm1ldGhvZClyLnNlbnQ9ci5fc2VudD1yLmFyZztlbHNlIGlmKFwidGhyb3dcIj09PXIubWV0aG9kKXtpZihuPT09bCl0aHJvdyBuPXYsci5hcmc7ci5kaXNwYXRjaEV4Y2VwdGlvbihyLmFyZyl9ZWxzZVwicmV0dXJuXCI9PT1yLm1ldGhvZCYmci5hYnJ1cHQoXCJyZXR1cm5cIixyLmFyZyk7bj1wO3ZhciBzPWYodCxlLHIpO2lmKFwibm9ybWFsXCI9PT1zLnR5cGUpe2lmKG49ci5kb25lP3Y6aCxzLmFyZz09PWQpY29udGludWU7cmV0dXJue3ZhbHVlOnMuYXJnLGRvbmU6ci5kb25lfX1cInRocm93XCI9PT1zLnR5cGUmJihuPXYsci5tZXRob2Q9XCJ0aHJvd1wiLHIuYXJnPXMuYXJnKX19fSh0LHIsYSksb31mdW5jdGlvbiBmKHQsZSxyKXt0cnl7cmV0dXJue3R5cGU6XCJub3JtYWxcIixhcmc6dC5jYWxsKGUscil9fWNhdGNoKHQpe3JldHVybnt0eXBlOlwidGhyb3dcIixhcmc6dH19fXQud3JhcD1jO3ZhciBsPVwic3VzcGVuZGVkU3RhcnRcIixoPVwic3VzcGVuZGVkWWllbGRcIixwPVwiZXhlY3V0aW5nXCIsdj1cImNvbXBsZXRlZFwiLGQ9e307ZnVuY3Rpb24geSgpe31mdW5jdGlvbiBnKCl7fWZ1bmN0aW9uIG0oKXt9dmFyIGI9e307YltvXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgXz1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz1fJiZfKF8oaihbXSkpKTt3JiZ3IT09ciYmbi5jYWxsKHcsbykmJihiPXcpO3ZhciBFPW0ucHJvdG90eXBlPXkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gTyh0KXtbXCJuZXh0XCIsXCJ0aHJvd1wiLFwicmV0dXJuXCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ModCxlLChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KSl9KSl9ZnVuY3Rpb24gVCh0LGUpe2Z1bmN0aW9uIHIoaSxvLGEsdSl7dmFyIHM9Zih0W2ldLHQsbyk7aWYoXCJ0aHJvd1wiIT09cy50eXBlKXt2YXIgYz1zLmFyZyxsPWMudmFsdWU7cmV0dXJuIGwmJlwib2JqZWN0XCI9PXR5cGVvZiBsJiZuLmNhbGwobCxcIl9fYXdhaXRcIik/ZS5yZXNvbHZlKGwuX19hd2FpdCkudGhlbigoZnVuY3Rpb24odCl7cihcIm5leHRcIix0LGEsdSl9KSwoZnVuY3Rpb24odCl7cihcInRocm93XCIsdCxhLHUpfSkpOmUucmVzb2x2ZShsKS50aGVuKChmdW5jdGlvbih0KXtjLnZhbHVlPXQsYShjKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gcihcInRocm93XCIsdCxhLHUpfSkpfXUocy5hcmcpfXZhciBpO3RoaXMuX2ludm9rZT1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIG8oKXtyZXR1cm4gbmV3IGUoKGZ1bmN0aW9uKGUsaSl7cih0LG4sZSxpKX0pKX1yZXR1cm4gaT1pP2kudGhlbihvLG8pOm8oKX19ZnVuY3Rpb24gUyh0LHIpe3ZhciBuPXQuaXRlcmF0b3Jbci5tZXRob2RdO2lmKG49PT1lKXtpZihyLmRlbGVnYXRlPW51bGwsXCJ0aHJvd1wiPT09ci5tZXRob2Qpe2lmKHQuaXRlcmF0b3IucmV0dXJuJiYoci5tZXRob2Q9XCJyZXR1cm5cIixyLmFyZz1lLFModCxyKSxcInRocm93XCI9PT1yLm1ldGhvZCkpcmV0dXJuIGQ7ci5tZXRob2Q9XCJ0aHJvd1wiLHIuYXJnPW5ldyBUeXBlRXJyb3IoXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpfXJldHVybiBkfXZhciBpPWYobix0Lml0ZXJhdG9yLHIuYXJnKTtpZihcInRocm93XCI9PT1pLnR5cGUpcmV0dXJuIHIubWV0aG9kPVwidGhyb3dcIixyLmFyZz1pLmFyZyxyLmRlbGVnYXRlPW51bGwsZDt2YXIgbz1pLmFyZztyZXR1cm4gbz9vLmRvbmU/KHJbdC5yZXN1bHROYW1lXT1vLnZhbHVlLHIubmV4dD10Lm5leHRMb2MsXCJyZXR1cm5cIiE9PXIubWV0aG9kJiYoci5tZXRob2Q9XCJuZXh0XCIsci5hcmc9ZSksci5kZWxlZ2F0ZT1udWxsLGQpOm86KHIubWV0aG9kPVwidGhyb3dcIixyLmFyZz1uZXcgVHlwZUVycm9yKFwiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3RcIiksci5kZWxlZ2F0ZT1udWxsLGQpfWZ1bmN0aW9uIHgodCl7dmFyIGU9e3RyeUxvYzp0WzBdfTsxIGluIHQmJihlLmNhdGNoTG9jPXRbMV0pLDIgaW4gdCYmKGUuZmluYWxseUxvYz10WzJdLGUuYWZ0ZXJMb2M9dFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goZSl9ZnVuY3Rpb24gayh0KXt2YXIgZT10LmNvbXBsZXRpb258fHt9O2UudHlwZT1cIm5vcm1hbFwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzpcInJvb3RcIn1dLHQuZm9yRWFjaCh4LHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIGoodCl7aWYodCl7dmFyIHI9dFtvXTtpZihyKXJldHVybiByLmNhbGwodCk7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC5uZXh0KXJldHVybiB0O2lmKCFpc05hTih0Lmxlbmd0aCkpe3ZhciBpPS0xLGE9ZnVuY3Rpb24gcigpe2Zvcig7KytpPHQubGVuZ3RoOylpZihuLmNhbGwodCxpKSlyZXR1cm4gci52YWx1ZT10W2ldLHIuZG9uZT0hMSxyO3JldHVybiByLnZhbHVlPWUsci5kb25lPSEwLHJ9O3JldHVybiBhLm5leHQ9YX19cmV0dXJue25leHQ6SX19ZnVuY3Rpb24gSSgpe3JldHVybnt2YWx1ZTplLGRvbmU6ITB9fXJldHVybiBnLnByb3RvdHlwZT1FLmNvbnN0cnVjdG9yPW0sbS5jb25zdHJ1Y3Rvcj1nLGcuZGlzcGxheU5hbWU9cyhtLHUsXCJHZW5lcmF0b3JGdW5jdGlvblwiKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4hIWUmJihlPT09Z3x8XCJHZW5lcmF0b3JGdW5jdGlvblwiPT09KGUuZGlzcGxheU5hbWV8fGUubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YodCxtKToodC5fX3Byb3RvX189bSxzKHQsdSxcIkdlbmVyYXRvckZ1bmN0aW9uXCIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEUpLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LE8oVC5wcm90b3R5cGUpLFQucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj1ULHQuYXN5bmM9ZnVuY3Rpb24oZSxyLG4saSxvKXt2b2lkIDA9PT1vJiYobz1Qcm9taXNlKTt2YXIgYT1uZXcgVChjKGUscixuLGkpLG8pO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24ocik/YTphLm5leHQoKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kb25lP3QudmFsdWU6YS5uZXh0KCl9KSl9LE8oRSkscyhFLHUsXCJHZW5lcmF0b3JcIiksRVtvXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxFLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuXCJbb2JqZWN0IEdlbmVyYXRvcl1cIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaChyKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gcigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgbj1lLnBvcCgpO2lmKG4gaW4gdClyZXR1cm4gci52YWx1ZT1uLHIuZG9uZT0hMSxyfXJldHVybiByLmRvbmU9ITAscn19LHQudmFsdWVzPWosQS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkEscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPVwibmV4dFwiLHRoaXMuYXJnPWUsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goayksIXQpZm9yKHZhciByIGluIHRoaXMpXCJ0XCI9PT1yLmNoYXJBdCgwKSYmbi5jYWxsKHRoaXMscikmJiFpc05hTigrci5zbGljZSgxKSkmJih0aGlzW3JdPWUpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciB0PXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKFwidGhyb3dcIj09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgcj10aGlzO2Z1bmN0aW9uIGkobixpKXtyZXR1cm4gdS50eXBlPVwidGhyb3dcIix1LmFyZz10LHIubmV4dD1uLGkmJihyLm1ldGhvZD1cIm5leHRcIixyLmFyZz1lKSwhIWl9Zm9yKHZhciBvPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIGE9dGhpcy50cnlFbnRyaWVzW29dLHU9YS5jb21wbGV0aW9uO2lmKFwicm9vdFwiPT09YS50cnlMb2MpcmV0dXJuIGkoXCJlbmRcIik7aWYoYS50cnlMb2M8PXRoaXMucHJldil7dmFyIHM9bi5jYWxsKGEsXCJjYXRjaExvY1wiKSxjPW4uY2FsbChhLFwiZmluYWxseUxvY1wiKTtpZihzJiZjKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gaShhLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBpKGEuZmluYWxseUxvYyl9ZWxzZSBpZihzKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gaShhLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO2lmKHRoaXMucHJldjxhLmZpbmFsbHlMb2MpcmV0dXJuIGkoYS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtyPj0wOy0tcil7dmFyIGk9dGhpcy50cnlFbnRyaWVzW3JdO2lmKGkudHJ5TG9jPD10aGlzLnByZXYmJm4uY2FsbChpLFwiZmluYWxseUxvY1wiKSYmdGhpcy5wcmV2PGkuZmluYWxseUxvYyl7dmFyIG89aTticmVha319byYmKFwiYnJlYWtcIj09PXR8fFwiY29udGludWVcIj09PXQpJiZvLnRyeUxvYzw9ZSYmZTw9by5maW5hbGx5TG9jJiYobz1udWxsKTt2YXIgYT1vP28uY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPXQsYS5hcmc9ZSxvPyh0aGlzLm1ldGhvZD1cIm5leHRcIix0aGlzLm5leHQ9by5maW5hbGx5TG9jLGQpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKHQsZSl7aWYoXCJ0aHJvd1wiPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVyblwiYnJlYWtcIj09PXQudHlwZXx8XCJjb250aW51ZVwiPT09dC50eXBlP3RoaXMubmV4dD10LmFyZzpcInJldHVyblwiPT09dC50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9dC5hcmcsdGhpcy5tZXRob2Q9XCJyZXR1cm5cIix0aGlzLm5leHQ9XCJlbmRcIik6XCJub3JtYWxcIj09PXQudHlwZSYmZSYmKHRoaXMubmV4dD1lKSxkfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIHI9dGhpcy50cnlFbnRyaWVzW2VdO2lmKHIuZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUoci5jb21wbGV0aW9uLHIuYWZ0ZXJMb2MpLGsociksZH19LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciByPXRoaXMudHJ5RW50cmllc1tlXTtpZihyLnRyeUxvYz09PXQpe3ZhciBuPXIuY29tcGxldGlvbjtpZihcInRocm93XCI9PT1uLnR5cGUpe3ZhciBpPW4uYXJnO2socil9cmV0dXJuIGl9fXRocm93IG5ldyBFcnJvcihcImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdFwiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOmoodCkscmVzdWx0TmFtZTpyLG5leHRMb2M6bn0sXCJuZXh0XCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLGR9fSx0fSh0LmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9ZX1jYXRjaCh0KXtGdW5jdGlvbihcInJcIixcInJlZ2VuZXJhdG9yUnVudGltZSA9IHJcIikoZSl9fSkpLGxzPVZvLGhzPWR0KFwiQXJyYXlcIikudmFsdWVzLHBzPUFycmF5LnByb3RvdHlwZSx2cz17RE9NVG9rZW5MaXN0OiEwLE5vZGVMaXN0OiEwfSxkcz1mdW5jdGlvbih0KXt2YXIgZT10LnZhbHVlcztyZXR1cm4gdD09PXBzfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1wcy52YWx1ZXN8fHZzLmhhc093blByb3BlcnR5KGFyKHQpKT9oczplfSx5cz1bXSxncz15cy5zb3J0LG1zPW8oKGZ1bmN0aW9uKCl7eXMuc29ydCh2b2lkIDApfSkpLGJzPW8oKGZ1bmN0aW9uKCl7eXMuc29ydChudWxsKX0pKSxfcz1KdChcInNvcnRcIik7WCh7dGFyZ2V0OlwiQXJyYXlcIixwcm90bzohMCxmb3JjZWQ6bXN8fCFic3x8IV9zfSx7c29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9ncy5jYWxsKEsodGhpcykpOmdzLmNhbGwoSyh0aGlzKSxSKHQpKX19KTt2YXIgd3M9ZHQoXCJBcnJheVwiKS5zb3J0LEVzPUFycmF5LnByb3RvdHlwZSxPcz1mdW5jdGlvbih0KXt2YXIgZT10LnNvcnQ7cmV0dXJuIHQ9PT1Fc3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09RXMuc29ydD93czplfSxUcz1kdChcIkFycmF5XCIpLmtleXMsU3M9QXJyYXkucHJvdG90eXBlLHhzPXtET01Ub2tlbkxpc3Q6ITAsTm9kZUxpc3Q6ITB9LGtzPWZ1bmN0aW9uKHQpe3ZhciBlPXQua2V5cztyZXR1cm4gdD09PVNzfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1Tcy5rZXlzfHx4cy5oYXNPd25Qcm9wZXJ0eShhcih0KSk/VHM6ZX0sQXM9d3Quc29tZSxqcz1KdChcInNvbWVcIiksSXM9Q3QoXCJzb21lXCIpO1goe3RhcmdldDpcIkFycmF5XCIscHJvdG86ITAsZm9yY2VkOiFqc3x8IUlzfSx7c29tZTpmdW5jdGlvbih0KXtyZXR1cm4gQXModGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KTt2YXIgUHM9ZHQoXCJBcnJheVwiKS5zb21lLERzPUFycmF5LnByb3RvdHlwZSxMcz1mdW5jdGlvbih0KXt2YXIgZT10LnNvbWU7cmV0dXJuIHQ9PT1Ec3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09RHMuc29tZT9QczplfSxDcz0hbygoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pKSxScz1yKChmdW5jdGlvbih0KXt2YXIgZT16LmYscj1pdChcIm1ldGFcIiksbj0wLGk9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sbz1mdW5jdGlvbih0KXtlKHQscix7dmFsdWU6e29iamVjdElEOlwiT1wiKyArK24sd2Vha0RhdGE6e319fSl9LGE9dC5leHBvcnRzPXtSRVFVSVJFRDohMSxmYXN0S2V5OmZ1bmN0aW9uKHQsZSl7aWYoIWcodCkpcmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHQ/dDooXCJzdHJpbmdcIj09dHlwZW9mIHQ/XCJTXCI6XCJQXCIpK3Q7aWYoIV8odCxyKSl7aWYoIWkodCkpcmV0dXJuXCJGXCI7aWYoIWUpcmV0dXJuXCJFXCI7byh0KX1yZXR1cm4gdFtyXS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24odCxlKXtpZighXyh0LHIpKXtpZighaSh0KSlyZXR1cm4hMDtpZighZSlyZXR1cm4hMTtvKHQpfXJldHVybiB0W3JdLndlYWtEYXRhfSxvbkZyZWV6ZTpmdW5jdGlvbih0KXtyZXR1cm4gQ3MmJmEuUkVRVUlSRUQmJmkodCkmJiFfKHQscikmJm8odCksdH19O09lW3JdPSEwfSkpLE1zPWZ1bmN0aW9uKHQsZSl7dGhpcy5zdG9wcGVkPXQsdGhpcy5yZXN1bHQ9ZX0sTnM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuLGksbyxhLHUscyxjLGY9ciYmci50aGF0LGw9ISghcnx8IXIuQVNfRU5UUklFUyksaD0hKCFyfHwhci5JU19JVEVSQVRPUikscD0hKCFyfHwhci5JTlRFUlJVUFRFRCksdj1NKGUsZiwxK2wrcCksZD1mdW5jdGlvbih0KXtyZXR1cm4gbiYmcW4obiksbmV3IE1zKCEwLHQpfSx5PWZ1bmN0aW9uKHQpe3JldHVybiBsPyhOKHQpLHA/dih0WzBdLHRbMV0sZCk6dih0WzBdLHRbMV0pKTpwP3YodCxkKTp2KHQpfTtpZihoKW49dDtlbHNle2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mKGk9Tm4odCkpKXRocm93IFR5cGVFcnJvcihcIlRhcmdldCBpcyBub3QgaXRlcmFibGVcIik7aWYoVm4oaSkpe2ZvcihvPTAsYT1KKHQubGVuZ3RoKTthPm87bysrKWlmKCh1PXkodFtvXSkpJiZ1IGluc3RhbmNlb2YgTXMpcmV0dXJuIHU7cmV0dXJuIG5ldyBNcyghMSl9bj1pLmNhbGwodCl9Zm9yKHM9bi5uZXh0OyEoYz1zLmNhbGwobikpLmRvbmU7KXt0cnl7dT15KGMudmFsdWUpfWNhdGNoKHQpe3Rocm93IHFuKG4pLHR9aWYoXCJvYmplY3RcIj09dHlwZW9mIHUmJnUmJnUgaW5zdGFuY2VvZiBNcylyZXR1cm4gdX1yZXR1cm4gbmV3IE1zKCExKX0sRnM9ZnVuY3Rpb24odCxlLHIpe2lmKCEodCBpbnN0YW5jZW9mIGUpKXRocm93IFR5cGVFcnJvcihcIkluY29ycmVjdCBcIisocj9yK1wiIFwiOlwiXCIpK1wiaW52b2NhdGlvblwiKTtyZXR1cm4gdH0senM9ei5mLHFzPXd0LmZvckVhY2gsWXM9VHIuc2V0LFVzPVRyLmdldHRlckZvcixYcz1mdW5jdGlvbih0LGUscil7dmFyIG4sdT0tMSE9PXQuaW5kZXhPZihcIk1hcFwiKSxzPS0xIT09dC5pbmRleE9mKFwiV2Vha1wiKSxjPXU/XCJzZXRcIjpcImFkZFwiLGY9aVt0XSxsPWYmJmYucHJvdG90eXBlLGg9e307aWYoYSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZiYmKHN8fGwuZm9yRWFjaCYmIW8oKGZ1bmN0aW9uKCl7KG5ldyBmKS5lbnRyaWVzKCkubmV4dCgpfSkpKSl7bj1lKChmdW5jdGlvbihlLHIpe1lzKEZzKGUsbix0KSx7dHlwZTp0LGNvbGxlY3Rpb246bmV3IGZ9KSxudWxsIT1yJiZOcyhyLGVbY10se3RoYXQ6ZSxBU19FTlRSSUVTOnV9KX0pKTt2YXIgcD1Vcyh0KTtxcyhbXCJhZGRcIixcImNsZWFyXCIsXCJkZWxldGVcIixcImZvckVhY2hcIixcImdldFwiLFwiaGFzXCIsXCJzZXRcIixcImtleXNcIixcInZhbHVlc1wiLFwiZW50cmllc1wiXSwoZnVuY3Rpb24odCl7dmFyIGU9XCJhZGRcIj09dHx8XCJzZXRcIj09dDshKHQgaW4gbCl8fHMmJlwiY2xlYXJcIj09dHx8cShuLnByb3RvdHlwZSx0LChmdW5jdGlvbihyLG4pe3ZhciBpPXAodGhpcykuY29sbGVjdGlvbjtpZighZSYmcyYmIWcocikpcmV0dXJuXCJnZXRcIj09dCYmdm9pZCAwO3ZhciBvPWlbdF0oMD09PXI/MDpyLG4pO3JldHVybiBlP3RoaXM6b30pKX0pKSxzfHx6cyhuLnByb3RvdHlwZSxcInNpemVcIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBwKHRoaXMpLmNvbGxlY3Rpb24uc2l6ZX19KX1lbHNlIG49ci5nZXRDb25zdHJ1Y3RvcihlLHQsdSxjKSxScy5SRVFVSVJFRD0hMDtyZXR1cm4gZnIobix0LCExLCEwKSxoW3RdPW4sWCh7Z2xvYmFsOiEwLGZvcmNlZDohMH0saCksc3x8ci5zZXRTdHJvbmcobix0LHUpLG59LFZzPWZ1bmN0aW9uKHQsZSxyKXtmb3IodmFyIG4gaW4gZSlyJiZyLnVuc2FmZSYmdFtuXT90W25dPWVbbl06S2UodCxuLGVbbl0scik7cmV0dXJuIHR9LFdzPWZ0KFwic3BlY2llc1wiKSxHcz16LmYsSHM9UnMuZmFzdEtleSwkcz1Uci5zZXQsSnM9VHIuZ2V0dGVyRm9yLFFzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbih0LGUscixuKXt2YXIgaT10KChmdW5jdGlvbih0LG8pe0ZzKHQsaSxlKSwkcyh0LHt0eXBlOmUsaW5kZXg6SGUobnVsbCksZmlyc3Q6dm9pZCAwLGxhc3Q6dm9pZCAwLHNpemU6MH0pLGF8fCh0LnNpemU9MCksbnVsbCE9byYmTnMobyx0W25dLHt0aGF0OnQsQVNfRU5UUklFUzpyfSl9KSksbz1KcyhlKSx1PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLHU9byh0KSxjPXModCxlKTtyZXR1cm4gYz9jLnZhbHVlPXI6KHUubGFzdD1jPXtpbmRleDppPUhzKGUsITApLGtleTplLHZhbHVlOnIscHJldmlvdXM6bj11Lmxhc3QsbmV4dDp2b2lkIDAscmVtb3ZlZDohMX0sdS5maXJzdHx8KHUuZmlyc3Q9YyksbiYmKG4ubmV4dD1jKSxhP3Uuc2l6ZSsrOnQuc2l6ZSsrLFwiRlwiIT09aSYmKHUuaW5kZXhbaV09YykpLHR9LHM9ZnVuY3Rpb24odCxlKXt2YXIgcixuPW8odCksaT1IcyhlKTtpZihcIkZcIiE9PWkpcmV0dXJuIG4uaW5kZXhbaV07Zm9yKHI9bi5maXJzdDtyO3I9ci5uZXh0KWlmKHIua2V5PT1lKXJldHVybiByfTtyZXR1cm4gVnMoaS5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PW8odGhpcyksZT10LmluZGV4LHI9dC5maXJzdDtyOylyLnJlbW92ZWQ9ITAsci5wcmV2aW91cyYmKHIucHJldmlvdXM9ci5wcmV2aW91cy5uZXh0PXZvaWQgMCksZGVsZXRlIGVbci5pbmRleF0scj1yLm5leHQ7dC5maXJzdD10Lmxhc3Q9dm9pZCAwLGE/dC5zaXplPTA6dGhpcy5zaXplPTB9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLHI9byhlKSxuPXMoZSx0KTtpZihuKXt2YXIgaT1uLm5leHQsdT1uLnByZXZpb3VzO2RlbGV0ZSByLmluZGV4W24uaW5kZXhdLG4ucmVtb3ZlZD0hMCx1JiYodS5uZXh0PWkpLGkmJihpLnByZXZpb3VzPXUpLHIuZmlyc3Q9PW4mJihyLmZpcnN0PWkpLHIubGFzdD09biYmKHIubGFzdD11KSxhP3Iuc2l6ZS0tOmUuc2l6ZS0tfXJldHVybiEhbn0sZm9yRWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUscj1vKHRoaXMpLG49TSh0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO2U9ZT9lLm5leHQ6ci5maXJzdDspZm9yKG4oZS52YWx1ZSxlLmtleSx0aGlzKTtlJiZlLnJlbW92ZWQ7KWU9ZS5wcmV2aW91c30saGFzOmZ1bmN0aW9uKHQpe3JldHVybiEhcyh0aGlzLHQpfX0pLFZzKGkucHJvdG90eXBlLHI/e2dldDpmdW5jdGlvbih0KXt2YXIgZT1zKHRoaXMsdCk7cmV0dXJuIGUmJmUudmFsdWV9LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB1KHRoaXMsMD09PXQ/MDp0LGUpfX06e2FkZDpmdW5jdGlvbih0KXtyZXR1cm4gdSh0aGlzLHQ9MD09PXQ/MDp0LHQpfX0pLGEmJkdzKGkucHJvdG90eXBlLFwic2l6ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzKS5zaXplfX0pLGl9LHNldFN0cm9uZzpmdW5jdGlvbih0LGUscil7dmFyIG49ZStcIiBJdGVyYXRvclwiLGk9SnMoZSksbz1KcyhuKTtPbih0LGUsKGZ1bmN0aW9uKHQsZSl7JHModGhpcyx7dHlwZTpuLHRhcmdldDp0LHN0YXRlOmkodCksa2luZDplLGxhc3Q6dm9pZCAwfSl9KSwoZnVuY3Rpb24oKXtmb3IodmFyIHQ9byh0aGlzKSxlPXQua2luZCxyPXQubGFzdDtyJiZyLnJlbW92ZWQ7KXI9ci5wcmV2aW91cztyZXR1cm4gdC50YXJnZXQmJih0Lmxhc3Q9cj1yP3IubmV4dDp0LnN0YXRlLmZpcnN0KT9cImtleXNcIj09ZT97dmFsdWU6ci5rZXksZG9uZTohMX06XCJ2YWx1ZXNcIj09ZT97dmFsdWU6ci52YWx1ZSxkb25lOiExfTp7dmFsdWU6W3Iua2V5LHIudmFsdWVdLGRvbmU6ITF9Oih0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSl9KSxyP1wiZW50cmllc1wiOlwidmFsdWVzXCIsIXIsITApLGZ1bmN0aW9uKHQpe3ZhciBlPU90KHQpLHI9ei5mO2EmJmUmJiFlW1dzXSYmcihlLFdzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9KGUpfX0sQnM9KFhzKFwiTWFwXCIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxRcyksQy5NYXApLEtzPWZpO1goe3RhcmdldDpcIk9iamVjdFwiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpkbn0pO3ZhciBacz1DLk9iamVjdC5zZXRQcm90b3R5cGVPZix0Yz1yKChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKHIsbil7cmV0dXJuIHQuZXhwb3J0cz1lPVpzfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LGUocixuKX10LmV4cG9ydHM9ZX0pKTt2YXIgZWM9ZnVuY3Rpb24odCxlKXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7dC5wcm90b3R5cGU9S3MoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZ0Yyh0LGUpfTt2YXIgcmM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIHR9O3ZhciBuYyxpYz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHxcIm9iamVjdFwiIT09R28oZSkmJlwiZnVuY3Rpb25cIiE9dHlwZW9mIGU/cmModCk6ZX0sb2M9Q2ksYWM9cigoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShyKXtyZXR1cm4gdC5leHBvcnRzPWU9WnM/b2M6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxvYyh0KX0sZShyKX10LmV4cG9ydHM9ZX0pKSx1Yz1uZXcgVWludDhBcnJheSgxNik7ZnVuY3Rpb24gc2MoKXtpZighbmMmJiEobmM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fFwidW5kZWZpbmVkXCIhPXR5cGVvZiBtc0NyeXB0byYmXCJmdW5jdGlvblwiPT10eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0bykpKXRocm93IG5ldyBFcnJvcihcImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkXCIpO3JldHVybiBuYyh1Yyl9dmFyIGNjPS9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtmdW5jdGlvbiBmYyh0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdCYmY2MudGVzdCh0KX1mb3IodmFyIGxjPVtdLGhjPTA7aGM8MjU2OysraGMpbGMucHVzaCgoaGMrMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtmdW5jdGlvbiBwYyh0LGUscil7dmFyIG49KHQ9dHx8e30pLnJhbmRvbXx8KHQucm5nfHxzYykoKTtpZihuWzZdPTE1Jm5bNl18NjQsbls4XT02MyZuWzhdfDEyOCxlKXtyPXJ8fDA7Zm9yKHZhciBpPTA7aTwxNjsrK2kpZVtyK2ldPW5baV07cmV0dXJuIGV9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowLHI9KGxjW3RbZSswXV0rbGNbdFtlKzFdXStsY1t0W2UrMl1dK2xjW3RbZSszXV0rXCItXCIrbGNbdFtlKzRdXStsY1t0W2UrNV1dK1wiLVwiK2xjW3RbZSs2XV0rbGNbdFtlKzddXStcIi1cIitsY1t0W2UrOF1dK2xjW3RbZSs5XV0rXCItXCIrbGNbdFtlKzEwXV0rbGNbdFtlKzExXV0rbGNbdFtlKzEyXV0rbGNbdFtlKzEzXV0rbGNbdFtlKzE0XV0rbGNbdFtlKzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIWZjKHIpKXRocm93IFR5cGVFcnJvcihcIlN0cmluZ2lmaWVkIFVVSUQgaXMgaW52YWxpZFwiKTtyZXR1cm4gcn0obil9ZnVuY3Rpb24gdmModCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHR8fFwibnVtYmVyXCI9PXR5cGVvZiB0fXZhciBkYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7ZmUodGhpcyx0KSx0aGlzLl9xdWV1ZT1bXSx0aGlzLl90aW1lb3V0PW51bGwsdGhpcy5fZXh0ZW5kZWQ9bnVsbCx0aGlzLmRlbGF5PW51bGwsdGhpcy5tYXg9MS8wLHRoaXMuc2V0T3B0aW9ucyhlKX1yZXR1cm4gdmUodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0JiZ2b2lkIDAhPT10LmRlbGF5JiYodGhpcy5kZWxheT10LmRlbGF5KSx0JiZ2b2lkIDAhPT10Lm1heCYmKHRoaXMubWF4PXQubWF4KSx0aGlzLl9mbHVzaElmTmVlZGVkKCl9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5mbHVzaCgpLHRoaXMuX2V4dGVuZGVkKXtmb3IodmFyIHQ9dGhpcy5fZXh0ZW5kZWQub2JqZWN0LGU9dGhpcy5fZXh0ZW5kZWQubWV0aG9kcyxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07bi5vcmlnaW5hbD90W24ubmFtZV09bi5vcmlnaW5hbDpkZWxldGUgdFtuLm5hbWVdfXRoaXMuX2V4dGVuZGVkPW51bGx9fX0se2tleTpcInJlcGxhY2VcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj10W2VdO2lmKCFuKXRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBcIitlK1wiIHVuZGVmaW5lZFwiKTt0W2VdPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspZVtpXT1hcmd1bWVudHNbaV07ci5xdWV1ZSh7YXJnczplLGZuOm4sY29udGV4dDp0aGlzfSl9fX0se2tleTpcInF1ZXVlXCIsdmFsdWU6ZnVuY3Rpb24odCl7XCJmdW5jdGlvblwiPT10eXBlb2YgdD90aGlzLl9xdWV1ZS5wdXNoKHtmbjp0fSk6dGhpcy5fcXVldWUucHVzaCh0KSx0aGlzLl9mbHVzaElmTmVlZGVkKCl9fSx7a2V5OlwiX2ZsdXNoSWZOZWVkZWRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fcXVldWUubGVuZ3RoPnRoaXMubWF4JiZ0aGlzLmZsdXNoKCksbnVsbCE9dGhpcy5fdGltZW91dCYmKGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KSx0aGlzLl90aW1lb3V0PW51bGwpLHRoaXMucXVldWUubGVuZ3RoPjAmJlwibnVtYmVyXCI9PXR5cGVvZiB0aGlzLmRlbGF5JiYodGhpcy5fdGltZW91dD1laSgoZnVuY3Rpb24oKXt0LmZsdXNoKCl9KSx0aGlzLmRlbGF5KSl9fSx7a2V5OlwiZmx1c2hcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0LGU7bG8odD1LaShlPXRoaXMuX3F1ZXVlKS5jYWxsKGUsMCkpLmNhbGwodCwoZnVuY3Rpb24odCl7dC5mbi5hcHBseSh0LmNvbnRleHR8fHQuZm4sdC5hcmdzfHxbXSl9KSl9fV0sW3trZXk6XCJleHRlbmRcIix2YWx1ZTpmdW5jdGlvbihlLHIpe3ZhciBuPW5ldyB0KHIpO2lmKHZvaWQgMCE9PWUuZmx1c2gpdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IG9iamVjdCBhbHJlYWR5IGhhcyBhIHByb3BlcnR5IGZsdXNoXCIpO2UuZmx1c2g9ZnVuY3Rpb24oKXtuLmZsdXNoKCl9O3ZhciBpPVt7bmFtZTpcImZsdXNoXCIsb3JpZ2luYWw6dm9pZCAwfV07aWYociYmci5yZXBsYWNlKWZvcih2YXIgbz0wO288ci5yZXBsYWNlLmxlbmd0aDtvKyspe3ZhciBhPXIucmVwbGFjZVtvXTtpLnB1c2goe25hbWU6YSxvcmlnaW5hbDplW2FdfSksbi5yZXBsYWNlKGUsYSl9cmV0dXJuIG4uX2V4dGVuZGVkPXtvYmplY3Q6ZSxtZXRob2RzOml9LG59fV0pLHR9KCkseWM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZmUodGhpcyx0KSx0aGlzLl9zdWJzY3JpYmVycz17XCIqXCI6W10sYWRkOltdLHJlbW92ZTpbXSx1cGRhdGU6W119LHRoaXMuc3Vic2NyaWJlPXQucHJvdG90eXBlLm9uLHRoaXMudW5zdWJzY3JpYmU9dC5wcm90b3R5cGUub2ZmfXJldHVybiB2ZSh0LFt7a2V5OlwiX3RyaWdnZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUscil7dmFyIG4saTtpZihcIipcIj09PXQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHRyaWdnZXIgZXZlbnQgKlwiKTtsbyhuPWVhKGk9W10pLmNhbGwoaSxLbyh0aGlzLl9zdWJzY3JpYmVyc1t0XSksS28odGhpcy5fc3Vic2NyaWJlcnNbXCIqXCJdKSkpLmNhbGwobiwoZnVuY3Rpb24obil7bih0LGUsbnVsbCE9cj9yOm51bGwpfSkpfX0se2tleTpcIm9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBlJiZ0aGlzLl9zdWJzY3JpYmVyc1t0XS5wdXNoKGUpfX0se2tleTpcIm9mZlwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHI7dGhpcy5fc3Vic2NyaWJlcnNbdF09R3Qocj10aGlzLl9zdWJzY3JpYmVyc1t0XSkuY2FsbChyLChmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KSl9fV0pLHR9KCksZ2M9KFhzKFwiU2V0XCIsKGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19KSxRcyksQy5TZXQpO2Z1bmN0aW9uIG1jKHQsZSl7dmFyIHI7aWYodm9pZCAwPT09cmF8fG51bGw9PXpuKHQpKXtpZihYbyh0KXx8KHI9ZnVuY3Rpb24odCxlKXt2YXIgcjtpZighdClyZXR1cm47aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpcmV0dXJuIGJjKHQsZSk7dmFyIG49JG8ocj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwociw4LC0xKTtcIk9iamVjdFwiPT09biYmdC5jb25zdHJ1Y3RvciYmKG49dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZihcIk1hcFwiPT09bnx8XCJTZXRcIj09PW4pcmV0dXJuIEJuKHQpO2lmKFwiQXJndW1lbnRzXCI9PT1ufHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChuKSlyZXR1cm4gYmModCxlKX0odCkpfHxlJiZ0JiZcIm51bWJlclwiPT10eXBlb2YgdC5sZW5ndGgpe3ImJih0PXIpO3ZhciBuPTAsaT1mdW5jdGlvbigpe307cmV0dXJue3M6aSxuOmZ1bmN0aW9uKCl7cmV0dXJuIG4+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W24rK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6aX19dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpfXZhciBvLGE9ITAsdT0hMTtyZXR1cm57czpmdW5jdGlvbigpe3I9Rm4odCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1yLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXt1PSEwLG89dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1yLnJldHVybnx8ci5yZXR1cm4oKX1maW5hbGx5e2lmKHUpdGhyb3cgb319fX1mdW5jdGlvbiBiYyh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgcj0wLG49bmV3IEFycmF5KGUpO3I8ZTtyKyspbltyXT10W3JdO3JldHVybiBufXZhciBfYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7ZmUodGhpcyx0KSx0aGlzLl9wYWlycz1lfXJldHVybiB2ZSh0LFt7a2V5OmxzLHZhbHVlOmZzLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgZSxyLG4saSxvO3JldHVybiBmcy53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDplPW1jKHRoaXMuX3BhaXJzKSx0LnByZXY9MSxlLnMoKTtjYXNlIDM6aWYoKHI9ZS5uKCkpLmRvbmUpe3QubmV4dD05O2JyZWFrfXJldHVybiBuPXFvKHIudmFsdWUsMiksaT1uWzBdLG89blsxXSx0Lm5leHQ9NyxbaSxvXTtjYXNlIDc6dC5uZXh0PTM7YnJlYWs7Y2FzZSA5OnQubmV4dD0xNDticmVhaztjYXNlIDExOnQucHJldj0xMSx0LnQwPXQuY2F0Y2goMSksZS5lKHQudDApO2Nhc2UgMTQ6cmV0dXJuIHQucHJldj0xNCxlLmYoKSx0LmZpbmlzaCgxNCk7Y2FzZSAxNzpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbMSwxMSwxNCwxN11dKX0pKX0se2tleTpcImVudHJpZXNcIix2YWx1ZTpmcy5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUscixuLGksbztyZXR1cm4gZnMud3JhcCgoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6ZT1tYyh0aGlzLl9wYWlycyksdC5wcmV2PTEsZS5zKCk7Y2FzZSAzOmlmKChyPWUubigpKS5kb25lKXt0Lm5leHQ9OTticmVha31yZXR1cm4gbj1xbyhyLnZhbHVlLDIpLGk9blswXSxvPW5bMV0sdC5uZXh0PTcsW2ksb107Y2FzZSA3OnQubmV4dD0zO2JyZWFrO2Nhc2UgOTp0Lm5leHQ9MTQ7YnJlYWs7Y2FzZSAxMTp0LnByZXY9MTEsdC50MD10LmNhdGNoKDEpLGUuZSh0LnQwKTtjYXNlIDE0OnJldHVybiB0LnByZXY9MTQsZS5mKCksdC5maW5pc2goMTQpO2Nhc2UgMTc6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyxbWzEsMTEsMTQsMTddXSl9KSl9LHtrZXk6XCJrZXlzXCIsdmFsdWU6ZnMubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBlLHIsbixpO3JldHVybiBmcy53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDplPW1jKHRoaXMuX3BhaXJzKSx0LnByZXY9MSxlLnMoKTtjYXNlIDM6aWYoKHI9ZS5uKCkpLmRvbmUpe3QubmV4dD05O2JyZWFrfXJldHVybiBuPXFvKHIudmFsdWUsMSksaT1uWzBdLHQubmV4dD03LGk7Y2FzZSA3OnQubmV4dD0zO2JyZWFrO2Nhc2UgOTp0Lm5leHQ9MTQ7YnJlYWs7Y2FzZSAxMTp0LnByZXY9MTEsdC50MD10LmNhdGNoKDEpLGUuZSh0LnQwKTtjYXNlIDE0OnJldHVybiB0LnByZXY9MTQsZS5mKCksdC5maW5pc2goMTQpO2Nhc2UgMTc6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsdGhpcyxbWzEsMTEsMTQsMTddXSl9KSl9LHtrZXk6XCJ2YWx1ZXNcIix2YWx1ZTpmcy5tYXJrKChmdW5jdGlvbiB0KCl7dmFyIGUscixuLGk7cmV0dXJuIGZzLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOmU9bWModGhpcy5fcGFpcnMpLHQucHJldj0xLGUucygpO2Nhc2UgMzppZigocj1lLm4oKSkuZG9uZSl7dC5uZXh0PTk7YnJlYWt9cmV0dXJuIG49cW8oci52YWx1ZSwyKSxpPW5bMV0sdC5uZXh0PTcsaTtjYXNlIDc6dC5uZXh0PTM7YnJlYWs7Y2FzZSA5OnQubmV4dD0xNDticmVhaztjYXNlIDExOnQucHJldj0xMSx0LnQwPXQuY2F0Y2goMSksZS5lKHQudDApO2Nhc2UgMTQ6cmV0dXJuIHQucHJldj0xNCxlLmYoKSx0LmZpbmlzaCgxNCk7Y2FzZSAxNzpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCx0aGlzLFtbMSwxMSwxNCwxN11dKX0pKX0se2tleTpcInRvSWRBcnJheVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHF0KHQ9S28odGhpcy5fcGFpcnMpKS5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpfX0se2tleTpcInRvSXRlbUFycmF5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gcXQodD1Lbyh0aGlzLl9wYWlycykpLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHRbMV19KSl9fSx7a2V5OlwidG9FbnRyeUFycmF5XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gS28odGhpcy5fcGFpcnMpfX0se2tleTpcInRvT2JqZWN0TWFwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlPWxpKG51bGwpLHI9bWModGhpcy5fcGFpcnMpO3RyeXtmb3Ioci5zKCk7ISh0PXIubigpKS5kb25lOyl7dmFyIG49cW8odC52YWx1ZSwyKSxpPW5bMF0sbz1uWzFdO2VbaV09b319Y2F0Y2godCl7ci5lKHQpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIGV9fSx7a2V5OlwidG9NYXBcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQnModGhpcy5fcGFpcnMpfX0se2tleTpcInRvSWRTZXRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgZ2ModGhpcy50b0lkQXJyYXkoKSl9fSx7a2V5OlwidG9JdGVtU2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGdjKHRoaXMudG9JdGVtQXJyYXkoKSl9fSx7a2V5OlwiY2FjaGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdChLbyh0aGlzLl9wYWlycykpfX0se2tleTpcImRpc3RpbmN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUscj1uZXcgZ2Msbj1tYyh0aGlzLl9wYWlycyk7dHJ5e2ZvcihuLnMoKTshKGU9bi5uKCkpLmRvbmU7KXt2YXIgaT1xbyhlLnZhbHVlLDIpLG89aVswXSxhPWlbMV07ci5hZGQodChhLG8pKX19Y2F0Y2godCl7bi5lKHQpfWZpbmFsbHl7bi5mKCl9cmV0dXJuIHJ9fSx7a2V5OlwiZmlsdGVyXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy5fcGFpcnM7cmV0dXJuIG5ldyB0KHBpKHt9LGxzLGZzLm1hcmsoKGZ1bmN0aW9uIHQoKXt2YXIgbixpLG8sYSx1O3JldHVybiBmcy53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpuPW1jKHIpLHQucHJldj0xLG4ucygpO2Nhc2UgMzppZigoaT1uLm4oKSkuZG9uZSl7dC5uZXh0PTEwO2JyZWFrfWlmKG89cW8oaS52YWx1ZSwyKSxhPW9bMF0sdT1vWzFdLCFlKHUsYSkpe3QubmV4dD04O2JyZWFrfXJldHVybiB0Lm5leHQ9OCxbYSx1XTtjYXNlIDg6dC5uZXh0PTM7YnJlYWs7Y2FzZSAxMDp0Lm5leHQ9MTU7YnJlYWs7Y2FzZSAxMjp0LnByZXY9MTIsdC50MD10LmNhdGNoKDEpLG4uZSh0LnQwKTtjYXNlIDE1OnJldHVybiB0LnByZXY9MTUsbi5mKCksdC5maW5pc2goMTUpO2Nhc2UgMTg6Y2FzZVwiZW5kXCI6cmV0dXJuIHQuc3RvcCgpfX0pLHQsbnVsbCxbWzEsMTIsMTUsMThdXSl9KSkpKX19LHtrZXk6XCJmb3JFYWNoXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUscj1tYyh0aGlzLl9wYWlycyk7dHJ5e2ZvcihyLnMoKTshKGU9ci5uKCkpLmRvbmU7KXt2YXIgbj1xbyhlLnZhbHVlLDIpLGk9blswXTt0KG5bMV0saSl9fWNhdGNoKHQpe3IuZSh0KX1maW5hbGx5e3IuZigpfX19LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgcj10aGlzLl9wYWlycztyZXR1cm4gbmV3IHQocGkoe30sbHMsZnMubWFyaygoZnVuY3Rpb24gdCgpe3ZhciBuLGksbyxhLHU7cmV0dXJuIGZzLndyYXAoKGZ1bmN0aW9uKHQpe2Zvcig7Oylzd2l0Y2godC5wcmV2PXQubmV4dCl7Y2FzZSAwOm49bWMociksdC5wcmV2PTEsbi5zKCk7Y2FzZSAzOmlmKChpPW4ubigpKS5kb25lKXt0Lm5leHQ9OTticmVha31yZXR1cm4gbz1xbyhpLnZhbHVlLDIpLGE9b1swXSx1PW9bMV0sdC5uZXh0PTcsW2EsZSh1LGEpXTtjYXNlIDc6dC5uZXh0PTM7YnJlYWs7Y2FzZSA5OnQubmV4dD0xNDticmVhaztjYXNlIDExOnQucHJldj0xMSx0LnQwPXQuY2F0Y2goMSksbi5lKHQudDApO2Nhc2UgMTQ6cmV0dXJuIHQucHJldj0xNCxuLmYoKSx0LmZpbmlzaCgxNCk7Y2FzZSAxNzpjYXNlXCJlbmRcIjpyZXR1cm4gdC5zdG9wKCl9fSksdCxudWxsLFtbMSwxMSwxNCwxN11dKX0pKSkpfX0se2tleTpcIm1heFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPUZuKHRoaXMuX3BhaXJzKSxyPWUubmV4dCgpO2lmKHIuZG9uZSlyZXR1cm4gbnVsbDtmb3IodmFyIG49ci52YWx1ZVsxXSxpPXQoci52YWx1ZVsxXSxyLnZhbHVlWzBdKTshKHI9ZS5uZXh0KCkpLmRvbmU7KXt2YXIgbz1xbyhyLnZhbHVlLDIpLGE9b1swXSx1PW9bMV0scz10KHUsYSk7cz5pJiYoaT1zLG49dSl9cmV0dXJuIG59fSx7a2V5OlwibWluXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9Rm4odGhpcy5fcGFpcnMpLHI9ZS5uZXh0KCk7aWYoci5kb25lKXJldHVybiBudWxsO2Zvcih2YXIgbj1yLnZhbHVlWzFdLGk9dChyLnZhbHVlWzFdLHIudmFsdWVbMF0pOyEocj1lLm5leHQoKSkuZG9uZTspe3ZhciBvPXFvKHIudmFsdWUsMiksYT1vWzBdLHU9b1sxXSxzPXQodSxhKTtzPGkmJihpPXMsbj11KX1yZXR1cm4gbn19LHtrZXk6XCJyZWR1Y2VcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciByLG49bWModGhpcy5fcGFpcnMpO3RyeXtmb3Iobi5zKCk7IShyPW4ubigpKS5kb25lOyl7dmFyIGk9cW8oci52YWx1ZSwyKSxvPWlbMF07ZT10KGUsaVsxXSxvKX19Y2F0Y2godCl7bi5lKHQpfWZpbmFsbHl7bi5mKCl9cmV0dXJuIGV9fSx7a2V5Olwic29ydFwiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciByPXRoaXM7cmV0dXJuIG5ldyB0KHBpKHt9LGxzLChmdW5jdGlvbigpe3ZhciB0O3JldHVybiBGbihPcyh0PUtvKHIuX3BhaXJzKSkuY2FsbCh0LChmdW5jdGlvbih0LHIpe3ZhciBuPXFvKHQsMiksaT1uWzBdLG89blsxXSxhPXFvKHIsMiksdT1hWzBdLHM9YVsxXTtyZXR1cm4gZShvLHMsaSx1KX0pKSl9KSkpfX1dKSx0fSgpO2Z1bmN0aW9uIHdjKHQsZSl7dmFyIHI9VW8odCk7aWYob24pe3ZhciBuPW9uKHQpO2UmJihuPUd0KG4pLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIHplKHQsZSkuZW51bWVyYWJsZX0pKSksci5wdXNoLmFwcGx5KHIsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gRWModCl7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHIsbj1udWxsIT1hcmd1bWVudHNbZV0/YXJndW1lbnRzW2VdOnt9O2lmKGUlMilsbyhyPXdjKE9iamVjdChuKSwhMCkpLmNhbGwociwoZnVuY3Rpb24oZSl7cGkodCxlLG5bZV0pfSkpO2Vsc2UgaWYoUmUpamUodCxSZShuKSk7ZWxzZXt2YXIgaTtsbyhpPXdjKE9iamVjdChuKSkpLmNhbGwoaSwoZnVuY3Rpb24oZSl7Z2UodCxlLHplKG4sZSkpfSkpfX1yZXR1cm4gdH1mdW5jdGlvbiBPYyh0LGUpe3ZhciByO2lmKHZvaWQgMD09PXJhfHxudWxsPT16bih0KSl7aWYoWG8odCl8fChyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7aWYoIXQpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBUYyh0LGUpO3ZhciBuPSRvKHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKHIsOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBCbih0KTtpZihcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIFRjKHQsZSl9KHQpKXx8ZSYmdCYmXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKXtyJiYodD1yKTt2YXIgbj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiBuPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtuKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgbyxhPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtyPUZuKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9ci5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7dT0hMCxvPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09ci5yZXR1cm58fHIucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IG99fX19ZnVuY3Rpb24gVGModCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIHI9MCxuPW5ldyBBcnJheShlKTtyPGU7cisrKW5bcl09dFtyXTtyZXR1cm4gbn1mdW5jdGlvbiBTYyh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhb3MpcmV0dXJuITE7aWYob3Muc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3MoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcixuPWFjKHQpO2lmKGUpe3ZhciBpPWFjKHRoaXMpLmNvbnN0cnVjdG9yO3I9b3Mobixhcmd1bWVudHMsaSl9ZWxzZSByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpYyh0aGlzLHIpfX12YXIgeGM9ZnVuY3Rpb24odCl7ZWMocix0KTt2YXIgZT1TYyhyKTtmdW5jdGlvbiByKHQsbil7dmFyIGk7cmV0dXJuIGZlKHRoaXMsciksKGk9ZS5jYWxsKHRoaXMpKS5fcXVldWU9bnVsbCx0JiYhWG8odCkmJihuPXQsdD1bXSksaS5fb3B0aW9ucz1ufHx7fSxpLl9kYXRhPW5ldyBCcyxpLmxlbmd0aD0wLGkuX2lkUHJvcD1pLl9vcHRpb25zLmZpZWxkSWR8fFwiaWRcIix0JiZ0Lmxlbmd0aCYmaS5hZGQodCksaS5zZXRPcHRpb25zKG4pLGl9cmV0dXJuIHZlKHIsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dCYmdm9pZCAwIT09dC5xdWV1ZSYmKCExPT09dC5xdWV1ZT90aGlzLl9xdWV1ZSYmKHRoaXMuX3F1ZXVlLmRlc3Ryb3koKSx0aGlzLl9xdWV1ZT1udWxsKToodGhpcy5fcXVldWV8fCh0aGlzLl9xdWV1ZT1kYy5leHRlbmQodGhpcyx7cmVwbGFjZTpbXCJhZGRcIixcInVwZGF0ZVwiLFwicmVtb3ZlXCJdfSkpLHQucXVldWUmJlwib2JqZWN0XCI9PT1Hbyh0LnF1ZXVlKSYmdGhpcy5fcXVldWUuc2V0T3B0aW9ucyh0LnF1ZXVlKSkpfX0se2tleTpcImFkZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10aGlzLGk9W107aWYoWG8odCkpe3ZhciBvPXF0KHQpLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHRbbi5faWRQcm9wXX0pKTtpZihMcyhvKS5jYWxsKG8sKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9kYXRhLmhhcyh0KX0pKSl0aHJvdyBuZXcgRXJyb3IoXCJBIGR1cGxpY2F0ZSBpZCB3YXMgZm91bmQgaW4gdGhlIHBhcmFtZXRlciBhcnJheS5cIik7Zm9yKHZhciBhPTAsdT10Lmxlbmd0aDthPHU7YSsrKXI9dGhpcy5fYWRkSXRlbSh0W2FdKSxpLnB1c2gocil9ZWxzZXtpZighdHx8XCJvYmplY3RcIiE9PUdvKHQpKXRocm93IG5ldyBFcnJvcihcIlVua25vd24gZGF0YVR5cGVcIik7cj10aGlzLl9hZGRJdGVtKHQpLGkucHVzaChyKX1yZXR1cm4gaS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aX0sZSksaX19LHtrZXk6XCJ1cGRhdGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciByPXRoaXMsbj1bXSxpPVtdLG89W10sYT1bXSx1PXRoaXMuX2lkUHJvcCxzPWZ1bmN0aW9uKHQpe3ZhciBlPXRbdV07aWYobnVsbCE9ZSYmci5fZGF0YS5oYXMoZSkpe3ZhciBzPXQsYz1YaSh7fSxyLl9kYXRhLmdldChlKSksZj1yLl91cGRhdGVJdGVtKHMpO2kucHVzaChmKSxhLnB1c2gocyksby5wdXNoKGMpfWVsc2V7dmFyIGw9ci5fYWRkSXRlbSh0KTtuLnB1c2gobCl9fTtpZihYbyh0KSlmb3IodmFyIGM9MCxmPXQubGVuZ3RoO2M8ZjtjKyspdFtjXSYmXCJvYmplY3RcIj09PUdvKHRbY10pP3ModFtjXSk6Y29uc29sZS53YXJuKFwiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCBcIitjKTtlbHNle2lmKCF0fHxcIm9iamVjdFwiIT09R28odCkpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBkYXRhVHlwZVwiKTtzKHQpfWlmKG4ubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOm59LGUpLGkubGVuZ3RoKXt2YXIgbD17aXRlbXM6aSxvbGREYXRhOm8sZGF0YTphfTt0aGlzLl90cmlnZ2VyKFwidXBkYXRlXCIsbCxlKX1yZXR1cm4gZWEobikuY2FsbChuLGkpfX0se2tleTpcInVwZGF0ZU9ubHlcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciByLG49dGhpcztYbyh0KXx8KHQ9W3RdKTt2YXIgaT1xdChyPXF0KHQpLmNhbGwodCwoZnVuY3Rpb24odCl7dmFyIGU9bi5fZGF0YS5nZXQodFtuLl9pZFByb3BdKTtpZihudWxsPT1lKXRocm93IG5ldyBFcnJvcihcIlVwZGF0aW5nIG5vbi1leGlzdGVudCBpdGVtcyBpcyBub3QgYWxsb3dlZC5cIik7cmV0dXJue29sZERhdGE6ZSx1cGRhdGU6dH19KSkpLmNhbGwociwoZnVuY3Rpb24odCl7dmFyIGU9dC5vbGREYXRhLHI9dC51cGRhdGUsaT1lW24uX2lkUHJvcF0sbz1mdW5jdGlvbih0KXtmb3IodmFyIGUscj1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KHI+MT9yLTE6MCksaT0xO2k8cjtpKyspbltpLTFdPWFyZ3VtZW50c1tpXTtyZXR1cm4gSnUuYXBwbHkodm9pZCAwLGVhKGU9W3t9LHRdKS5jYWxsKGUsbikpfShlLHIpO3JldHVybiBuLl9kYXRhLnNldChpLG8pLHtpZDppLG9sZERhdGE6ZSx1cGRhdGVkRGF0YTpvfX0pKTtpZihpLmxlbmd0aCl7dmFyIG89e2l0ZW1zOnF0KGkpLmNhbGwoaSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuaWR9KSksb2xkRGF0YTpxdChpKS5jYWxsKGksKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm9sZERhdGF9KSksZGF0YTpxdChpKS5jYWxsKGksKGZ1bmN0aW9uKHQpe3JldHVybiB0LnVwZGF0ZWREYXRhfSkpfTtyZXR1cm4gdGhpcy5fdHJpZ2dlcihcInVwZGF0ZVwiLG8sZSksby5pdGVtc31yZXR1cm5bXX19LHtrZXk6XCJnZXRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciByPXZvaWQgMCxuPXZvaWQgMCxpPXZvaWQgMDt2Yyh0KT8ocj10LGk9ZSk6WG8odCk/KG49dCxpPWUpOmk9dDt2YXIgbyxhPWkmJlwiT2JqZWN0XCI9PT1pLnJldHVyblR5cGU/XCJPYmplY3RcIjpcIkFycmF5XCIsdT1pJiZHdChpKSxzPVtdLGM9dm9pZCAwLGY9dm9pZCAwLGw9dm9pZCAwO2lmKG51bGwhPXIpKGM9dGhpcy5fZGF0YS5nZXQocikpJiZ1JiYhdShjKSYmKGM9dm9pZCAwKTtlbHNlIGlmKG51bGwhPW4pZm9yKHZhciBoPTAscD1uLmxlbmd0aDtoPHA7aCsrKW51bGw9PShjPXRoaXMuX2RhdGEuZ2V0KG5baF0pKXx8dSYmIXUoYyl8fHMucHVzaChjKTtlbHNlIGZvcih2YXIgdixkPTAseT0oZj1Lbyhrcyh2PXRoaXMuX2RhdGEpLmNhbGwodikpKS5sZW5ndGg7ZDx5O2QrKylsPWZbZF0sbnVsbD09KGM9dGhpcy5fZGF0YS5nZXQobCkpfHx1JiYhdShjKXx8cy5wdXNoKGMpO2lmKGkmJmkub3JkZXImJm51bGw9PXImJnRoaXMuX3NvcnQocyxpLm9yZGVyKSxpJiZpLmZpZWxkcyl7dmFyIGc9aS5maWVsZHM7aWYobnVsbCE9ciYmbnVsbCE9YyljPXRoaXMuX2ZpbHRlckZpZWxkcyhjLGcpO2Vsc2UgZm9yKHZhciBtPTAsYj1zLmxlbmd0aDttPGI7bSsrKXNbbV09dGhpcy5fZmlsdGVyRmllbGRzKHNbbV0sZyl9aWYoXCJPYmplY3RcIj09YSl7Zm9yKHZhciBfPXt9LHc9MCxFPXMubGVuZ3RoO3c8RTt3Kyspe3ZhciBPPXNbd107X1tPW3RoaXMuX2lkUHJvcF1dPU99cmV0dXJuIF99cmV0dXJuIG51bGwhPXI/bnVsbCE9PShvPWMpJiZ2b2lkIDAhPT1vP286bnVsbDpzfX0se2tleTpcImdldElkc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2RhdGEscj10JiZHdCh0KSxuPXQmJnQub3JkZXIsaT1LbyhrcyhlKS5jYWxsKGUpKSxvPVtdO2lmKHIpaWYobil7Zm9yKHZhciBhPVtdLHU9MCxzPWkubGVuZ3RoO3U8czt1Kyspe3ZhciBjPWlbdV0sZj10aGlzLl9kYXRhLmdldChjKTtudWxsIT1mJiZyKGYpJiZhLnB1c2goZil9dGhpcy5fc29ydChhLG4pO2Zvcih2YXIgbD0wLGg9YS5sZW5ndGg7bDxoO2wrKylvLnB1c2goYVtsXVt0aGlzLl9pZFByb3BdKX1lbHNlIGZvcih2YXIgcD0wLHY9aS5sZW5ndGg7cDx2O3ArKyl7dmFyIGQ9aVtwXSx5PXRoaXMuX2RhdGEuZ2V0KGQpO251bGwhPXkmJnIoeSkmJm8ucHVzaCh5W3RoaXMuX2lkUHJvcF0pfWVsc2UgaWYobil7Zm9yKHZhciBnPVtdLG09MCxiPWkubGVuZ3RoO208YjttKyspe3ZhciBfPWlbbV07Zy5wdXNoKGUuZ2V0KF8pKX10aGlzLl9zb3J0KGcsbik7Zm9yKHZhciB3PTAsRT1nLmxlbmd0aDt3PEU7dysrKW8ucHVzaChnW3ddW3RoaXMuX2lkUHJvcF0pfWVsc2UgZm9yKHZhciBPPTAsVD1pLmxlbmd0aDtPPFQ7TysrKXt2YXIgUz1pW09dLHg9ZS5nZXQoUyk7bnVsbCE9eCYmby5wdXNoKHhbdGhpcy5faWRQcm9wXSl9cmV0dXJuIG99fSx7a2V5OlwiZ2V0RGF0YVNldFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSx7a2V5OlwiZm9yRWFjaFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHI9ZSYmR3QoZSksbj10aGlzLl9kYXRhLGk9S28oa3MobikuY2FsbChuKSk7aWYoZSYmZS5vcmRlcilmb3IodmFyIG89dGhpcy5nZXQoZSksYT0wLHU9by5sZW5ndGg7YTx1O2ErKyl7dmFyIHM9b1thXTt0KHMsc1t0aGlzLl9pZFByb3BdKX1lbHNlIGZvcih2YXIgYz0wLGY9aS5sZW5ndGg7YzxmO2MrKyl7dmFyIGw9aVtjXSxoPXRoaXMuX2RhdGEuZ2V0KGwpO251bGw9PWh8fHImJiFyKGgpfHx0KGgsbCl9fX0se2tleTpcIm1hcFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUmJkd0KGUpLG49W10saT10aGlzLl9kYXRhLG89S28oa3MoaSkuY2FsbChpKSksYT0wLHU9by5sZW5ndGg7YTx1O2ErKyl7dmFyIHM9b1thXSxjPXRoaXMuX2RhdGEuZ2V0KHMpO251bGw9PWN8fHImJiFyKGMpfHxuLnB1c2godChjLHMpKX1yZXR1cm4gZSYmZS5vcmRlciYmdGhpcy5fc29ydChuLGUub3JkZXIpLG59fSx7a2V5OlwiX2ZpbHRlckZpZWxkc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHQ/cmUocj1YbyhlKT9lOlVvKGUpKS5jYWxsKHIsKGZ1bmN0aW9uKGUscil7cmV0dXJuIGVbcl09dFtyXSxlfSkse30pOnR9fSx7a2V5OlwiX3NvcnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKXt2YXIgcj1lO09zKHQpLmNhbGwodCwoZnVuY3Rpb24odCxlKXt2YXIgbj10W3JdLGk9ZVtyXTtyZXR1cm4gbj5pPzE6bjxpPy0xOjB9KSl9ZWxzZXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJPcmRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcIik7T3ModCkuY2FsbCh0LGUpfX19LHtrZXk6XCJyZW1vdmVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1bXSxuPVtdLGk9WG8odCk/dDpbdF0sbz0wLGE9aS5sZW5ndGg7bzxhO28rKyl7dmFyIHU9dGhpcy5fcmVtb3ZlKGlbb10pO2lmKHUpe3ZhciBzPXVbdGhpcy5faWRQcm9wXTtudWxsIT1zJiYoci5wdXNoKHMpLG4ucHVzaCh1KSl9fXJldHVybiByLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpyLG9sZERhdGE6bn0sZSkscn19LHtrZXk6XCJfcmVtb3ZlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodmModCk/ZT10OnQmJlwib2JqZWN0XCI9PT1Hbyh0KSYmKGU9dFt0aGlzLl9pZFByb3BdKSxudWxsIT1lJiZ0aGlzLl9kYXRhLmhhcyhlKSl7dmFyIHI9dGhpcy5fZGF0YS5nZXQoZSl8fG51bGw7cmV0dXJuIHRoaXMuX2RhdGEuZGVsZXRlKGUpLC0tdGhpcy5sZW5ndGgscn1yZXR1cm4gbnVsbH19LHtrZXk6XCJjbGVhclwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPUtvKGtzKGU9dGhpcy5fZGF0YSkuY2FsbChlKSksbj1bXSxpPTAsbz1yLmxlbmd0aDtpPG87aSsrKW4ucHVzaCh0aGlzLl9kYXRhLmdldChyW2ldKSk7cmV0dXJuIHRoaXMuX2RhdGEuY2xlYXIoKSx0aGlzLmxlbmd0aD0wLHRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIix7aXRlbXM6cixvbGREYXRhOm59LHQpLHJ9fSx7a2V5OlwibWF4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUscixuPW51bGwsaT1udWxsLG89T2MoZHMoZT10aGlzLl9kYXRhKS5jYWxsKGUpKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe3ZhciBhPXIudmFsdWUsdT1hW3RdO1wibnVtYmVyXCI9PXR5cGVvZiB1JiYobnVsbD09aXx8dT5pKSYmKG49YSxpPXUpfX1jYXRjaCh0KXtvLmUodCl9ZmluYWxseXtvLmYoKX1yZXR1cm4gbnx8bnVsbH19LHtrZXk6XCJtaW5cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZSxyLG49bnVsbCxpPW51bGwsbz1PYyhkcyhlPXRoaXMuX2RhdGEpLmNhbGwoZSkpO3RyeXtmb3Ioby5zKCk7IShyPW8ubigpKS5kb25lOyl7dmFyIGE9ci52YWx1ZSx1PWFbdF07XCJudW1iZXJcIj09dHlwZW9mIHUmJihudWxsPT1pfHx1PGkpJiYobj1hLGk9dSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfXJldHVybiBufHxudWxsfX0se2tleTpcImRpc3RpbmN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2RhdGEscj1LbyhrcyhlKS5jYWxsKGUpKSxuPVtdLGk9MCxvPTAsYT1yLmxlbmd0aDtvPGE7bysrKXtmb3IodmFyIHU9cltvXSxzPWUuZ2V0KHUpW3RdLGM9ITEsZj0wO2Y8aTtmKyspaWYobltmXT09cyl7Yz0hMDticmVha31jfHx2b2lkIDA9PT1zfHwobltpXT1zLGkrKyl9cmV0dXJuIG59fSx7a2V5OlwiX2FkZEl0ZW1cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10W2VdJiYodFtlXT1wYygpKSx0fSh0LHRoaXMuX2lkUHJvcCkscj1lW3RoaXMuX2lkUHJvcF07aWYodGhpcy5fZGF0YS5oYXMocikpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGFkZCBpdGVtOiBpdGVtIHdpdGggaWQgXCIrcitcIiBhbHJlYWR5IGV4aXN0c1wiKTtyZXR1cm4gdGhpcy5fZGF0YS5zZXQocixlKSwrK3RoaXMubGVuZ3RoLHJ9fSx7a2V5OlwiX3VwZGF0ZUl0ZW1cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuX2lkUHJvcF07aWYobnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdXBkYXRlIGl0ZW06IGl0ZW0gaGFzIG5vIGlkIChpdGVtOiBcIitzaSh0KStcIilcIik7dmFyIHI9dGhpcy5fZGF0YS5nZXQoZSk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVwZGF0ZSBpdGVtOiBubyBpdGVtIHdpdGggaWQgXCIrZStcIiBmb3VuZFwiKTtyZXR1cm4gdGhpcy5fZGF0YS5zZXQoZSxFYyhFYyh7fSxyKSx0KSksZX19LHtrZXk6XCJzdHJlYW1cIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0KXt2YXIgZT10aGlzLl9kYXRhO3JldHVybiBuZXcgX2MocGkoe30sbHMsZnMubWFyaygoZnVuY3Rpb24gcigpe3ZhciBuLGksbyxhO3JldHVybiBmcy53cmFwKChmdW5jdGlvbihyKXtmb3IoOzspc3dpdGNoKHIucHJldj1yLm5leHQpe2Nhc2UgMDpuPU9jKHQpLHIucHJldj0xLG4ucygpO2Nhc2UgMzppZigoaT1uLm4oKSkuZG9uZSl7ci5uZXh0PTExO2JyZWFrfWlmKG89aS52YWx1ZSxudWxsPT0oYT1lLmdldChvKSkpe3IubmV4dD05O2JyZWFrfXJldHVybiByLm5leHQ9OSxbbyxhXTtjYXNlIDk6ci5uZXh0PTM7YnJlYWs7Y2FzZSAxMTpyLm5leHQ9MTY7YnJlYWs7Y2FzZSAxMzpyLnByZXY9MTMsci50MD1yLmNhdGNoKDEpLG4uZShyLnQwKTtjYXNlIDE2OnJldHVybiByLnByZXY9MTYsbi5mKCksci5maW5pc2goMTYpO2Nhc2UgMTk6Y2FzZVwiZW5kXCI6cmV0dXJuIHIuc3RvcCgpfX0pLHIsbnVsbCxbWzEsMTMsMTYsMTldXSl9KSkpKX12YXIgcjtyZXR1cm4gbmV3IF9jKHBpKHt9LGxzLGNlKHI9Y3ModGhpcy5fZGF0YSkpLmNhbGwocix0aGlzLl9kYXRhKSkpfX0se2tleTpcImlkUHJvcFwiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9pZFByb3B9fV0pLHJ9KHljKTtmdW5jdGlvbiBrYyh0LGUpe3ZhciByO2lmKHZvaWQgMD09PXJhfHxudWxsPT16bih0KSl7aWYoWG8odCl8fChyPWZ1bmN0aW9uKHQsZSl7dmFyIHI7aWYoIXQpcmV0dXJuO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXJldHVybiBBYyh0LGUpO3ZhciBuPSRvKHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKS5jYWxsKHIsOCwtMSk7XCJPYmplY3RcIj09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSk7aWYoXCJNYXBcIj09PW58fFwiU2V0XCI9PT1uKXJldHVybiBCbih0KTtpZihcIkFyZ3VtZW50c1wiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIEFjKHQsZSl9KHQpKXx8ZSYmdCYmXCJudW1iZXJcIj09dHlwZW9mIHQubGVuZ3RoKXtyJiYodD1yKTt2YXIgbj0wLGk9ZnVuY3Rpb24oKXt9O3JldHVybntzOmksbjpmdW5jdGlvbigpe3JldHVybiBuPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtuKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOml9fXRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKX12YXIgbyxhPSEwLHU9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtyPUZuKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9ci5uZXh0KCk7cmV0dXJuIGE9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7dT0hMCxvPXR9LGY6ZnVuY3Rpb24oKXt0cnl7YXx8bnVsbD09ci5yZXR1cm58fHIucmV0dXJuKCl9ZmluYWxseXtpZih1KXRocm93IG99fX19ZnVuY3Rpb24gQWModCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIHI9MCxuPW5ldyBBcnJheShlKTtyPGU7cisrKW5bcl09dFtyXTtyZXR1cm4gbn1mdW5jdGlvbiBqYyh0KXt2YXIgZT1mdW5jdGlvbigpe2lmKFwidW5kZWZpbmVkXCI9PXR5cGVvZiBSZWZsZWN0fHwhb3MpcmV0dXJuITE7aWYob3Muc2hhbSlyZXR1cm4hMTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob3MoRGF0ZSxbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0oKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcixuPWFjKHQpO2lmKGUpe3ZhciBpPWFjKHRoaXMpLmNvbnN0cnVjdG9yO3I9b3Mobixhcmd1bWVudHMsaSl9ZWxzZSByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpYyh0aGlzLHIpfX12YXIgSWM9ZnVuY3Rpb24odCl7ZWMocix0KTt2YXIgZT1qYyhyKTtmdW5jdGlvbiByKHQsbil7dmFyIGksbztyZXR1cm4gZmUodGhpcyxyKSwobz1lLmNhbGwodGhpcykpLmxlbmd0aD0wLG8uX2lkcz1uZXcgZ2Msby5fb3B0aW9ucz1ufHx7fSxvLl9saXN0ZW5lcj1jZShpPW8uX29uRXZlbnQpLmNhbGwoaSxyYyhvKSksby5zZXREYXRhKHQpLG99cmV0dXJuIHZlKHIsW3trZXk6XCJzZXREYXRhXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5fZGF0YSl7dGhpcy5fZGF0YS5vZmYmJnRoaXMuX2RhdGEub2ZmKFwiKlwiLHRoaXMuX2xpc3RlbmVyKTt2YXIgZT10aGlzLl9kYXRhLmdldElkcyh7ZmlsdGVyOkd0KHRoaXMuX29wdGlvbnMpfSkscj10aGlzLl9kYXRhLmdldChlKTt0aGlzLl9pZHMuY2xlYXIoKSx0aGlzLmxlbmd0aD0wLHRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIix7aXRlbXM6ZSxvbGREYXRhOnJ9KX1pZihudWxsIT10KXt0aGlzLl9kYXRhPXQ7Zm9yKHZhciBuPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6R3QodGhpcy5fb3B0aW9ucyl9KSxpPTAsbz1uLmxlbmd0aDtpPG87aSsrKXt2YXIgYT1uW2ldO3RoaXMuX2lkcy5hZGQoYSl9dGhpcy5sZW5ndGg9bi5sZW5ndGgsdGhpcy5fdHJpZ2dlcihcImFkZFwiLHtpdGVtczpufSl9ZWxzZSB0aGlzLl9kYXRhPW5ldyB4Yzt0aGlzLl9kYXRhLm9uJiZ0aGlzLl9kYXRhLm9uKFwiKlwiLHRoaXMuX2xpc3RlbmVyKX19LHtrZXk6XCJyZWZyZXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjpHdCh0aGlzLl9vcHRpb25zKX0pLGU9S28odGhpcy5faWRzKSxyPXt9LG49W10saT1bXSxvPVtdLGE9MCx1PXQubGVuZ3RoO2E8dTthKyspe3ZhciBzPXRbYV07cltzXT0hMCx0aGlzLl9pZHMuaGFzKHMpfHwobi5wdXNoKHMpLHRoaXMuX2lkcy5hZGQocykpfWZvcih2YXIgYz0wLGY9ZS5sZW5ndGg7YzxmO2MrKyl7dmFyIGw9ZVtjXSxoPXRoaXMuX2RhdGEuZ2V0KGwpO251bGw9PWg/Y29uc29sZS5lcnJvcihcIklmIHlvdSBzZWUgdGhpcywgcmVwb3J0IGl0IHBsZWFzZS5cIik6cltsXXx8KGkucHVzaChsKSxvLnB1c2goaCksdGhpcy5faWRzLmRlbGV0ZShsKSl9dGhpcy5sZW5ndGgrPW4ubGVuZ3RoLWkubGVuZ3RoLG4ubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOm59KSxpLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczppLG9sZERhdGE6b30pfX0se2tleTpcImdldFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dGhpcy5fZGF0YSlyZXR1cm4gbnVsbDt2YXIgcixuPW51bGw7dmModCl8fFhvKHQpPyhuPXQscj1lKTpyPXQ7dmFyIGk9WGkoe30sdGhpcy5fb3B0aW9ucyxyKSxvPUd0KHRoaXMuX29wdGlvbnMpLGE9ciYmR3Qocik7cmV0dXJuIG8mJmEmJihpLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmYSh0KX0pLG51bGw9PW4/dGhpcy5fZGF0YS5nZXQoaSk6dGhpcy5fZGF0YS5nZXQobixpKX19LHtrZXk6XCJnZXRJZHNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9kYXRhLmxlbmd0aCl7dmFyIGUscj1HdCh0aGlzLl9vcHRpb25zKSxuPW51bGwhPXQ/R3QodCk6bnVsbDtyZXR1cm4gZT1uP3I/ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkmJm4odCl9Om46cix0aGlzLl9kYXRhLmdldElkcyh7ZmlsdGVyOmUsb3JkZXI6dCYmdC5vcmRlcn0pfXJldHVybltdfX0se2tleTpcImZvckVhY2hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX2RhdGEpe3ZhciByLG4saT1HdCh0aGlzLl9vcHRpb25zKSxvPWUmJkd0KGUpO249bz9pP2Z1bmN0aW9uKHQpe3JldHVybiBpKHQpJiZvKHQpfTpvOmksbG8ocj10aGlzLl9kYXRhKS5jYWxsKHIsdCx7ZmlsdGVyOm4sb3JkZXI6ZSYmZS5vcmRlcn0pfX19LHtrZXk6XCJtYXBcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuX2RhdGEpe3ZhciByLG4saT1HdCh0aGlzLl9vcHRpb25zKSxvPWUmJkd0KGUpO3JldHVybiBuPW8/aT9mdW5jdGlvbih0KXtyZXR1cm4gaSh0KSYmbyh0KX06bzppLHF0KHI9dGhpcy5fZGF0YSkuY2FsbChyLHQse2ZpbHRlcjpuLG9yZGVyOmUmJmUub3JkZXJ9KX1yZXR1cm5bXX19LHtrZXk6XCJnZXREYXRhU2V0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YS5nZXREYXRhU2V0KCl9fSx7a2V5Olwic3RyZWFtXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHRoaXMuX2RhdGEuc3RyZWFtKHR8fHBpKHt9LGxzLGNlKGU9a3ModGhpcy5faWRzKSkuY2FsbChlLHRoaXMuX2lkcykpKX19LHtrZXk6XCJkaXNwb3NlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtudWxsIT09KHQ9dGhpcy5fZGF0YSkmJnZvaWQgMCE9PXQmJnQub2ZmJiZ0aGlzLl9kYXRhLm9mZihcIipcIix0aGlzLl9saXN0ZW5lcik7dmFyIGUsbj1cIlRoaXMgZGF0YSB2aWV3IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuXCIsaT17Z2V0OmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKG4pfSxzZXQ6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3Iobil9LGNvbmZpZ3VyYWJsZTohMX0sbz1rYyhIbyhyLnByb3RvdHlwZSkpO3RyeXtmb3Ioby5zKCk7IShlPW8ubigpKS5kb25lOyl7dmFyIGE9ZS52YWx1ZTtnZSh0aGlzLGEsaSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19LHtrZXk6XCJfb25FdmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXtpZihlJiZlLml0ZW1zJiZ0aGlzLl9kYXRhKXt2YXIgbj1lLml0ZW1zLGk9W10sbz1bXSxhPVtdLHU9W10scz1bXSxjPVtdO3N3aXRjaCh0KXtjYXNlXCJhZGRcIjpmb3IodmFyIGY9MCxsPW4ubGVuZ3RoO2Y8bDtmKyspe3ZhciBoPW5bZl07dGhpcy5nZXQoaCkmJih0aGlzLl9pZHMuYWRkKGgpLGkucHVzaChoKSl9YnJlYWs7Y2FzZVwidXBkYXRlXCI6Zm9yKHZhciBwPTAsdj1uLmxlbmd0aDtwPHY7cCsrKXt2YXIgZD1uW3BdO3RoaXMuZ2V0KGQpP3RoaXMuX2lkcy5oYXMoZCk/KG8ucHVzaChkKSxzLnB1c2goZS5kYXRhW3BdKSx1LnB1c2goZS5vbGREYXRhW3BdKSk6KHRoaXMuX2lkcy5hZGQoZCksaS5wdXNoKGQpKTp0aGlzLl9pZHMuaGFzKGQpJiYodGhpcy5faWRzLmRlbGV0ZShkKSxhLnB1c2goZCksYy5wdXNoKGUub2xkRGF0YVtwXSkpfWJyZWFrO2Nhc2VcInJlbW92ZVwiOmZvcih2YXIgeT0wLGc9bi5sZW5ndGg7eTxnO3krKyl7dmFyIG09blt5XTt0aGlzLl9pZHMuaGFzKG0pJiYodGhpcy5faWRzLmRlbGV0ZShtKSxhLnB1c2gobSksYy5wdXNoKGUub2xkRGF0YVt5XSkpfX10aGlzLmxlbmd0aCs9aS5sZW5ndGgtYS5sZW5ndGgsaS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aX0sciksby5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIix7aXRlbXM6byxvbGREYXRhOnUsZGF0YTpzfSxyKSxhLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczphLG9sZERhdGE6Y30scil9fX0se2tleTpcImlkUHJvcFwiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldERhdGFTZXQoKS5pZFByb3B9fV0pLHJ9KHljKTtmdW5jdGlvbiBQYyh0LGUpe3JldHVyblwib2JqZWN0XCI9PT1HbyhlKSYmbnVsbCE9PWUmJnQ9PT1lLmlkUHJvcCYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5hZGQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuY2xlYXImJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuZGlzdGluY3QmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGxvKGUpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdldCYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5nZXREYXRhU2V0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdldElkcyYmXCJudW1iZXJcIj09dHlwZW9mIGUubGVuZ3RoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBxdChlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5tYXgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUubWluJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLm9mZiYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vbiYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5yZW1vdmUmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuc2V0T3B0aW9ucyYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5zdHJlYW0mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUudXBkYXRlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnVwZGF0ZU9ubHl9dC5ERUxFVEU9JHUsdC5EYXRhU2V0PXhjLHQuRGF0YVN0cmVhbT1fYyx0LkRhdGFWaWV3PUljLHQuUXVldWU9ZGMsdC5jcmVhdGVOZXdEYXRhUGlwZUZyb209ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB5ZSh0KX0sdC5pc0RhdGFTZXRMaWtlPVBjLHQuaXNEYXRhVmlld0xpa2U9ZnVuY3Rpb24odCxlKXtyZXR1cm5cIm9iamVjdFwiPT09R28oZSkmJm51bGwhPT1lJiZ0PT09ZS5pZFByb3AmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGxvKGUpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdldCYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5nZXREYXRhU2V0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdldElkcyYmXCJudW1iZXJcIj09dHlwZW9mIGUubGVuZ3RoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBxdChlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgZS5vZmYmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUub24mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuc3RyZWFtJiZQYyh0LGUuZ2V0RGF0YVNldCgpKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSl9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12aXMtZGF0YS5taW4uanMubWFwXG4iLCJ2YXIgZT1bXSx0PVtdO2Z1bmN0aW9uIG4obixyKXtpZihuJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBhLHM9ITA9PT1yLnByZXBlbmQ/XCJwcmVwZW5kXCI6XCJhcHBlbmRcIixkPSEwPT09ci5zaW5nbGVUYWcsaT1cInN0cmluZ1wiPT10eXBlb2Ygci5jb250YWluZXI/ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihyLmNvbnRhaW5lcik6ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdO2lmKGQpe3ZhciB1PWUuaW5kZXhPZihpKTstMT09PXUmJih1PWUucHVzaChpKS0xLHRbdV09e30pLGE9dFt1XSYmdFt1XVtzXT90W3VdW3NdOnRbdV1bc109YygpfWVsc2UgYT1jKCk7NjUyNzk9PT1uLmNoYXJDb2RlQXQoMCkmJihuPW4uc3Vic3RyaW5nKDEpKSxhLnN0eWxlU2hlZXQ/YS5zdHlsZVNoZWV0LmNzc1RleHQrPW46YS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSl9ZnVuY3Rpb24gYygpe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtpZihlLnNldEF0dHJpYnV0ZShcInR5cGVcIixcInRleHQvY3NzXCIpLHIuYXR0cmlidXRlcylmb3IodmFyIHQ9T2JqZWN0LmtleXMoci5hdHRyaWJ1dGVzKSxuPTA7bjx0Lmxlbmd0aDtuKyspZS5zZXRBdHRyaWJ1dGUodFtuXSxyLmF0dHJpYnV0ZXNbdFtuXV0pO3ZhciBhPVwicHJlcGVuZFwiPT09cz9cImFmdGVyYmVnaW5cIjpcImJlZm9yZWVuZFwiO3JldHVybiBpLmluc2VydEFkamFjZW50RWxlbWVudChhLGUpLGV9fWV4cG9ydCBkZWZhdWx0IG47XG4iLCJpbXBvcnQgdHlwZSB7IFRGaWxlLCBNZXRhZGF0YUNhY2hlLCBEYXRhQWRhcHRlciB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IGdldEFsbFRhZ3MgfSBmcm9tICdvYnNpZGlhbic7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhZyh0YWc6IHN0cmluZywgdGFnTGlzdDogc3RyaW5nW10pIHtcblx0dGFnID0gdGFnLnRyaW0oKTtcblxuXHQvLyBTa2lwIGVtcHR5IHRhZ3Ncblx0aWYgKHRhZy5sZW5ndGggPT09IDApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBQYXJzZSBhbGwgc3VidGFncyBvdXQgb2YgdGhlIGdpdmVuIHRhZy5cblx0Ly8gSS5lLiwgI2hlbGxvL2kvYW0gd291bGQgeWllbGQgWyNoZWxsby9pL2FtLCAjaGVsbG8vaSwgI2hlbGxvXS4gKi9cblx0dGFnTGlzdC5wdXNoKHRhZyk7XG5cdHdoaWxlICh0YWcuY29udGFpbnMoXCIvXCIpKSB7XG5cdFx0dGFnID0gdGFnLnN1YnN0cmluZygwLCB0YWcubGFzdEluZGV4T2YoXCIvXCIpKTtcblx0XHR0YWdMaXN0LnB1c2godGFnKTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRmlsdGVyTURGaWxlcyhmaWxlOiBURmlsZSwgdGFnTGlzdDogU3RyaW5nW10sIG1ldGFkYXRhQ2FjaGU6IE1ldGFkYXRhQ2FjaGUpIHtcblx0aWYgKCF0YWdMaXN0IHx8IHRhZ0xpc3QubGVuZ3RoID09PSAwKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRsZXQgdGFncyA9IGdldEFsbFRhZ3MobWV0YWRhdGFDYWNoZS5nZXRGaWxlQ2FjaGUoZmlsZSkpLm1hcChlID0+IGUuc2xpY2UoMSwgZS5sZW5ndGgpKTtcblxuXHRpZiAodGFncyAmJiB0YWdzLmxlbmd0aCA+IDApIHtcblx0XHRsZXQgZmlsZXRhZ3M6IHN0cmluZ1tdID0gW107XG5cdFx0dGFncy5mb3JFYWNoKHRhZyA9PiBwYXJzZVRhZyh0YWcsIGZpbGV0YWdzKSk7XG5cdFx0cmV0dXJuIHRhZ0xpc3QuZXZlcnkodmFsID0+IHsgcmV0dXJuIGZpbGV0YWdzLmluZGV4T2YodmFsIGFzIHN0cmluZykgPj0gMDsgfSk7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3JlYXRlIGRhdGUgb2YgcGFzc2VkIHN0cmluZ1xuICogQGRhdGUgLSBzdHJpbmcgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQtSEhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURhdGUoZGF0ZTogc3RyaW5nKTogRGF0ZSB7XG5cdGxldCBkYXRlQ29tcCA9IGRhdGUuc3BsaXQoJywnKTtcblx0Ly8gY2Fubm90IHNpbXBseSByZXBsYWNlICctJyBhcyBuZWVkIHRvIHN1cHBvcnQgbmVnYXRpdmUgeWVhcnNcblx0cmV0dXJuIG5ldyBEYXRlKCsoZGF0ZUNvbXBbMF0gPz8gMCksICsoZGF0ZUNvbXBbMV0gPz8gMCksICsoZGF0ZUNvbXBbMl0gPz8gMCksICsoZGF0ZUNvbXBbM10gPz8gMCkpO1xufVxuXG4vKipcbiAqIFJldHVybiBVUkwgZm9yIHNwZWNpZmllZCBpbWFnZSBwYXRoXG4gKiBAcGFyYW0gcGF0aCAtIGltYWdlIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEltZ1VybCh2YXVsdEFkYXB0b3I6IERhdGFBZGFwdGVyLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuXG5cdGlmICghcGF0aCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0bGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cCgnXmh0dHBzOlxcL1xcLycpO1xuXHRpZiAocGF0aC5tYXRjaChyZWdleCkpIHtcblx0XHRyZXR1cm4gcGF0aDtcblx0fVxuXG5cdHJldHVybiB2YXVsdEFkYXB0b3IuZ2V0UmVzb3VyY2VQYXRoKHBhdGgpO1xufVxuIiwiLy9pbXBvcnQgR2FsbGVyeSBmcm9tICcuL3N2ZWx0ZS9HYWxsZXJ5LnN2ZWx0ZSdcbmltcG9ydCB0eXBlIHsgVGltZWxpbmVzU2V0dGluZ3MsIEFsbE5vdGVzRGF0YSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUkVOREVSX1RJTUVMSU5FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHR5cGUgeyBURmlsZSwgTWFya2Rvd25WaWV3LCBNZXRhZGF0YUNhY2hlLCBWYXVsdCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB7IFRpbWVsaW5lIH0gZnJvbSBcInZpcy10aW1lbGluZS9lc25leHRcIjtcbmltcG9ydCB7IERhdGFTZXQgfSBmcm9tIFwidmlzLWRhdGFcIjtcbmltcG9ydCBcInZpcy10aW1lbGluZS9zdHlsZXMvdmlzLXRpbWVsaW5lLWdyYXBoMmQuY3NzXCI7XG5pbXBvcnQgeyBGaWx0ZXJNREZpbGVzLCBjcmVhdGVEYXRlLCBnZXRJbWdVcmwsIHBhcnNlVGFnIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBUaW1lbGluZVByb2Nlc3NvciB7XG5cblx0YXN5bmMgaW5zZXJ0VGltZWxpbmVJbnRvQ3VycmVudE5vdGUoc291cmNlVmlldzogTWFya2Rvd25WaWV3LCBzZXR0aW5nczogVGltZWxpbmVzU2V0dGluZ3MsIHZhdWx0RmlsZXM6IFRGaWxlW10sIGZpbGVDYWNoZTogTWV0YWRhdGFDYWNoZSwgYXBwVmF1bHQ6IFZhdWx0KSB7XG5cdFx0bGV0IGVkaXRvciA9IHNvdXJjZVZpZXcuc291cmNlTW9kZS5jbUVkaXRvcjtcblx0XHRpZiAoZWRpdG9yKSB7XG5cdFx0XHRjb25zdCBzb3VyY2UgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblx0XHRcdGxldCBtYXRjaCA9IFJFTkRFUl9USU1FTElORS5leGVjKHNvdXJjZSk7XG5cdFx0XHRpZiAobWF0Y2gpIHtcblx0XHRcdFx0bGV0IHRhZ0xpc3QgPSBtYXRjaFsxXTtcblxuXHRcdFx0XHRsZXQgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cdFx0XHRcdGxldCByZW5kZXJlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0XHRyZW5kZXJlZC5hZGRDbGFzcygndGltZWxpbmUtcmVuZGVyZWQnKTtcblx0XHRcdFx0cmVuZGVyZWQuc2V0VGV4dChuZXcgRGF0ZSgpLnRvU3RyaW5nKCkpO1xuXG5cdFx0XHRcdGRpdi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVDb21tZW50KGBUSU1FTElORSBCRUdJTiB0YWdzPScke21hdGNoWzFdfSdgKSk7XG5cdFx0XHRcdGF3YWl0IHRoaXMucnVuKHRhZ0xpc3QsIGRpdiwgc2V0dGluZ3MsIHZhdWx0RmlsZXMsIGZpbGVDYWNoZSwgYXBwVmF1bHQsIGZhbHNlKTtcblx0XHRcdFx0ZGl2LmFwcGVuZENoaWxkKHJlbmRlcmVkKTtcblx0XHRcdFx0ZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ1RJTUVMSU5FIEVORCcpKTtcblxuXHRcdFx0XHRlZGl0b3Iuc2V0VmFsdWUoc291cmNlLnJlcGxhY2UobWF0Y2hbMF0sIGRpdi5pbm5lckhUTUwpKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0YXN5bmMgcnVuKHNvdXJjZTogc3RyaW5nLCBlbDogSFRNTEVsZW1lbnQsIHNldHRpbmdzOiBUaW1lbGluZXNTZXR0aW5ncywgdmF1bHRGaWxlczogVEZpbGVbXSwgZmlsZUNhY2hlOiBNZXRhZGF0YUNhY2hlLCBhcHBWYXVsdDogVmF1bHQsIHZpc1RpbWVsaW5lOiBib29sZWFuKSB7XG5cblx0XHRsZXQgYXJncyA9IHtcblx0XHRcdHRhZ3M6ICcnLFxuXHRcdFx0ZGl2SGVpZ2h0OiA0MDAsXG5cdFx0XHRzdGFydERhdGU6ICctMTAwMCcsXG5cdFx0XHRlbmREYXRlOiAnMzAwMCcsXG5cdFx0XHRtaW5EYXRlOiAnLTMwMDAnLFxuXHRcdFx0bWF4RGF0ZTogJzMwMDAnXG5cdFx0fTtcblxuXHRcdC8vIHJlYWQgYXJndW1lbnRzXG5cdFx0aWYgKHZpc1RpbWVsaW5lKSB7XG5cdFx0XHRzb3VyY2Uuc3BsaXQoJ1xcbicpLm1hcChlID0+IHtcblx0XHRcdFx0ZSA9IGUudHJpbSgpO1xuXHRcdFx0XHRpZiAoZSkge1xuXHRcdFx0XHRcdGxldCBwYXJhbSA9IGUuc3BsaXQoJz0nKTtcblx0XHRcdFx0XHRpZiAocGFyYW1bMV0pIHtcblx0XHRcdFx0XHRcdGFyZ3NbcGFyYW1bMF1dID0gcGFyYW1bMV0/LnRyaW0oKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZXQgbGluZXMgPSBzb3VyY2UudHJpbSgpO1xuXHRcdFx0Ly8gUGFyc2UgdGhlIHRhZ3MgdG8gc2VhcmNoIGZvciB0aGUgcHJvcGVyIGZpbGVzXG5cdFx0XHRhcmdzLnRhZ3MgPSBsaW5lcztcblx0XHR9XG5cblx0XHRsZXQgdGFnTGlzdDogc3RyaW5nW10gPSBbXTtcblx0XHRhcmdzLnRhZ3Muc3BsaXQoXCI7XCIpLmZvckVhY2godGFnID0+IHBhcnNlVGFnKHRhZywgdGFnTGlzdCkpO1xuXHRcdHRhZ0xpc3QucHVzaChzZXR0aW5ncy50aW1lbGluZVRhZyk7XG5cblx0XHQvLyBGaWx0ZXIgYWxsIG1hcmtkb3duIGZpbGVzIHRvIG9ubHkgdGhvc2UgY29udGFpbmluZyB0aGUgdGFnIGxpc3Rcblx0XHRsZXQgZmlsZUxpc3QgPSB2YXVsdEZpbGVzLmZpbHRlcihmaWxlID0+IEZpbHRlck1ERmlsZXMoZmlsZSwgdGFnTGlzdCwgZmlsZUNhY2hlKSk7XG5cdFx0aWYgKCFmaWxlTGlzdCkge1xuXHRcdFx0Ly8gaWYgbm8gZmlsZXMgdmFsaWQgZm9yIHRpbWVsaW5lXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdC8vIEtlZXAgb25seSB0aGUgZmlsZXMgdGhhdCBoYXZlIHRoZSB0aW1lIGluZm9cblx0XHRsZXQgdGltZWxpbmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHR0aW1lbGluZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RpbWVsaW5lJyk7XG5cdFx0bGV0IHRpbWVsaW5lTm90ZXMgPSBbXSBhcyBBbGxOb3Rlc0RhdGE7XG5cdFx0bGV0IHRpbWVsaW5lRGF0ZXMgPSBbXTtcblxuXHRcdGZvciAobGV0IGZpbGUgb2YgZmlsZUxpc3QpIHtcblx0XHRcdC8vIENyZWF0ZSBhIERPTSBQYXJzZXJcblx0XHRcdGNvbnN0IGRvbXBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcblx0XHRcdGNvbnN0IGRvYyA9IGRvbXBhcnNlci5wYXJzZUZyb21TdHJpbmcoYXdhaXQgYXBwVmF1bHQucmVhZChmaWxlKSwgJ3RleHQvaHRtbCcpO1xuXHRcdFx0bGV0IHRpbWVsaW5lRGF0YSA9IGRvYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdvYi10aW1lbGluZXMnKTtcblx0XHRcdGZvciAobGV0IGV2ZW50IG9mIHRpbWVsaW5lRGF0YSBhcyBhbnkpIHtcblx0XHRcdFx0aWYgKCEoZXZlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBub3RlSWQ7XG5cdFx0XHRcdC8vIGNoZWNrIGlmIGEgdmFsaWQgZGF0ZSBpcyBzcGVjaWZpZWRcblx0XHRcdFx0aWYgKGV2ZW50LmRhdGFzZXQuZGF0ZVswXSA9PSAnLScpIHtcblx0XHRcdFx0XHQvLyBpZiBpdCBpcyBhIG5lZ2F0aXZlIHllYXJcblx0XHRcdFx0XHRub3RlSWQgPSArZXZlbnQuZGF0YXNldC5kYXRlLnN1YnN0cmluZygxLCBldmVudC5kYXRhc2V0LmRhdGUubGVuZ3RoKS5zcGxpdCgnLScpLmpvaW4oJycpICogLTE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm90ZUlkID0gK2V2ZW50LmRhdGFzZXQuZGF0ZS5zcGxpdCgnLScpLmpvaW4oJycpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICghTnVtYmVyLmlzSW50ZWdlcihub3RlSWQpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gaWYgbm90IHRpdGxlIGlzIHNwZWNpZmllZCB1c2Ugbm90ZSBuYW1lXG5cdFx0XHRcdGxldCBub3RlVGl0bGUgPSBldmVudC5kYXRhc2V0LnRpdGxlID8/IGZpbGUubmFtZTtcblx0XHRcdFx0bGV0IG5vdGVDbGFzcyA9IGV2ZW50LmRhdGFzZXQuY2xhc3MgPz8gXCJcIjtcblx0XHRcdFx0bGV0IG5vdGVQYXRoID0gJy8nICsgZmlsZS5wYXRoO1xuXHRcdFx0XHRsZXQgdHlwZSA9IGV2ZW50LmRhdGFzZXQudHlwZSA/PyBcIlwiO1xuXHRcdFx0XHRsZXQgZW5kRGF0ZSA9IGV2ZW50LmRhdGFzZXQuZW5kID8/IG51bGw7XG5cblx0XHRcdFx0aWYgKCF0aW1lbGluZU5vdGVzW25vdGVJZF0pIHtcblx0XHRcdFx0XHR0aW1lbGluZU5vdGVzW25vdGVJZF0gPSBbXTtcblx0XHRcdFx0XHR0aW1lbGluZU5vdGVzW25vdGVJZF1bMF0gPSB7XG5cdFx0XHRcdFx0XHRkYXRlOiBldmVudC5kYXRhc2V0LmRhdGUsXG5cdFx0XHRcdFx0XHR0aXRsZTogbm90ZVRpdGxlLFxuXHRcdFx0XHRcdFx0aW1nOiBnZXRJbWdVcmwoYXBwVmF1bHQuYWRhcHRlciwgZXZlbnQuZGF0YXNldC5pbWcpLFxuXHRcdFx0XHRcdFx0aW5uZXJIVE1MOiBldmVudC5pbm5lckhUTUwsXG5cdFx0XHRcdFx0XHRwYXRoOiBub3RlUGF0aCxcblx0XHRcdFx0XHRcdGNsYXNzOiBub3RlQ2xhc3MsXG5cdFx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdFx0ZW5kRGF0ZTogZW5kRGF0ZVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0dGltZWxpbmVEYXRlcy5wdXNoKG5vdGVJZCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gaWYgbm90ZV9pZCBhbHJlYWR5IHByZXNlbnQgYXBwZW5kIHRvIGl0XG5cdFx0XHRcdFx0dGltZWxpbmVOb3Rlc1tub3RlSWRdW3RpbWVsaW5lTm90ZXNbbm90ZUlkXS5sZW5ndGhdID0ge1xuXHRcdFx0XHRcdFx0ZGF0ZTogZXZlbnQuZGF0YXNldC5kYXRlLFxuXHRcdFx0XHRcdFx0dGl0bGU6IG5vdGVUaXRsZSxcblx0XHRcdFx0XHRcdGltZzogZ2V0SW1nVXJsKGFwcFZhdWx0LmFkYXB0ZXIsIGV2ZW50LmRhdGFzZXQuaW1nKSxcblx0XHRcdFx0XHRcdGlubmVySFRNTDogZXZlbnQuaW5uZXJIVE1MLFxuXHRcdFx0XHRcdFx0cGF0aDogbm90ZVBhdGgsXG5cdFx0XHRcdFx0XHRjbGFzczogbm90ZUNsYXNzLFxuXHRcdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRcdGVuZERhdGU6IGVuZERhdGVcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBldmVudHMgYmFzZWQgb24gc2V0dGluZ1xuXHRcdGlmIChzZXR0aW5ncy5zb3J0RGlyZWN0aW9uKSB7XG5cdFx0XHQvLyBkZWZhdWx0IGlzIGFzY2VuZGluZ1xuXHRcdFx0dGltZWxpbmVEYXRlcyA9IHRpbWVsaW5lRGF0ZXMuc29ydCgoZDEsIGQyKSA9PiBkMSAtIGQyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gZWxzZSBpdCBpcyBkZXNjZW5kaW5nXG5cdFx0XHR0aW1lbGluZURhdGVzID0gdGltZWxpbmVEYXRlcy5zb3J0KChkMSwgZDIpID0+IGQyIC0gZDEpO1xuXHRcdH1cblxuXHRcdGlmICghdmlzVGltZWxpbmUpIHtcblxuXHRcdFx0bGV0IGV2ZW50Q291bnQgPSAwO1xuXHRcdFx0Ly8gQnVpbGQgdGhlIHRpbWVsaW5lIGh0bWwgZWxlbWVudFxuXHRcdFx0Zm9yIChsZXQgZGF0ZSBvZiB0aW1lbGluZURhdGVzKSB7XG5cdFx0XHRcdGxldCBub3RlQ29udGFpbmVyID0gdGltZWxpbmUuY3JlYXRlRGl2KHsgY2xzOiAndGltZWxpbmUtY29udGFpbmVyJyB9KTtcblx0XHRcdFx0bGV0IG5vdGVIZWFkZXIgPSBub3RlQ29udGFpbmVyLmNyZWF0ZUVsKCdoMicsIHsgdGV4dDogdGltZWxpbmVOb3Rlc1tkYXRlXVswXS5kYXRlLnJlcGxhY2UoLy0wKiQvZywgJycpLnJlcGxhY2UoLy0wKiQvZywgJycpLnJlcGxhY2UoLy0wKiQvZywgJycpIH0pO1xuXHRcdFx0XHRsZXQgZXZlbnRDb250YWluZXIgPSBub3RlQ29udGFpbmVyLmNyZWF0ZURpdih7IGNsczogJ3RpbWVsaW5lLWV2ZW50LWxpc3QnLCBhdHRyOiB7ICdzdHlsZSc6ICdkaXNwbGF5OiBibG9jaycgfSB9KTtcblxuXHRcdFx0XHRub3RlSGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZXZlbnQgPT4ge1xuXHRcdFx0XHRcdGlmIChldmVudENvbnRhaW5lci5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdkaXNwbGF5JykgPT09ICdub25lJykge1xuXHRcdFx0XHRcdFx0ZXZlbnRDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZXZlbnRDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJ2Rpc3BsYXknLCAnbm9uZScpO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHRpZiAoZXZlbnRDb3VudCAlIDIgPT0gMCkge1xuXHRcdFx0XHRcdC8vIGlmIGl0cyBldmVuIGFkZCBpdCB0byB0aGUgbGVmdFxuXHRcdFx0XHRcdG5vdGVDb250YWluZXIuYWRkQ2xhc3MoJ3RpbWVsaW5lLWxlZnQnKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIGVsc2UgYWRkIGl0IHRvIHRoZSByaWdodFxuXHRcdFx0XHRcdG5vdGVDb250YWluZXIuYWRkQ2xhc3MoJ3RpbWVsaW5lLXJpZ2h0Jyk7XG5cdFx0XHRcdFx0bm90ZUhlYWRlci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ3RleHQtYWxpZ246IHJpZ2h0OycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aW1lbGluZU5vdGVzW2RhdGVdKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKGxldCBldmVudEF0RGF0ZSBvZiB0aW1lbGluZU5vdGVzW2RhdGVdKSB7XG5cdFx0XHRcdFx0bGV0IG5vdGVDYXJkID0gZXZlbnRDb250YWluZXIuY3JlYXRlRGl2KHsgY2xzOiAndGltZWxpbmUtY2FyZCcgfSk7XG5cdFx0XHRcdFx0Ly8gYWRkIGFuIGltYWdlIG9ubHkgaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0aWYgKGV2ZW50QXREYXRlLmltZykge1xuXHRcdFx0XHRcdFx0bm90ZUNhcmQuY3JlYXRlRGl2KHsgY2xzOiAndGh1bWInLCBhdHRyOiB7IHN0eWxlOiBgYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7ZXZlbnRBdERhdGUuaW1nfSk7YCB9IH0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoZXZlbnRBdERhdGUuY2xhc3MpIHtcblx0XHRcdFx0XHRcdG5vdGVDYXJkLmFkZENsYXNzKGV2ZW50QXREYXRlLmNsYXNzKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRub3RlQ2FyZC5jcmVhdGVFbCgnYXJ0aWNsZScpLmNyZWF0ZUVsKCdoMycpLmNyZWF0ZUVsKCdhJyxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0Y2xzOiAnaW50ZXJuYWwtbGluaycsXG5cdFx0XHRcdFx0XHRcdGF0dHI6IHsgaHJlZjogYCR7ZXZlbnRBdERhdGUucGF0aH1gIH0sXG5cdFx0XHRcdFx0XHRcdHRleHQ6IGV2ZW50QXREYXRlLnRpdGxlXG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRub3RlQ2FyZC5jcmVhdGVFbCgncCcsIHsgdGV4dDogZXZlbnRBdERhdGUuaW5uZXJIVE1MIH0pO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGV2ZW50Q291bnQrKztcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGFncyB3aXRoIHRoZSB0aW1lbGluZSBodG1sXG5cdFx0XHRlbC5hcHBlbmRDaGlsZCh0aW1lbGluZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGEgRGF0YVNldFxuXHRcdGxldCBpdGVtcyA9IG5ldyBEYXRhU2V0KFtdKTtcblxuXHRcdHRpbWVsaW5lRGF0ZXMuZm9yRWFjaChkYXRlID0+IHtcblxuXHRcdFx0Ly8gYWRkIGFsbCBldmVudHMgYXQgdGhpcyBkYXRlXG5cdFx0XHRPYmplY3QudmFsdWVzKHRpbWVsaW5lTm90ZXNbZGF0ZV0pLmZvckVhY2goZXZlbnQgPT4ge1xuXHRcdFx0XHQvLyBDcmVhdGUgRXZlbnQgQ2FyZFxuXHRcdFx0XHRsZXQgbm90ZUNhcmQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0bm90ZUNhcmQuY2xhc3NOYW1lID0gJ3RpbWVsaW5lLWNhcmQnO1xuXHRcdFx0XHQvLyBhZGQgYW4gaW1hZ2Ugb25seSBpZiBhdmFpbGFibGVcblx0XHRcdFx0aWYgKGV2ZW50LmltZykge1xuXHRcdFx0XHRcdG5vdGVDYXJkLmNyZWF0ZURpdih7IGNsczogJ3RodW1iJywgYXR0cjogeyBzdHlsZTogYGJhY2tncm91bmQtaW1hZ2U6IHVybCgke2V2ZW50LmltZ30pO2AgfSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoZXZlbnQuY2xhc3MpIHtcblx0XHRcdFx0XHRub3RlQ2FyZC5hZGRDbGFzcyhldmVudC5jbGFzcyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub3RlQ2FyZC5jcmVhdGVFbCgnYXJ0aWNsZScpLmNyZWF0ZUVsKCdoMycpLmNyZWF0ZUVsKCdhJywge1xuXHRcdFx0XHRcdGNsczogJ2ludGVybmFsLWxpbmsnLFxuXHRcdFx0XHRcdGF0dHI6IHsgaHJlZjogYCR7ZXZlbnQucGF0aH1gIH0sXG5cdFx0XHRcdFx0dGV4dDogZXZlbnQudGl0bGVcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG5vdGVDYXJkLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiBldmVudC5pbm5lckhUTUwgfSk7XG5cblx0XHRcdFx0bGV0IHN0YXJ0RGF0ZSA9IGV2ZW50LmRhdGU/LnJlcGxhY2UoLyguKiktXFxkKiQvZywgJyQxJyk7XG5cdFx0XHRcdGxldCBzdGFydCwgZW5kO1xuXHRcdFx0XHRpZiAoc3RhcnREYXRlWzBdID09ICctJykge1xuXHRcdFx0XHRcdC8vIGhhbmRsZSBuZWdhdGl2ZSB5ZWFyXG5cdFx0XHRcdFx0bGV0IHN0YXJ0Q29tcCA9IHN0YXJ0RGF0ZS5zdWJzdHJpbmcoMSwgc3RhcnREYXRlLmxlbmd0aCkuc3BsaXQoJy0nKTtcblx0XHRcdFx0XHRzdGFydCA9IG5ldyBEYXRlKCtgLSR7c3RhcnRDb21wWzBdfWAsICtzdGFydENvbXBbMV0sICtzdGFydENvbXBbMl0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXJ0ID0gbmV3IERhdGUoc3RhcnREYXRlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCBlbmREYXRlID0gZXZlbnQuZW5kRGF0ZT8ucmVwbGFjZSgvKC4qKS1cXGQqJC9nLCAnJDEnKTtcblx0XHRcdFx0aWYgKGVuZERhdGUgJiYgZW5kRGF0ZVswXSA9PSAnLScpIHtcblx0XHRcdFx0XHQvLyBoYW5kbGUgbmVnYXRpdmUgeWVhclxuXHRcdFx0XHRcdGxldCBlbmRDb21wID0gZW5kRGF0ZS5zdWJzdHJpbmcoMSwgZW5kRGF0ZS5sZW5ndGgpLnNwbGl0KCctJyk7XG5cdFx0XHRcdFx0ZW5kID0gbmV3IERhdGUoK2AtJHtlbmRDb21wWzBdfWAsICtlbmRDb21wWzFdLCArZW5kQ29tcFsyXSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZW5kID0gbmV3IERhdGUoZW5kRGF0ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoc3RhcnQudG9TdHJpbmcoKSA9PT0gJ0ludmFsaWQgRGF0ZScpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoKGV2ZW50LnR5cGUgPT09IFwicmFuZ2VcIiB8fCBldmVudC50eXBlID09PSBcImJhY2tncm91bmRcIikgJiYgZW5kLnRvU3RyaW5nKCkgPT09ICdJbnZhbGlkIERhdGUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIEV2ZW50IGRhdGFcblx0XHRcdFx0aXRlbXMuYWRkKHtcblx0XHRcdFx0XHRpZDogaXRlbXMubGVuZ3RoICsgMSxcblx0XHRcdFx0XHRjb250ZW50OiBldmVudC50aXRsZSA/PyAnJyxcblx0XHRcdFx0XHR0aXRsZTogbm90ZUNhcmQub3V0ZXJIVE1MLFxuXHRcdFx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdFx0XHRjbGFzc05hbWU6IGV2ZW50LmNsYXNzID8/ICcnLFxuXHRcdFx0XHRcdHR5cGU6IGV2ZW50LnR5cGUsXG5cdFx0XHRcdFx0ZW5kOiBlbmQgPz8gbnVsbFxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0Ly8gQ29uZmlndXJhdGlvbiBmb3IgdGhlIFRpbWVsaW5lXG5cdFx0bGV0IG9wdGlvbnMgPSB7XG5cdFx0XHRtaW5IZWlnaHQ6ICthcmdzLmRpdkhlaWdodCxcblx0XHRcdHNob3dDdXJyZW50VGltZTogZmFsc2UsXG5cdFx0XHRzaG93VG9vbHRpcHM6IGZhbHNlLFxuXHRcdFx0dGVtcGxhdGU6IGZ1bmN0aW9uIChpdGVtOiBhbnkpIHtcblxuXHRcdFx0XHRsZXQgZXZlbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblx0XHRcdFx0ZXZlbnRDb250YWluZXIuc2V0VGV4dChpdGVtLmNvbnRlbnQpO1xuXHRcdFx0XHRsZXQgZXZlbnRDYXJkID0gZXZlbnRDb250YWluZXIuY3JlYXRlRGl2KCk7XG5cdFx0XHRcdGV2ZW50Q2FyZC5vdXRlckhUTUwgPSBpdGVtLnRpdGxlO1xuXHRcdFx0XHRldmVudENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcblx0XHRcdFx0XHRsZXQgZWwgPSAoZXZlbnRDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmUtY2FyZCcpWzBdIGFzIEhUTUxFbGVtZW50KTtcblx0XHRcdFx0XHRlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZGlzcGxheScsICdibG9jaycpO1xuXHRcdFx0XHRcdGVsLnN0eWxlLnNldFByb3BlcnR5KCd0b3AnLCBgLSR7ZWwuY2xpZW50SGVpZ2h0ICsgMTB9cHhgKTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybiBldmVudENvbnRhaW5lcjtcblx0XHRcdH0sXG5cdFx0XHRzdGFydDogY3JlYXRlRGF0ZShhcmdzLnN0YXJ0RGF0ZSksXG5cdFx0XHRlbmQ6IGNyZWF0ZURhdGUoYXJncy5lbmREYXRlKSxcblx0XHRcdG1pbjogY3JlYXRlRGF0ZShhcmdzLm1pbkRhdGUpLFxuXHRcdFx0bWF4OiBjcmVhdGVEYXRlKGFyZ3MubWF4RGF0ZSlcblx0XHR9O1xuXG5cdFx0Ly8gQ3JlYXRlIGEgVGltZWxpbmVcblx0XHR0aW1lbGluZS5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RpbWVsaW5lLXZpcycpO1xuXHRcdG5ldyBUaW1lbGluZSh0aW1lbGluZSwgaXRlbXMsIG9wdGlvbnMpO1xuXG5cdFx0Ly8gUmVwbGFjZSB0aGUgc2VsZWN0ZWQgdGFncyB3aXRoIHRoZSB0aW1lbGluZSBodG1sXG5cdFx0ZWwuYXBwZW5kQ2hpbGQodGltZWxpbmUpO1xuXHR9XG59XG4iLCJpbXBvcnQgdHlwZSB7IFRpbWVsaW5lc1NldHRpbmdzIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX1NFVFRJTkdTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgVGltZWxpbmVzU2V0dGluZ1RhYiB9IGZyb20gJy4vc2V0dGluZ3MnO1xuaW1wb3J0IHsgVGltZWxpbmVQcm9jZXNzb3IgfSBmcm9tICcuL2Jsb2NrJztcbmltcG9ydCB7IFBsdWdpbiwgTWFya2Rvd25WaWV3IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaW1lbGluZXNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4ge1xuXHRzZXR0aW5nczogVGltZWxpbmVzU2V0dGluZ3M7XG5cblx0YXN5bmMgb25sb2FkKCkge1xuXHRcdC8vIExvYWQgbWVzc2FnZVxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cdFx0Y29uc29sZS5sb2coJ0xvYWRlZCBUaW1lbGluZXMgUGx1Z2luJyk7XG5cblx0XHQvLyBSZWdpc3RlciB0aW1lbGluZSBibG9jayByZW5kZXJlclxuXHRcdHRoaXMucmVnaXN0ZXJNYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3NvcigndGltZWxpbmUnLCBhc3luYyAoc291cmNlLCBlbCwgY3R4KSA9PiB7XG5cdFx0XHRjb25zdCBwcm9jID0gbmV3IFRpbWVsaW5lUHJvY2Vzc29yKCk7XG5cdFx0XHRhd2FpdCBwcm9jLnJ1bihzb3VyY2UsIGVsLCB0aGlzLnNldHRpbmdzLCB0aGlzLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCksIHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUsIHRoaXMuYXBwLnZhdWx0LCBmYWxzZSk7XG5cdFx0fSk7XG5cblx0XHQvLyBSZWdpc3RlciB2aXMtdGltZWxpbmUgYmxvY2sgcmVuZGVyZXJcblx0XHR0aGlzLnJlZ2lzdGVyTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IoJ3RpbWVsaW5lLXZpcycsIGFzeW5jIChzb3VyY2UsIGVsLCBjdHgpID0+IHtcblx0XHRcdGNvbnN0IHByb2MgPSBuZXcgVGltZWxpbmVQcm9jZXNzb3IoKTtcblx0XHRcdGF3YWl0IHByb2MucnVuKHNvdXJjZSwgZWwsIHRoaXMuc2V0dGluZ3MsIHRoaXMuYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKSwgdGhpcy5hcHAubWV0YWRhdGFDYWNoZSwgdGhpcy5hcHAudmF1bHQsIHRydWUpO1xuXHRcdH0pO1xuXG5cdFx0dGhpcy5hZGRDb21tYW5kKHtcblx0XHRcdGlkOiBcInJlbmRlci10aW1lbGluZVwiLFxuXHRcdFx0bmFtZTogXCJSZW5kZXIgVGltZWxpbmVcIixcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHByb2MgPSBuZXcgVGltZWxpbmVQcm9jZXNzb3IoKTtcblx0XHRcdFx0bGV0IHZpZXcgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0QWN0aXZlVmlld09mVHlwZShNYXJrZG93blZpZXcpO1xuXHRcdFx0XHRpZiAodmlldykge1xuXHRcdFx0XHRcdGF3YWl0IHByb2MuaW5zZXJ0VGltZWxpbmVJbnRvQ3VycmVudE5vdGUodmlldywgdGhpcy5zZXR0aW5ncywgdGhpcy5hcHAudmF1bHQuZ2V0TWFya2Rvd25GaWxlcygpLCB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLCB0aGlzLmFwcC52YXVsdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgVGltZWxpbmVzU2V0dGluZ1RhYih0aGlzLmFwcCwgdGhpcykpO1xuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdFx0Y29uc29sZS5sb2coJ3VubG9hZGluZyBwbHVnaW4nKTtcblx0fVxuXG5cdGFzeW5jIGxvYWRTZXR0aW5ncygpIHtcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9TRVRUSU5HUywgYXdhaXQgdGhpcy5sb2FkRGF0YSgpKTtcblx0fVxuXG5cdGFzeW5jIHNhdmVTZXR0aW5ncygpIHtcblx0XHRhd2FpdCB0aGlzLnNhdmVEYXRhKHRoaXMuc2V0dGluZ3MpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiUGx1Z2luU2V0dGluZ1RhYiIsIlNldHRpbmciLCJ0aGlzIiwicmVxdWlyZSIsIkhhbW1lciIsIlJlYWxIYW1tZXIiLCJFbWl0dGVyIiwiZXh0ZW5kIiwidG9BcnJheSIsImhhc1BhcmVudCIsIkhhbW1lciQxIiwicmVxdWlyZSQkMCIsInJlcXVpcmUkJDEiLCJyZXF1aXJlJCQyIiwicmVxdWlyZSQkMyIsInY0IiwiXyIsIkRFRkFVTFQiLCJwYXJzZVN0eWxlIiwiRmlsdGVyQ1NTIiwiZ2V0RGVmYXVsdFdoaXRlTGlzdCIsInNhZmVBdHRyVmFsdWUiLCJwYXJzZVRhZyIsInBhcnNlciIsInBhcnNlQXR0ciIsImlzTnVsbCIsInNoYWxsb3dDb3B5T2JqZWN0IiwieHNzIiwiRmlsdGVyWFNTIiwibW9tZW50IiwibW9tZW50JDMiLCJBU1BEYXRlUmVnZXgiLCJ1dGlsIiwiaGFtbWVyTW9jayIsIlByb3BhZ2F0aW5nSGFtbWVyIiwiQWN0aXZhdG9yIiwiX2hhc1BhcmVudCIsIlBvcHVwIiwiZXJyb3JGb3VuZCIsImFsbE9wdGlvbnMiLCJWYWxpZGF0b3IiLCJtb21lbnQkMSIsImFsbE9wdGlvbnMkMSIsImh0bWxDb2xvcnMiLCJDb2xvclBpY2tlciIsIkNvbmZpZ3VyYXRvciIsImdsb2JhbCIsImdldEFsbFRhZ3MiLCJEYXRhU2V0IiwiUGx1Z2luIiwiTWFya2Rvd25WaWV3Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENB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SUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQztBQUN6QjtBQUNBLFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtBQUNqRCxZQUFZLEVBQUUsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7QUFDeEQsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsWUFBWSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDNUIsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsWUFBWSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDNUIsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDbkMsWUFBWSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDNUIsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDeEMsWUFBWSxFQUFFLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDdEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDckMsWUFBWSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDaEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7QUFDdkMsWUFBWSxFQUFFLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDcEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJ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Q0FBQyxDQUFDO0FBQ1AsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDekQsUUFBUSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUNuQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxRQUFRLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2pELEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLFVBQVUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDM0QsUUFBUSxJQUFJLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7QUFDbkMsWUFBWSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDcEMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkQsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsUUFBUSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNsRCxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUksU0FBUyxVQUFVLENBQUMsS0FBSyxFQUFFO0FBQy9CO0FBQ0E7QUFDQSxRQUFRLE9BQU8sQ0FBQyxLQUFLLEdBQUcsRUFBRSxFQUFF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RUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDcEQsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ2xELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ3ZDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ25ELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBQ3hDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ3BELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ3JELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDO0FBQzFDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ3RELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsTUFBTSxDQUFDO0FBQzNDLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZO0FBQ3ZELFFBQVEsT0FBTyxJQUFJLENBQUMsV0FB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QUMsT0FBTyxDQUFDO0FBQy9DLEtBQUssQ0FBQztBQUNOLElBQUksQ0FBQyxFQUFFLENBQUM7QUFDUixHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU87QUFDVCxJQUFJLFNBQVMsRUFBRSxHQUFHLEVBQUU7QUFDcEIsSUFBSSxRQUFRLEVBQUUsUUFBUTtBQUN0QixJQUFJLE1BQU0sRUFBRSxTQUFTLENBQUMsUUFBUSxDQUFDO0FBQy9CLElBQUksTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQ3hCLElBQUksTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO0FBQ3hCLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO0FBQ3BDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNkLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQztBQUNyQixHQUFHO0FBQ0g7QUFDQSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RDLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO0FBQ2pDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNkLElBQUks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Q0FBQztBQUN2QixJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixJQUFJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN2QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtBQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEIsU0FBUztBQUNULFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtBQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEIsU0FBUztBQUNULFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixRQUFRLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRTtBQUNwQixZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEIsU0FBUztBQUNULEtBQUs7QUFDTCxJQUFJLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLElBQUksR0FBRztBQUNoQixJQUFJLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUN2QixJQUFJLE9BQU8sVUFBVSxJQUFJLEVBQUU7QUFDM0IsUUFBUSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDdkMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdB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LE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZUFBZSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7QUFDM0MsSUFBSSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxJQUFJLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDN0MsSUFBSSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLFNBQVMsRUFBRTtBQUNsRCxRQUFRLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQy9DLEtBQUssQ0FBQyxDQUFDO0FBQ1AsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQ25DLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO0FBQy9CO0FBQ0EsUUFBUSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0FBQ2xDLFFBQVEsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxZQUFZLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNDLFNBQVM7QUFDVCxLQUFLO0FBQ0wsU0FBUztBQUNUO0FBQ0EsUUFBUSxLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRTtBQUNsQyxZQUFZLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxj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QUFDO0FBQ2QsWUFBWSxPQUFPLEtBQUssQ0FBQztBQUN6QixTQUFTO0FBQ1QsS0FBSztBQUNMLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUNwQyxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3BCLElBQUksS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDeEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUN0QixJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDeEQsSUFBSSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ3hEO0FBQ0EsSUFBSSxJQUFJLE1BQU0sS0FBSyxNQUFNLEVBQUU7QUFDM0IsUUFBUSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUN6QyxLQUFLO0FBQ0w7QUFDQSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLEdBQUcsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLEtBQUssTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUN6RixJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsS0FBSyxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUMs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LE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxZQUFZLE1BQU07QUFDbEIsUUFBUSxLQUFLLENBQUM7QUFDZCxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0QyxZQUFZLE1BQU07QUFDbEIsS0FBSztBQUNMLElBQUksT0FBTztBQUNYLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUM5QixRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDOUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQzlCLEtBQUssQ0FBQztBQUNOLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUMzQixJQUFJLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xDLElBQUksT0FBTyxRQUFRLENBQUMs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SUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQztBQUNsRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDOUI7QUFDQSxJQUFJLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0MsSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLGFBQWEsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztBQUN0RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNmO0FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzNDO0FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlO0FBQzlDLE1BQU0sT0FBTztBQUNiLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRyxDQUFDO0FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxlQUFlO0FBQzFDLE1BQU0sT0FBTztBQUNiLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRyxDQUFDO0FBQ1YsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsUUFBUSxHQUFHO0FBQ2IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7QUFDaEQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDakQ7QUFDQSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDekQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQzFELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxHQUFHO0FBQ1osSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQUM5QztBQUNBLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELElBQUksSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDN0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQztBQUN4RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzlEO0FBQ0EsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5RCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQzVEO0FBQ0EsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRTtBQUM1QyxNQUFNLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckQsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkMsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFDekMsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdEMsTUFBTSxRQUFRLENBQUMsU0FBUyxHQUFHLGtEQUFrRCxDQUFDO0FBQzlFLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNuRCxLQUFLLE1BQU07QUFDWCxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUQsTUFBTSxJQUFJLENBQUMsVUFBVTtBQUNyQixRQUFRLENBQUMsTUFBTSxDQUFDLGdCQUFnQixJQUFJLENBQUM7QUFDckMsU0FBUyxHQUFHLENBQUMsNEJBQTRCO0FBQ3pDLFVBQVUsR0FBRyxDQUFDLHlCQUF5QjtBQUN2QyxVQUFVLEdBQUcsQ0FBQyx3QkFBd0I7QUFDdEMsVUFBVSxHQUFHLENBQUMsdUJBQXVCO0FBQ3JDLFVBQVUsR0FBRyxDQUFDLHNCQUFzQjtBQUNwQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0FBQ2IsTUFBTSxJQUFJLENBQUMsaUJBQWlCO0FBQzVCLFNBQVMsVUFBVSxDQUFDLElBQUksQ0FBQztBQUN6QixTQUFTLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEUsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7QUFDaEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztBQUM5QztBQUNBLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7QUFDcEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUMxQztBQUNBLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hELElBQUksSUFBSTtBQUNSLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQ3ZDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2xDLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRTtBQUNsQjtBQUNBLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNwQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUM5QztBQUNBLElBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNELElBQUksSUFBSTtBQUNSLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0FBQzFDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3JDLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDLEtBQUssQ0FBQyxPQUFPLEdBQUcsRUFBRTtBQUNsQjtBQUNBLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN2QyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUNqRDtBQUNBLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25ELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3pEO0FBQ0EsSUFBSSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQzdDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQzVDLE1BQU0sRUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQ2hELE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQy9DLE1BQU0sRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEMsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6RCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLDBCQUEwQixDQUFDO0FBQ2hFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUMxRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQztBQUM3QztBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3JELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0FBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQ3ZDO0FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztBQUN6RCxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztBQUMvQztBQUNBLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsdUJBQXVCLENBQUM7QUFDMUQsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7QUFDM0MsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDN0Q7QUFDQSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO0FBQ3hELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDO0FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNwRCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDO0FBQ3RELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO0FBQzVDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNoRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqRCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUMvQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM1QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqRDtBQUNBLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzlDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzdDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzVDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVcsR0FBRztBQUNoQixJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO0FBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDcEIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUlMLFFBQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNyRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFLLEtBQUs7QUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDekIsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLE9BQU87QUFDUCxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxLQUFLO0FBQ3JDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxLQUFLO0FBQzFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxLQUFLO0FBQ3pDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxLQUFLLENBQUMsQ0FBQztBQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxLQUFLO0FBQ3hDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNoQyxLQUFLLENBQUMsQ0FBQztBQUNQLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGtCQUFrQixHQUFHO0FBQ3ZCLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLEtBQUssRUFBRTtBQUNsQyxNQUFNLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUQsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFO0FBQzFDLFFBQVEsSUFBSSxDQUFDLFVBQVU7QUFDdkIsVUFBVSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDO0FBQ3ZDLFdBQVcsR0FBRyxDQUFDLDRCQUE0QjtBQUMzQyxZQUFZLEdBQUcsQ0FBQyx5QkFBeUI7QUFDekMsWUFBWSxHQUFHLENBQUMsd0JBQXdCO0FBQ3hDLFlBQVksR0FBRyxDQUFDLHVCQUF1QjtBQUN2QyxZQUFZLEdBQUcsQ0FBQyxzQkFBc0I7QUFDdEMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUNmLE9BQU87QUFDUCxNQUFNLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JFO0FBQ0E7QUFDQSxNQUFNLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUM7QUFDbkQsTUFBTSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDO0FBQ3BELE1BQU0sR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNoQztBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQztBQUN6QixNQUFNLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFDMUQsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQztBQUMvQyxNQUFNLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0IsTUFBTSxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM5QixNQUFNLElBQUksR0FBRyxDQUFDO0FBQ2QsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtBQUN0QyxRQUFRLEtBQUssR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtBQUMzQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1RSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUM1RSxVQUFVLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3BELFVBQVUsR0FBRyxDQUFDLFNBQVMsR0FBRyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDM0UsVUFBVSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0MsU0FBUztBQUNULE9BQU87QUFDUCxNQUFNLEdBQUcsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDO0FBQ3hDLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLE1BQU0sR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQ25CO0FBQ0EsTUFBTSxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEQsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDMUIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFO0FBQ3ZCLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0FBQzdELElBQUksTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztBQUM1QyxJQUFJLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDMUM7QUFDQSxJQUFJLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQztBQUMzRCxJQUFJLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztBQUMxRDtBQUNBLElBQUksTUFBTSxDQUFDLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUM3QixJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFDNUI7QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25DLElBQUksTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RTtBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3RELElBQUksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUc7QUFDdEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ2xFLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJO0FBQ3ZDLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztBQUNsRTtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLElBQUksTUFBTSxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDOUIsSUFBSSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDN0IsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN0QjtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlO0FBQzlDLE1BQU0sT0FBTztBQUNiLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sR0FBRyxDQUFDO0FBQ1YsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxlQUFlO0FBQzFDLE1BQU0sT0FBTztBQUNiLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRztBQUNULE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xCLE1BQU0sR0FBRyxDQUFDO0FBQ1YsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFJLEVBQUU7QUFDNUIsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZCLElBQUksTUFBTSxJQUFJLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQzlDLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ2hDLElBQUksT0FBTyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVDLEdBQUcsTUFBTTtBQUNULElBQUksTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckQsSUFBSSxPQUFPLE9BQU8sQ0FBQztBQUNuQixHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxZQUFZLENBQUM7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVc7QUFDYixJQUFJLFlBQVk7QUFDaEIsSUFBSSxnQkFBZ0I7QUFDcEIsSUFBSSxnQkFBZ0I7QUFDcEIsSUFBSSxVQUFVLEdBQUcsQ0FBQztBQUNsQixJQUFJLFVBQVUsR0FBRyxNQUFNLEtBQUs7QUFDNUIsSUFBSTtBQUNKLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7QUFDL0IsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUM3QixJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsZ0JBQWdCLENBQUM7QUFDdEMsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztBQUMvQixJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0FBQ2pDO0FBQ0EsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN0QixJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzdCLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHO0FBQzFCLE1BQU0sT0FBTyxFQUFFLEtBQUs7QUFDcEIsTUFBTSxNQUFNLEVBQUUsSUFBSTtBQUNsQixNQUFNLFNBQVMsRUFBRSxTQUFTO0FBQzFCLE1BQU0sVUFBVSxFQUFFLElBQUk7QUFDdEIsS0FBSyxDQUFDO0FBQ04sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3JEO0FBQ0EsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7QUFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7QUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQzNCLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNuRCxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBQzdCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRTtBQUN0QixJQUFJLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtBQUMvQjtBQUNBLE1BQU0sSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDN0IsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7QUFDMUI7QUFDQSxNQUFNLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDO0FBQ3RDLE9BQU8sTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7QUFDekMsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDN0MsT0FBTyxNQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzlDLFFBQVEsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO0FBQzdCLFVBQVUsTUFBTSxJQUFJLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3hELFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUU7QUFDN0MsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO0FBQ3JELFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFDMUMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQy9DLFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUU7QUFDOUMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0FBQ3ZELFNBQVM7QUFDVCxRQUFRLElBQUksT0FBTyxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDM0MsVUFBVSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUNwQyxTQUFTO0FBQ1QsT0FBTyxNQUFNLElBQUksT0FBTyxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQy9DLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ25DLFFBQVEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMxQixPQUFPLE1BQU0sSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUU7QUFDaEQsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7QUFDdEMsUUFBUSxPQUFPLEdBQUcsSUFBSSxDQUFDO0FBQ3ZCLE9BQU87QUFDUCxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFO0FBQ3pDLFFBQVEsT0FBTyxHQUFHLEtBQUssQ0FBQztBQUN4QixPQUFPO0FBQ1A7QUFDQSxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNyQyxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDbEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdCQUFnQixDQUFDLGFBQWEsRUFBRTtBQUNsQyxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0FBQ3ZDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDdkMsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDcEIsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtBQUNoRCxRQUFRLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7QUFDaEQsT0FBTztBQUNQLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3JCLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNsQixJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBQzdCO0FBQ0EsSUFBSSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN2QyxJQUFJLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNwQixJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztBQUNyQixJQUFJLEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO0FBQ2hELE1BQU0sSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFO0FBQy9FLFFBQVEsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDbkMsUUFBUSxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQ3JCLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDMUMsVUFBVSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNwQyxVQUFVLElBQUk7QUFDZCxZQUFZLElBQUk7QUFDaEIsWUFBWSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlFLFNBQVMsTUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUNyRSxVQUFVLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEIsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7QUFDNUIsVUFBVSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztBQUNwQztBQUNBO0FBQ0EsVUFBVSxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDM0IsWUFBWSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLFdBQVc7QUFDWDtBQUNBLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNuQztBQUNBO0FBQ0EsVUFBVSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDdEUsU0FBUztBQUNULFFBQVEsT0FBTyxFQUFFLENBQUM7QUFDbEIsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNqQjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLEtBQUssR0FBRztBQUNWLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsMkJBQTJCLENBQUM7QUFDekQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0MsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEQsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEQsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztBQUM5QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxNQUFNLEdBQUc7QUFDWCxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwRCxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDcEMsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0MsTUFBTSxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztBQUMvQixLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztBQUMxQjtBQUNBLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3hCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFO0FBQ2xCLElBQUksSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztBQUNsQyxJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixPQUFPLE1BQU07QUFDYixRQUFRLElBQUksR0FBRyxTQUFTLENBQUM7QUFDekIsUUFBUSxNQUFNO0FBQ2QsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDO0FBQ2hCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFNBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUU7QUFDbEMsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO0FBQ3JDLE1BQU0sTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNqRCxNQUFNLElBQUksQ0FBQyxTQUFTO0FBQ3BCLFFBQVEsZ0RBQWdELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN2RSxNQUFNLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUs7QUFDdkMsUUFBUSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xDLE9BQU8sQ0FBQyxDQUFDO0FBQ1QsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsQyxNQUFNLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7QUFDckMsS0FBSztBQUNMLElBQUksT0FBTyxDQUFDLENBQUM7QUFDYixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVcsQ0FBQyxJQUFJLEVBQUU7QUFDcEIsSUFBSSxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlDLElBQUksR0FBRyxDQUFDLFNBQVMsR0FBRyxxQ0FBcUMsQ0FBQztBQUMxRCxJQUFJLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEdBQUcsS0FBSyxFQUFFO0FBQzlDLElBQUksTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QyxJQUFJLEdBQUcsQ0FBQyxTQUFTO0FBQ2pCLE1BQU0saURBQWlELEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUN0RSxJQUFJLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtBQUM5QixNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsRUFBRTtBQUM3QixRQUFRLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3hDLE9BQU87QUFDUCxNQUFNLEdBQUcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNqRCxLQUFLLE1BQU07QUFDWCxNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNqQyxLQUFLO0FBQ0wsSUFBSSxPQUFPLEdBQUcsQ0FBQztBQUNmLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUNsQyxJQUFJLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDcEQsSUFBSSxNQUFNLENBQUMsU0FBUyxHQUFHLHFDQUFxQyxDQUFDO0FBQzdELElBQUksSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQzFCLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQzdCLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ3JDLFFBQVEsYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0MsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDekMsTUFBTSxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RELE1BQU0sTUFBTSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsTUFBTSxJQUFJLENBQUMsS0FBSyxhQUFhLEVBQUU7QUFDL0IsUUFBUSxNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUNyQyxPQUFPO0FBQ1AsTUFBTSxNQUFNLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEIsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDbEMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkMsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDeEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQy9CLElBQUksTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLElBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLElBQUksTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLElBQUksTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNsRCxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsb0NBQW9DLENBQUM7QUFDM0QsSUFBSSxJQUFJO0FBQ1IsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztBQUMzQixNQUFNLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ3RCLE1BQU0sS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDdEIsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFO0FBQ2xCO0FBQ0EsS0FBSztBQUNMLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDdEI7QUFDQTtBQUNBLElBQUksSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLElBQUksSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCO0FBQ0EsSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDN0IsTUFBTSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUM7QUFDekIsTUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxHQUFHLEVBQUU7QUFDN0MsUUFBUSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlDLFFBQVEsVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDL0IsUUFBUSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDeEMsT0FBTyxNQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sR0FBRyxHQUFHLEVBQUU7QUFDdkMsUUFBUSxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0FBQzlDLFFBQVEsVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUM7QUFDL0IsUUFBUSxXQUFXLEdBQUcsaUJBQWlCLENBQUM7QUFDeEMsT0FBTztBQUNQLE1BQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO0FBQzdDLFFBQVEsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztBQUM5QyxRQUFRLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQy9CLFFBQVEsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU87QUFDUCxNQUFNLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzFCLEtBQUssTUFBTTtBQUNYLE1BQU0sS0FBSyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUM7QUFDakMsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2xELElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyx5Q0FBeUMsQ0FBQztBQUNoRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUM5QjtBQUNBLElBQUksTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLElBQUksS0FBSyxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQ2pDLE1BQU0sS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQy9CLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLEtBQUssQ0FBQztBQUNOLElBQUksS0FBSyxDQUFDLE9BQU8sR0FBRyxZQUFZO0FBQ2hDLE1BQU0sS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQy9CLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9ELElBQUksTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoRTtBQUNBO0FBQ0EsSUFBSSxJQUFJLFdBQVcsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDM0UsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUNoRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9DLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxXQUFXLEdBQUc7QUFDaEIsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtBQUMxQyxNQUFNLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0QsTUFBTSxjQUFjLENBQUMsU0FBUyxHQUFHLHFDQUFxQyxDQUFDO0FBQ3ZFLE1BQU0sY0FBYyxDQUFDLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQUNwRCxNQUFNLGNBQWMsQ0FBQyxPQUFPLEdBQUcsTUFBTTtBQUNyQyxRQUFRLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUM3QixPQUFPLENBQUM7QUFDUixNQUFNLGNBQWMsQ0FBQyxXQUFXLEdBQUcsTUFBTTtBQUN6QyxRQUFRLGNBQWMsQ0FBQyxTQUFTLEdBQUcsMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxDQUFDO0FBQ1IsTUFBTSxjQUFjLENBQUMsVUFBVSxHQUFHLE1BQU07QUFDeEMsUUFBUSxjQUFjLENBQUMsU0FBUyxHQUFHLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sQ0FBQztBQUNSO0FBQ0EsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RCxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTO0FBQ3JDLFFBQVEsK0NBQStDLENBQUM7QUFDeEQ7QUFDQSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDNUMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUM3QixJQUFJO0FBQ0osTUFBTSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUk7QUFDL0IsTUFBTSxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUk7QUFDakMsTUFBTSxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVO0FBQ3pDLE1BQU07QUFDTixNQUFNLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEQsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLHlCQUF5QixDQUFDO0FBQ3pDLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyx5QkFBeUIsQ0FBQztBQUNoRCxNQUFNLEdBQUcsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQzdCLE1BQU0sR0FBRyxDQUFDLE9BQU8sR0FBRyxNQUFNO0FBQzFCLFFBQVEsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQzVCLE9BQU8sQ0FBQztBQUNSLE1BQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUM7QUFDN0IsTUFBTSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7QUFDbEQsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFlBQVksR0FBRztBQUNqQixJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQzFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDOUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNoRCxNQUFNLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3pCLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxrQkFBa0IsR0FBRztBQUN2QixJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQzFDLE1BQU0sTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDekUsTUFBTSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0FBQ2hFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUN2RCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQzFELE1BQU0sUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxNQUFNO0FBQ25ELFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDN0MsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2YsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTTtBQUNyRCxRQUFRLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUM1QixPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDZixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQzNDLElBQUksTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQy9CLElBQUksUUFBUSxDQUFDLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQztBQUNqRSxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsWUFBWSxDQUFDO0FBQ3BDLElBQUksSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO0FBQzdCLE1BQU0sUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7QUFDL0IsTUFBTSxJQUFJLEtBQUssS0FBSyxZQUFZLEVBQUU7QUFDbEMsUUFBUSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsRUFBRTtBQUM5QyxVQUFVLElBQUksS0FBSyxLQUFLLFlBQVksQ0FBQyxPQUFPLEVBQUU7QUFDOUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDbkUsV0FBVztBQUNYLFNBQVMsTUFBTTtBQUNmLFVBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ2pFLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsSUFBSSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDcEIsSUFBSSxRQUFRLENBQUMsUUFBUSxHQUFHLFlBQVk7QUFDcEMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckMsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDMUMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQzVDLElBQUksTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNyRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBQzNCLElBQUksUUFBUSxDQUFDLFNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztBQUM3RCxJQUFJLFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLElBQUksSUFBSSxLQUFLLEtBQUssWUFBWSxFQUFFO0FBQ2hDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzdELEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxZQUFZO0FBQ3BDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25DLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9ELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzFDLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGVBQWUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUNwQyxJQUFJLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxJQUFJLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3ZEO0FBQ0EsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7QUFDMUIsTUFBTSxHQUFHLENBQUMsU0FBUyxHQUFHLHlDQUF5QyxDQUFDO0FBQ2hFLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQ3hDLEtBQUssTUFBTTtBQUNYLE1BQU0sR0FBRyxDQUFDLFNBQVMsR0FBRyw4Q0FBOEMsQ0FBQztBQUNyRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLFlBQVksR0FBRyxLQUFLLENBQUM7QUFDdkQsSUFBSSxHQUFHLENBQUMsT0FBTyxHQUFHLE1BQU07QUFDeEIsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QyxLQUFLLENBQUM7QUFDTjtBQUNBLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvRCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNyQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRTtBQUNyQztBQUNBLElBQUksR0FBRyxDQUFDLE9BQU8sR0FBRyxZQUFZLEVBQUUsQ0FBQztBQUNqQztBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVCO0FBQ0EsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLEtBQUs7QUFDbEQsTUFBTSxNQUFNLFdBQVc7QUFDdkIsUUFBUSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7QUFDaEYsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxXQUFXLENBQUM7QUFDOUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QyxLQUFLLENBQUMsQ0FBQztBQUNQO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtBQUM1QyxNQUFNLEdBQUcsQ0FBQyxPQUFPLEdBQUcsTUFBTTtBQUMxQixRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hELE9BQU8sQ0FBQztBQUNSLEtBQUssQ0FBQyxDQUFDO0FBQ1AsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsU0FBUyxHQUFHLEtBQUssRUFBRTtBQUNuRCxJQUFJLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztBQUNyQixJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3ZDLElBQUksSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQzdCLElBQUksS0FBSyxNQUFNLE1BQU0sSUFBSSxHQUFHLEVBQUU7QUFDOUIsTUFBTSxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUU7QUFDN0QsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLFFBQVEsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2pDLFFBQVEsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pELFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDMUMsVUFBVSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN0QztBQUNBO0FBQ0EsVUFBVSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7QUFDOUIsWUFBWTtBQUNaLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztBQUNsQyxjQUFjLE9BQU8sSUFBSSxLQUFLLFFBQVE7QUFDdEMsY0FBYyxPQUFPLElBQUksS0FBSyxTQUFTO0FBQ3ZDLGNBQWMsSUFBSSxZQUFZLE1BQU07QUFDcEMsY0FBYztBQUNkLGNBQWMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDekMsY0FBYyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdELGNBQWMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLEtBQUssS0FBSyxDQUFDO0FBQ3ZELGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7QUFDNUIsVUFBVSxZQUFZLEdBQUcsSUFBSSxDQUFDO0FBQzlCLFVBQVUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRDtBQUNBLFVBQVUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ25DLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELFdBQVcsTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUMvQyxZQUFZLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RCxXQUFXLE1BQU0sSUFBSSxPQUFPLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDaEQsWUFBWSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsV0FBVyxNQUFNLElBQUksSUFBSSxZQUFZLE1BQU0sRUFBRTtBQUM3QztBQUNBLFlBQVksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7QUFDcEU7QUFDQSxjQUFjLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDOUMsZ0JBQWdCLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMzRSxnQkFBZ0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqRSxnQkFBZ0IsSUFBSSxZQUFZLEtBQUssSUFBSSxFQUFFO0FBQzNDLGtCQUFrQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkUsa0JBQWtCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pELGtCQUFrQixZQUFZO0FBQzlCLG9CQUFvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxZQUFZLENBQUM7QUFDdEUsaUJBQWlCLE1BQU07QUFDdkIsa0JBQWtCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNsRSxpQkFBaUI7QUFDakIsZUFBZSxNQUFNO0FBQ3JCLGdCQUFnQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDckUsZ0JBQWdCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLGdCQUFnQixZQUFZO0FBQzVCLGtCQUFrQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxZQUFZLENBQUM7QUFDcEUsZUFBZTtBQUNmLGFBQWE7QUFDYixXQUFXLE1BQU07QUFDakIsWUFBWSxPQUFPLENBQUMsS0FBSyxDQUFDLHlCQUF5QixFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUUsV0FBVztBQUNYLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMLElBQUksT0FBTyxZQUFZLENBQUM7QUFDeEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsWUFBWSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO0FBQ2pDLElBQUksSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE9BQU8sRUFBRTtBQUMxRCxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRTtBQUM1QixRQUFRLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUMvRCxPQUFPO0FBQ1AsS0FBSyxNQUFNLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO0FBQzNDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQzVCLFFBQVEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELE9BQU87QUFDUCxLQUFLLE1BQU0sSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7QUFDM0MsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDeEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDNUIsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdkUsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7QUFDdkIsSUFBSSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3hEO0FBQ0EsSUFBSTtBQUNKLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJO0FBQ3RCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTztBQUM5QixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO0FBQ25DLE1BQU07QUFDTixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdELEtBQUs7QUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFO0FBQ2xELElBQUksSUFBSSxPQUFPLEdBQUcsVUFBVSxDQUFDO0FBQzdCO0FBQ0E7QUFDQSxJQUFJLEtBQUssR0FBRyxLQUFLLEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7QUFDNUMsSUFBSSxLQUFLLEdBQUcsS0FBSyxLQUFLLE9BQU8sR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzlDO0FBQ0EsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtBQUNoQyxRQUFRLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUM1QyxVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsU0FBUztBQUNULFFBQVEsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbkMsVUFBVSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3JDLFNBQVMsTUFBTTtBQUNmLFVBQVUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNuQyxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLE9BQU8sVUFBVSxDQUFDO0FBQ3RCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsYUFBYSxHQUFHO0FBQ2xCLElBQUksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ3RDO0FBQ0EsSUFBSSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUU7QUFDN0MsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUMxRSxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVztBQUNyQyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdFLEtBQUssQ0FBQztBQUNOLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxVQUFVLEdBQUc7QUFDZixJQUFJLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUN2QixJQUFJLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6RCxNQUFNLElBQUksQ0FBQyxpQkFBaUI7QUFDNUIsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7QUFDcEMsUUFBUSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7QUFDbkMsUUFBUSxPQUFPO0FBQ2YsT0FBTyxDQUFDO0FBQ1IsS0FBSztBQUNMLElBQUksT0FBTyxPQUFPLENBQUM7QUFDbkIsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sS0FBSyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVcsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFO0FBQ3pDLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7QUFDL0IsSUFBSSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsSUFBSSxLQUFLLENBQUM7QUFDbEQ7QUFDQSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2YsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDckIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztBQUN4QjtBQUNBO0FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7QUFDekMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDM0MsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ3BCLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO0FBQ25CLElBQUksSUFBSSxPQUFPLFlBQVksT0FBTyxFQUFFO0FBQ3BDLE1BQU0sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRTtBQUNwQyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEQsT0FBTztBQUNQLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsS0FBSyxNQUFNO0FBQ1g7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQ3JDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2YsSUFBSSxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3BCLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFO0FBQ3pCLE1BQU0sTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUM7QUFDN0MsTUFBTSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztBQUMzQyxNQUFNLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztBQUMzRCxNQUFNLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztBQUN6RDtBQUNBLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUNsQixRQUFRLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDaEI7QUFDQSxNQUFNLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxNQUFNLEVBQUU7QUFDekMsUUFBUSxJQUFJLE1BQU0sR0FBRyxLQUFLO0FBQzFCLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN2QjtBQUNBLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQzVDLFVBQVUsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7QUFDdEQsVUFBVSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLFNBQVM7QUFDVDtBQUNBLFFBQVEsSUFBSSxNQUFNLEVBQUU7QUFDcEIsVUFBVSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDaEMsU0FBUyxNQUFNO0FBQ2YsVUFBVSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN4QixTQUFTO0FBQ1Q7QUFDQSxRQUFRLElBQUksS0FBSyxFQUFFO0FBQ25CLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQ2hDLFNBQVMsTUFBTTtBQUNmLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDdkIsU0FBUztBQUNULE9BQU8sTUFBTTtBQUNiLFFBQVEsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBQzlCLFFBQVEsSUFBSSxHQUFHLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxFQUFFO0FBQ3JELFVBQVUsR0FBRyxHQUFHLFNBQVMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNsRCxTQUFTO0FBQ1QsUUFBUSxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2hDLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDN0IsU0FBUztBQUNUO0FBQ0EsUUFBUSxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN0QixRQUFRLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsRUFBRTtBQUNwRCxVQUFVLElBQUksR0FBRyxRQUFRLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7QUFDakQsU0FBUztBQUNULFFBQVEsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUNqQyxVQUFVLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQzlCLFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQzFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDeEMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0FBQzlDLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7QUFDMUIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEIsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHO0FBQ1QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN2QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7QUFDaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQy9CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztBQUMzQyxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sR0FBRztBQUNaLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRCxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0EsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLElBQUksVUFBVSxDQUFDO0FBQ2Y7QUFDQSxNQUFNLHFCQUFxQixHQUFHLHFDQUFxQyxDQUFDO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxTQUFTLENBQUM7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLFFBQVEsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFO0FBQ3hELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztBQUN2QixJQUFJLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQztBQUNsQyxJQUFJLElBQUksV0FBVyxHQUFHLGdCQUFnQixDQUFDO0FBQ3ZDLElBQUksSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO0FBQ2pDLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELEtBQUs7QUFDTCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QyxJQUFJLE9BQU8sVUFBVSxDQUFDO0FBQ3RCLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7QUFDaEQsSUFBSSxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtBQUNsQyxNQUFNLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsRUFBRTtBQUNqRSxRQUFRLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxLQUFLLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUU7QUFDeEQsSUFBSTtBQUNKLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztBQUM1QyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQzVDLE1BQU07QUFDTixNQUFNLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzlELE1BQU0sT0FBTztBQUNiLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLElBQUksSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ3pCO0FBQ0EsSUFBSTtBQUNKLE1BQU0sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUztBQUM1QyxNQUFNLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxTQUFTO0FBQzVDLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDO0FBQ2xFLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxZQUFZLEdBQUcsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDekQsSUFBSSxJQUFJLFNBQVMsSUFBSSxZQUFZLENBQUMsUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO0FBQzNDLEtBQUs7QUFDTDtBQUNBLElBQUksU0FBUyxDQUFDLFdBQVc7QUFDekIsTUFBTSxNQUFNO0FBQ1osTUFBTSxPQUFPO0FBQ2IsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxlQUFlO0FBQ3JCLE1BQU0sWUFBWTtBQUNsQixNQUFNLElBQUk7QUFDVixLQUFLLENBQUM7QUFDTixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxXQUFXO0FBQ3BCLElBQUksTUFBTTtBQUNWLElBQUksT0FBTztBQUNYLElBQUksZ0JBQWdCO0FBQ3BCLElBQUksZUFBZTtBQUNuQixJQUFJLFlBQVk7QUFDaEIsSUFBSSxJQUFJO0FBQ1IsSUFBSTtBQUNKLElBQUksTUFBTSxHQUFHLEdBQUcsVUFBVSxPQUFPLEVBQUU7QUFDbkMsTUFBTSxPQUFPLENBQUMsS0FBSztBQUNuQixRQUFRLElBQUksR0FBRyxPQUFPLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO0FBQzlELFFBQVEscUJBQXFCO0FBQzdCLE9BQU8sQ0FBQztBQUNSLEtBQUssQ0FBQztBQUNOO0FBQ0EsSUFBSSxNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzFELElBQUksTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25EO0FBQ0EsSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTLEVBQUU7QUFDckM7QUFDQSxNQUFNO0FBQ04sUUFBUSxTQUFTLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLE9BQU87QUFDcEQsUUFBUSxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxRQUFRO0FBQ1IsUUFBUSxHQUFHO0FBQ1gsVUFBVSw4QkFBOEI7QUFDeEMsWUFBWSxNQUFNO0FBQ2xCLFlBQVksSUFBSTtBQUNoQixZQUFZLHNCQUFzQjtBQUNsQyxZQUFZLFNBQVMsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO0FBQzFDLFlBQVksUUFBUTtBQUNwQixZQUFZLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDM0IsWUFBWSxLQUFLO0FBQ2pCLFNBQVMsQ0FBQztBQUNWLFFBQVEsVUFBVSxHQUFHLElBQUksQ0FBQztBQUMxQixPQUFPLE1BQU0sSUFBSSxVQUFVLEtBQUssUUFBUSxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7QUFDM0UsUUFBUSxJQUFJLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELFFBQVEsU0FBUyxDQUFDLEtBQUs7QUFDdkIsVUFBVSxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3pCLFVBQVUsZ0JBQWdCLENBQUMsZUFBZSxDQUFDO0FBQzNDLFVBQVUsSUFBSTtBQUNkLFNBQVMsQ0FBQztBQUNWLE9BQU87QUFDUCxLQUFLLE1BQU0sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ2xEO0FBQ0EsTUFBTSxHQUFHO0FBQ1QsUUFBUSw2QkFBNkI7QUFDckMsVUFBVSxNQUFNO0FBQ2hCLFVBQVUsZUFBZTtBQUN6QixVQUFVLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNwRCxVQUFVLGNBQWM7QUFDeEIsVUFBVSxVQUFVO0FBQ3BCLFVBQVUsS0FBSztBQUNmLFVBQVUsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN6QixVQUFVLEdBQUc7QUFDYixPQUFPLENBQUM7QUFDUixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ3pCLElBQUksTUFBTSxJQUFJLEdBQUcsT0FBTyxNQUFNLENBQUM7QUFDL0I7QUFDQSxJQUFJLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtBQUMzQixNQUFNLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtBQUMzQixRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLE9BQU87QUFDUCxNQUFNLElBQUksTUFBTSxZQUFZLE9BQU8sRUFBRTtBQUNyQyxRQUFRLE9BQU8sU0FBUyxDQUFDO0FBQ3pCLE9BQU87QUFDUCxNQUFNLElBQUksTUFBTSxZQUFZLE1BQU0sRUFBRTtBQUNwQyxRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLE9BQU87QUFDUCxNQUFNLElBQUksTUFBTSxZQUFZLE1BQU0sRUFBRTtBQUNwQyxRQUFRLE9BQU8sUUFBUSxDQUFDO0FBQ3hCLE9BQU87QUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNqQyxRQUFRLE9BQU8sT0FBTyxDQUFDO0FBQ3ZCLE9BQU87QUFDUCxNQUFNLElBQUksTUFBTSxZQUFZLElBQUksRUFBRTtBQUNsQyxRQUFRLE9BQU8sTUFBTSxDQUFDO0FBQ3RCLE9BQU87QUFDUCxNQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7QUFDekMsUUFBUSxPQUFPLEtBQUssQ0FBQztBQUNyQixPQUFPO0FBQ1AsTUFBTSxJQUFJLE1BQU0sQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7QUFDNUMsUUFBUSxPQUFPLFFBQVEsQ0FBQztBQUN4QixPQUFPO0FBQ1AsTUFBTSxPQUFPLFFBQVEsQ0FBQztBQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQ2xDLE1BQU0sT0FBTyxRQUFRLENBQUM7QUFDdEIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLFNBQVMsRUFBRTtBQUNuQyxNQUFNLE9BQU8sU0FBUyxDQUFDO0FBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDbEMsTUFBTSxPQUFPLFFBQVEsQ0FBQztBQUN0QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO0FBQ25DLE1BQU0sT0FBTyxXQUFXLENBQUM7QUFDekIsS0FBSztBQUNMLElBQUksT0FBTyxJQUFJLENBQUM7QUFDaEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLGFBQWEsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtBQUM5QyxJQUFJLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUUsSUFBSSxNQUFNLFlBQVksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQy9FO0FBQ0EsSUFBSSxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUNuQyxJQUFJLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDO0FBQ0EsSUFBSSxJQUFJLEdBQUcsQ0FBQztBQUNaLElBQUksSUFBSSxXQUFXLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtBQUM5QyxNQUFNLEdBQUc7QUFDVCxRQUFRLE1BQU07QUFDZCxRQUFRLFNBQVMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO0FBQzdELFFBQVEsNENBQTRDO0FBQ3BELFFBQVEsV0FBVyxDQUFDLFVBQVU7QUFDOUIsUUFBUSxRQUFRLENBQUM7QUFDakIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxZQUFZLENBQUMsUUFBUSxJQUFJLHFCQUFxQjtBQUNwRCxNQUFNLFdBQVcsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLFFBQVE7QUFDbEQsTUFBTTtBQUNOLE1BQU0sR0FBRztBQUNULFFBQVEsTUFBTTtBQUNkLFFBQVEsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7QUFDN0QsUUFBUSxzREFBc0Q7QUFDOUQsUUFBUSxTQUFTLENBQUMsYUFBYTtBQUMvQixVQUFVLFlBQVksQ0FBQyxJQUFJO0FBQzNCLFVBQVUsWUFBWSxDQUFDLFlBQVk7QUFDbkMsVUFBVSxFQUFFO0FBQ1osU0FBUyxDQUFDO0FBQ1YsS0FBSyxNQUFNLElBQUksV0FBVyxDQUFDLFFBQVEsSUFBSSxvQkFBb0IsRUFBRTtBQUM3RCxNQUFNLEdBQUc7QUFDVCxRQUFRLGtCQUFrQjtBQUMxQixRQUFRLFdBQVcsQ0FBQyxZQUFZO0FBQ2hDLFFBQVEsSUFBSTtBQUNaLFFBQVEsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzFELEtBQUssTUFBTTtBQUNYLE1BQU0sR0FBRztBQUNULFFBQVEsK0JBQStCO0FBQ3ZDLFFBQVEsU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLFFBQVEsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUMsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsS0FBSztBQUNqQixNQUFNLDhCQUE4QixHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsR0FBRztBQUN6RCxNQUFNLHFCQUFxQjtBQUMzQixLQUFLLENBQUM7QUFDTixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDdEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sYUFBYSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsR0FBRyxLQUFLLEVBQUU7QUFDakUsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDbEIsSUFBSSxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7QUFDMUIsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUM5QixJQUFJLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUNqRCxJQUFJLElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQztBQUMvQixJQUFJLEtBQUssTUFBTSxFQUFFLElBQUksT0FBTyxFQUFFO0FBQzlCLE1BQU0sSUFBSSxRQUFRLENBQUM7QUFDbkIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsS0FBSyxJQUFJLEVBQUU7QUFDcEUsUUFBUSxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsYUFBYTtBQUM5QyxVQUFVLE1BQU07QUFDaEIsVUFBVSxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3JCLFVBQVUsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztBQUN0QyxTQUFTLENBQUM7QUFDVixRQUFRLElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUU7QUFDbkMsVUFBVSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztBQUM3QyxVQUFVLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7QUFDekMsVUFBVSxHQUFHLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztBQUNoQyxVQUFVLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0FBQ3pDLFNBQVM7QUFDVCxPQUFPLE1BQU07QUFDYixRQUFRLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUM5RCxVQUFVLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDMUIsU0FBUztBQUNULFFBQVEsUUFBUSxHQUFHLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDN0QsUUFBUSxJQUFJLEdBQUcsR0FBRyxRQUFRLEVBQUU7QUFDNUIsVUFBVSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQzVCLFVBQVUsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLFVBQVUsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUN6QixTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxJQUFJLE9BQU87QUFDWCxNQUFNLFlBQVksRUFBRSxZQUFZO0FBQ2hDLE1BQU0sSUFBSSxFQUFFLGdCQUFnQjtBQUM1QixNQUFNLFFBQVEsRUFBRSxHQUFHO0FBQ25CLE1BQU0sVUFBVSxFQUFFLFVBQVU7QUFDNUIsS0FBSyxDQUFDO0FBQ04sR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLDRCQUE0QixFQUFFO0FBQzVFLElBQUksSUFBSSxHQUFHLEdBQUcsTUFBTSxHQUFHLE1BQU0sR0FBRyxlQUFlLENBQUM7QUFDaEQsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxNQUFNLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQztBQUNwQixPQUFPO0FBQ1AsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUMvQixLQUFLO0FBQ0wsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDOUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDO0FBQ2xCLEtBQUs7QUFDTCxJQUFJLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLElBQUksS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzlDLE1BQU0sS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2hELFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQztBQUNwQixPQUFPO0FBQ1AsTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTCxJQUFJLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQztBQUN4QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDeEIsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO0FBQ2xDLE9BQU8sT0FBTyxDQUFDLDhCQUE4QixFQUFFLEVBQUUsQ0FBQztBQUNsRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDN0IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsT0FBTyxtQkFBbUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFO0FBQ25DLElBQUksSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUN4QztBQUNBLElBQUksTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ3RCO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ1YsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEMsTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLENBQUM7QUFDVixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDaEQsVUFBVSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsU0FBUyxNQUFNO0FBQ2YsVUFBVSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUc7QUFDakMsWUFBWSxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ3BDLFlBQVksSUFBSSxDQUFDLEdBQUc7QUFDcEIsY0FBYyxNQUFNLENBQUMsQ0FBQyxD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QUFDdkIsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEdBQUc7QUFDaEIsUUFBUSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLEdBQUc7QUFDbEIsUUFBUSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxZQUFZLEdBQUc7QUFDbkIsUUFBUSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLFdBQVcsR0FBRztBQUNsQixRQUFRLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEMsUUFBUSxLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUM5QyxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7QUFDM0IsU0FBUztBQUNULFFBQVEsT0FBTyxHQUFHLENBQUM7QUFDbkIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEtBQUssR0FBRztBQUNaLFFBQVEsT0FBTyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEMsS0FBSztBQUNMO0FB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QUFVO0FBQ25DLFFBQVEsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFVBQVU7QUFDbkMsUUFBUSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUNuQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLEdBQUcsS0FBSyxVQUFVO0FBQ25DLFFBQVEsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLFVBQVU7QUFDbEMsUUFBUSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssVUFBVTtBQUN0QyxRQUFRLE9BQU8sQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVO0FBQzFDLFFBQVEsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFVBQVU7QUFDdEMsUUFBUSxPQUFPLENBQUMsQ0FBQyxNQUFNLEtBQUssVUFBVTtBQUN0QyxRQUFRLE9BQU8sQ0FBQyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7QUFDNUMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7QUFDbkMsSUFBSSxRQUFRLE9BQU8sQ0FBQyxLQUFLLFFBQVE7QUFDakMsUUFBUSxDQUFDLEtBQUssSUFBSTtBQUNsQixRQUFRLE1BQU0sS0FBSyxDQUFDLENBQUMsTUFBTTtBQUMzQixRQUFRLE9BQU8sQ0FBQyxDQUFDLE9BQU8sS0FBSyxVQUFVO0FBQ3ZDLFFBQVEsT0FBTyxDQUFDLENBQUMsR0FBRyxLQUFLLFVBQVU7QUFDbkMsUUFBUSxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssVUFBVTtBQUMxQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxVQUFVO0FBQ3RDLFFBQVEsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLFFBQVE7QUFDcEMsUUFBUSxPQUFPLENBQUMsQ0FBQyxHQUFHLEtBQUssVUFBVTtBQUNuQyxRQUFRLE9BQU8sQ0FBQyxDQUFDLEdBQUcsS0FBSyxVQUFVO0FBQ25DLFFBQVEsT0FBTyxDQUFDLENBQUMsRUFBRSxLQUFLLFVBQVU7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S0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDbkc7QUFDQSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDckY7QUFDQSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzVFO0FBQ0EsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUMvRTtBQUNBLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDL0U7QUFDQTtBQUNBLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQztBQUNBLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0M7QUFDQSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0MsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMvQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzNDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM5QyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0MsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMvQyxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQy9DLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0M7QUFDQSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1QyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxJQUFJLEdBQUcsU0FBUyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxFQUFFLElBQUksRUFBRSxHQUFHLFNBQVMsS0FBSyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekQ7QUFDQTtBQUNBLEVBQUUsSUFBSSxXQUFXLEdBQUcsU0FBUyxLQUFLLENBQUMsSUFBSSxFQUFFO0FBQ3pDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLFNBQVMsRUFBRTtBQUNuRCxNQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUMsTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDMUMsVUFBVSxLQUFLLENBQUMsQ0FBQyxDQUFD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TUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ3ZCLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDL0MsSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNqRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtBQUNwRjtBQUNBLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFO0FBQ3RHLFVBQVUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdkMsU0FBUztBQUNUO0FBQ0EsYUFBYSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUU7QUFDN0csVUFBVSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDbEQsVUFBVSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztBQUN2QyxTQUFTO0FBQ1Q7QUFDQSxhQUFhLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxD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MUIsSUFBSSxJQUFJLFFBQVEsR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUlBLE1BQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDeEYsSUFBSSxJQUFJLE1BQU0sS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLE1BQU1BLE1BQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDdEYsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSUEsTUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckcsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSUEsTUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDckcsSUFBSSxJQUFJLElBQUksQ0FBQztBQUNiO0FBQ0E7QUFDQSxJQUFJLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLEVBQUU7QUFDOUMsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELEtBQUs7QUFDTCxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFDMUMsTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxD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SUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0M7QUFDQSxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQzlCLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDM0IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ2Q7QUFDQSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3pDO0FBQ0E7QUFDQSxJQUFJLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUMvQyxJQUFJLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUMzQztBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO0FBQzFCLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDdEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU7QUFDakIsSUFBSSxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDL0M7QUFDQSxJQUFJLE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUM7QUFDakM7QUFDQTtBQUNBLElBQUksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDdkMsSUFBSSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztBQUNuQztBQUNBLElBQUksTUFBTSxPQUFPLEdBQUc7QUFDcEIsTUFBTSxTQUFTLEVBQUUsS0FBSztBQUN0QixNQUFNLE1BQU0sRUFBRSxJQUFJO0FBQ2xCLE1BQU0sS0FBSyxFQUFFLElBQUk7QUFDakIsS0FBSyxDQUFDO0FBQ04sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxpQkFBaUIsRUFBRSxTQUFTLEVBQUU7QUFDdkMsRUFBRSxJQUFJLFNBQVMsSUFBSSxZQUFZLElBQUksU0FBUyxJQUFJLFVBQVUsRUFBRTtBQUM1RCxJQUFJLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hHLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLFlBQVUsR0FBRztBQUN0QixFQUFFLE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3hCO0FBQ0EsRUFBRSxPQUFPO0FBQ1QsSUFBSSxFQUFFLEVBQUUsSUFBSTtBQUNaLElBQUksR0FBRyxFQUFFLElBQUk7QUFDYixJQUFJLE9BQU8sRUFBRSxJQUFJO0FBQ2pCLElBQUksSUFBSSxFQUFFLElBQUk7QUFDZDtBQUNBLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtBQUNYLE1BQU0sT0FBTztBQUNiLFFBQVEsR0FBRyxFQUFFLElBQUk7QUFDakIsT0FBTyxDQUFDO0FBQ1IsS0FBSztBQUNMLEdBQUcsQ0FBQztBQUNKLENBQUM7QUFDRDtBQUNBLElBQUksY0FBYyxDQUFDO0FBQ25CO0FBQ0EsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7QUFDbkMsRUFBRSxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUl2QixNQUFRLENBQUM7QUFDakQsRUFBRSxjQUFjLEdBQUd3QixXQUFpQixDQUFDLFNBQVMsRUFBRTtBQUNoRCxJQUFJLGNBQWMsRUFBRSxPQUFPO0FBQzNCLEdBQUcsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxNQUFNO0FBQ1AsRUFBRSxjQUFjLEdBQUc7QUFDbkIsRUFBRUQsWUFBVSxFQUFFLENBQUM7QUFDZixDQUFDO0FBQ0Q7QUFDQSxJQUFJN0IsUUFBTSxHQUFHLGNBQWMsQ0FBQztBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQ3BDLEVBQUUsUUFBUSxDQUFDLFlBQVksR0FBRyxVQUFVLEtBQUssRUFBRTtBQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUN2QixNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0wsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO0FBQ3RDLEVBQUUsUUFBUSxDQUFDLFlBQVksR0FBRyxVQUFVLEtBQUssRUFBRTtBQUMzQyxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtBQUN2QixNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0wsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsK0JBQStCLEVBQUUsZUFBZSxFQUFFO0FBQzNELEVBQUUsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUM7QUFDckM7QUFDQSxFQUFFLGVBQWUsQ0FBQyxjQUFjLEdBQUcsV0FBVztBQUM5QztBQUNBLElBQUksT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDaEMsR0FBRyxDQUFDO0FBQ0o7QUFDQSxFQUFFLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sUUFBUSxDQUFDO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUM3RCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBS3lCLFFBQU0sQ0FBQztBQUN4RCxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDMUM7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDakMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNoQyxJQUFJLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzlCO0FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztBQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEI7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQzNDO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0FBQzdCLElBQUksSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDL0IsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztBQUM5QixJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUNwQyxNQUFNLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0FBQ3JDLEtBQUs7QUFDTCxTQUFTLElBQUksV0FBVyxJQUFJLFNBQVMsRUFBRTtBQUN2QyxNQUFNLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDNUIsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7QUFDbEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsU0FBUyxDQUFDLE1BQU0sRUFBRTtBQUNwQixJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ3pCO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3JELElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFDcEIsSUFBSSxNQUFNLGFBQWEsR0FBR0csTUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBR0EsTUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDekQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRTtBQUNwQyxJQUFJLElBQUksRUFBRSxLQUFLLFlBQVksSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLFlBQVksSUFBSSxDQUFDLEVBQUU7QUFDNUQsTUFBTSxPQUFPLCtDQUErQyxDQUFDO0FBQzdELEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDbkYsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM3RTtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3hCLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2QyxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxLQUFLLEdBQUc7QUFDVixJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN2QyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsWUFBWSxHQUFHO0FBQ2pCO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxNQUFNLEVBQUU7QUFDOUIsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5QixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSztBQUN0QixNQUFNLEtBQUssTUFBTTtBQUNqQixRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQ25GLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoRCxNQUFNLEtBQUssTUFBTSxDQUFDO0FBQ2xCLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFDakIsTUFBTSxLQUFLLFNBQVMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxNQUFNLEtBQUssTUFBTSxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25ELE1BQU0sS0FBSyxRQUFRLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkQsTUFBTSxLQUFLLFFBQVEsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4RDtBQUNBLEtBQUs7QUFDTDtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRTtBQUN4QjtBQUNBLE1BQU0sS0FBSyxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMvQyxNQUFNLFFBQVEsSUFBSSxDQUFDLEtBQUs7QUFDeEIsUUFBUSxLQUFLLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQ3BILFFBQVEsS0FBSyxRQUFRLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUN6RyxRQUFRLEtBQUssUUFBUSxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDekcsUUFBUSxLQUFLLE1BQU0sVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ3JHLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDdkIsUUFBUSxLQUFLLEtBQUssV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ3hHLFFBQVEsS0FBSyxNQUFNLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUNuRyxRQUFRLEtBQUssT0FBTyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU07QUFDdEcsUUFBUSxLQUFLLE1BQU0sVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ25HLE9BQU87QUFDUCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUM5QyxVQUFVLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM3RyxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxPQUFPLEdBQUc7QUFDWixJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQzNELEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHO0FBQ1QsSUFBSSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBLElBQUksUUFBUSxJQUFJLENBQUMsS0FBSztBQUN0QixNQUFNLEtBQUssYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQzdFLE1BQU0sS0FBSyxRQUFRLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDeEUsTUFBTSxLQUFLLFFBQVEsUUFBUSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUN4RSxNQUFNLEtBQUssTUFBTTtBQUNqQixRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUM7QUFDQSxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDdEMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUUsU0FBUyxNQUFNO0FBQ2YsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7QUFDdEQsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNuRixXQUFXO0FBQ1gsU0FBUztBQUNULFFBQVEsTUFBTTtBQUNkLE1BQU0sS0FBSyxTQUFTLENBQUM7QUFDckIsTUFBTSxLQUFLLEtBQUssV0FBVyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTTtBQUNyRSxNQUFNLEtBQUssTUFBTTtBQUNqQixRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekMsVUFBVSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQyxVQUFVLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUMsU0FBUyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssS0FBSyxFQUFFO0FBQzFELFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5QyxTQUFTLE1BQU07QUFDZixVQUFVLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEQsVUFBVSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNsQyxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3BELFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNoRCxXQUFXLE1BQU07QUFDakIsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsV0FBVztBQUNYLFNBQVM7QUFDVCxRQUFRLE1BQU07QUFDZCxNQUFNLEtBQUssT0FBTyxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ3ZFLE1BQU0sS0FBSyxNQUFNLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU07QUFDdEUsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO0FBQ3hCO0FBQ0EsTUFBTSxRQUFRLElBQUksQ0FBQyxLQUFLO0FBQ3hCLFFBQVEsS0FBSyxhQUFhLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQ2pKLFFBQVEsS0FBSyxRQUFRLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQ2xJLFFBQVEsS0FBSyxRQUFRLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQ2pJLFFBQVEsS0FBSyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQzVILFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDdkIsUUFBUSxLQUFLLEtBQUssV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQy9GLFFBQVEsS0FBSyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO0FBQzdGLFFBQVEsS0FBSyxPQUFPLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNO0FBQ2hHLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksRUFBRTtBQUN4QyxNQUFNLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN2QyxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7QUFDN0IsSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztBQUMvQixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQzlCO0FBQ0EsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNqRCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsVUFBVSxHQUFHO0FBQ2YsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDaEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxRQUFRLENBQUMsTUFBTSxFQUFFO0FBQ25CLElBQUksSUFBSSxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsS0FBSyxJQUFJLFFBQVEsRUFBRTtBQUNuRCxNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztBQUNoQyxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDcEQsTUFBTSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUM3QixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUU7QUFDdkIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQztBQUM1QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsY0FBYyxDQUFDLFdBQVcsRUFBRTtBQUM5QixJQUFJLElBQUksV0FBVyxJQUFJLFNBQVMsRUFBRTtBQUNsQyxNQUFNLE9BQU87QUFDYixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsSUFBSSxNQUFNLFFBQVEsVUFBVSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzNELElBQUksTUFBTSxTQUFTLFNBQVMsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELElBQUksTUFBTSxPQUFPLFdBQVcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDakQsSUFBSSxNQUFNLFFBQVEsVUFBVSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQzVDLElBQUksTUFBTSxVQUFVLFFBQVEsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3ZDLElBQUksTUFBTSxVQUFVLFFBQVEsSUFBSSxDQUFDLENBQUM7QUFDbEMsSUFBSSxNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQjtBQUNBO0FBQ0EsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEdBQUcsV0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQzNGLElBQUksSUFBSSxRQUFRLENBQUMsR0FBRyxHQUFHLFdBQVcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMxRixJQUFJLElBQUksUUFBUSxDQUFDLEdBQUcsR0FBRyxXQUFXLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7QUFDMUYsSUFBSSxJQUFJLFFBQVEsQ0FBQyxFQUFFLEdBQUcsV0FBVyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLElBQUksSUFBSSxRQUFRLENBQUMsRUFBRSxHQUFHLFdBQVcsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN6RixJQUFJLElBQUksUUFBUSxDQUFDLENBQUMsR0FBRyxXQUFXLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEYsSUFBSSxJQUFJLFFBQVEsR0FBRyxXQUFXLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEYsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLElBQUksSUFBSSxTQUFTLEdBQUcsV0FBVyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLElBQUksSUFBSSxPQUFPLENBQUMsQ0FBQyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN0SCxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsR0FBRyxXQUFXLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEYsSUFBSSxJQUFJLE9BQU8sR0FBRyxXQUFXLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEYsSUFBSSxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsV0FBVyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3hGLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxHQUFHLFdBQVcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RixJQUFJLElBQUksUUFBUSxHQUFHLFdBQVcsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RixJQUFJLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxXQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDekYsSUFBSSxJQUFJLFVBQVUsQ0FBQyxFQUFFLEdBQUcsV0FBVyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ3pGLElBQUksSUFBSSxVQUFVLENBQUMsQ0FBQyxHQUFHLFdBQVcsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RixJQUFJLElBQUksVUFBVSxHQUFHLFdBQVcsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN4RixJQUFJLElBQUksVUFBVSxDQUFDLEVBQUUsR0FBRyxXQUFXLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEdB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LENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFO0FBQzNDLElBQUksSUFBSSxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUU7QUFDM0MsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixLQUFLO0FBQ0wsSUFBSSxJQUFJLFNBQVMsQ0FBQztBQUNsQixJQUFJLElBQUksS0FBSyxDQUFDO0FBQ2QsSUFBSSxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO0FBQy9CLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixNQUFNLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0FBQzNFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNqRSxLQUFLO0FBQ0wsU0FBUyxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRTtBQUN6RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDM0UsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxR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QUFDO0FBQzNCLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNoRixNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3pELEtBQUs7QUFDTDtBQUNBLElBQUksTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7QUFDckQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDdEUsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7QUFDL0MsS0FBSztBQUNMO0FBQ0EsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDaEQsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxxQkFBcUIsR0FBRztBQUMxQixJQUFJLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztBQUNwQixJQUFJLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtBQUN0QixNQUFNLEtBQUssTUFBTSxRQUFRLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtBQUMzQyxRQUFRLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksRUFB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QUUsRUFBRSxDQUFDO0FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0FBQ1QsTUFBTSxPQUFPLE1BQU0sQ0FBQztBQUNwQixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDekIsTUFBTSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHO0FBQ1QsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzNCO0FBQ0EsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUM7QUFDM0MsV0FBVyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0U7QUFDQSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUM3QyxXQUFXLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5RTtBQUNBLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBQzNDLFdBQVcsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNFO0FBQ0EsTUFBTSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUM3QixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxZQUFZLEdBQUc7QUFDakIsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztBQUNqQztBQUNBLElBQUksTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsS0FBSyxLQUFLO0FBQ3pELE1BQU0sSUFBSSxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUUsT0FBTztBQUNyRDtBQUNBLE1BQU0sTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUM7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQzNCLFFBQVEsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2hFLFFBQVEsT0FBTztBQUNmLE9BQU87QUFDUDtBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDM0IsUUFBUSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsUUFBUSxPQUFPO0FBQ2YsT0FBTztBQUNQO0FBQ0EsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRSxLQUFLLENBQUM7QUFDTixJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDMUQsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzFELElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM3RCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsV0FBVyxHQUFHO0FBQ2hCLElBQUksTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RCxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN2RixJQUFJLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUM1QyxJQUFJLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUMxQztBQUNBLElBQUksSUFBSSxLQUFLLElBQUksT0FBTyxFQUFFO0FBQzFCO0FBQ0EsTUFBTSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ3JDLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQ3JDLE1BQU0sSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdB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LEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRTtBQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3pCLE1BQU0sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3RDLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLElBQUksR0FBRztBQUNULElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO0FBQ3hCLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7QUFDckMsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUQsT0FBTztBQUNQO0FBQ0EsTUFBTSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUM3QixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLFdBQVcsR0FBRztBQUNoQixJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQ7QUFDQSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMxQixNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUNoRCxLQUFLLE1BQU07QUFDWCxNQUFNLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztBQUMvQyxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsV0FBVyxHQUFHO0FBQ2hCLElBQUksTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0FBQ3RELElBQUksSUFBSSxXQUFXLElBQUksS0FBSyxFQUFFO0FBQzlCLE1BQU0sSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0FBQzdCLEtBQUs7QUFDTCxTQUFTO0FBQ1QsTUFBTSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUNoRSxLQUFLO0FBQ0w7QUFDQSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztBQUN4QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsWUFBWSxHQUFHO0FBQ2pCLElBQUksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7QUFDaEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGFBQWEsR0FBRztBQUNsQixJQUFJLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO0FBQ2hDLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sU0FBUyxTQUFTLElBQUksQ0FBQztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUU7QUFDekMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNyQyxJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUc7QUFDakIsTUFBTSxPQUFPLEVBQUU7QUFDZixRQUFRLEtBQUssRUFBRSxDQUFDO0FBQ2hCLE9BQU87QUFDUCxLQUFLLENBQUM7QUFDTixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQzFCO0FBQ0EsSUFBSSxJQUFJLElBQUksRUFBRTtBQUNkLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsRUFBRTtBQUNuQyxRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLE9BQU87QUFDUCxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUU7QUFDakMsUUFBUSxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsK0JBQStCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRSxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsU0FBUyxDQUFDLEtBQUssRUFBRTtBQUNuQixJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUN0QixNQUFNLE9BQU8sS0FBSyxDQUFDO0FBQ25CLEtBQUs7QUFDTDtBQUNBLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFFLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxpQkFBaUIsR0FBRztBQUN0QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQ25CO0FBQ0EsTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNwQjtBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxtQkFBbUIsQ0FBQztBQUNyRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9DO0FBQ0E7QUFDQSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsd0JBQXdCLENBQUM7QUFDakUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUN0RDtBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLGtCQUFrQixDQUFDO0FBQ3RELE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDbkQ7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDO0FBQ0EsTUFBTSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztBQUN4QixLQUFLO0FBQ0w7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsaUJBQWlCLEdBQUc7QUFDdEIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtBQUN0QixNQUFNLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztBQUNoRSxLQUFLO0FBQ0wsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO0FBQ2xDLE1BQU0sTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO0FBQ3BELE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUN2QixRQUFRLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztBQUMxRixPQUFPO0FBQ1AsTUFBTSxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDM0MsS0FBSztBQUNMLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7QUFDMUIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLHlCQUF5QixHQUFHO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDcEIsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0MsTUFBTSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMvQyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0QztBQUNBLE1BQU0sTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMvRTtBQUNBO0FBQ0EsTUFBTSxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFO0FBQy9FLFdBQVcsSUFBSSxDQUFDLFFBQVEsR0FBRyxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2hELFdBQVcsUUFBUSxHQUFHLGVBQWUsR0FBRyxlQUFlLENBQUMsQ0FBQztBQUN6RCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztBQUM5RDtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBQy9DLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxzQkFBc0IsR0FBRztBQUMzQjtBQUNBLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQ2xGLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDO0FBQ3hGLElBQUksT0FBTztBQUNYLE1BQU0sT0FBTyxFQUFFO0FBQ2YsUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVztBQUMzQyxPQUFPO0FBQ1AsTUFBTSxHQUFHLEVBQUU7QUFDWCxRQUFRLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZO0FBQ3pDLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUseUJBQXlCLENBQUMsS0FBSyxFQUFFO0FBQ25DLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBQ25ELElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztBQUNuQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDdkIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLHNCQUFzQixHQUFHO0FBQzNCLElBQUksSUFBSSxDQUFDLCtCQUErQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUM1QyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0FBQzlCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7QUFDNUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztBQUM3QixHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO0FBQ3RCLElBQUksSUFBSSxLQUFLLENBQUM7QUFDZCxJQUFJLE1BQU0sS0FBSyxHQUFHO0FBQ2xCO0FBQ0EsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUN2QztBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUN2QztBQUNBO0FBQ0EsTUFBTSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztBQUMvQztBQUNBLE1BQU0sTUFBTTtBQUNaLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3hCLFVBQVUsS0FBSyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUMzRCxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0EsTUFBTSxNQUFNO0FBQ1osUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDeEIsVUFBVSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNELFNBQVM7QUFDVCxPQUFPO0FBQ1A7QUFDQTtBQUNBLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDNUMsS0FBSyxDQUFDO0FBQ047QUFDQSxJQUFJLElBQUksV0FBVyxFQUFFO0FBQ3JCLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFDbkIsS0FBSyxNQUFNO0FBQ1gsTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUNqQixNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJO0FBQzFCLFFBQVEsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3RCLE9BQU8sQ0FBQyxDQUFDO0FBQ1QsTUFBTSxPQUFPLE1BQU0sQ0FBQztBQUNwQixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO0FBQ3BCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDekIsTUFBTSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdEMsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHO0FBQ1QsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7QUFDeEIsTUFBTSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztBQUMvQjtBQUNBLE1BQU0sSUFBSSxHQUFHLENBQUMsVUFBVSxFQUFFO0FBQzFCLFFBQVEsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEMsT0FBTztBQUNQO0FBQ0EsTUFBTSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztBQUM3QixLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSxXQUFXLENBQUMsU0FBUyxFQUFFO0FBQ3pCLElBQUksTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7QUFDMUMsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELElBQUksSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN0RCxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztBQUN2RixJQUFJLElBQUksb0JBQW9CLENBQUM7QUFDN0IsSUFBSSxJQUFJLFlBQVksQ0FBQztBQUNyQjtBQUNBO0FBQ0E7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxLQUFLLFNBQVMsS0FBSyxTQUFTLElBQUksU0FBUyxLQUFLLElBQUksQ0FBQyxFQUFFO0FBQzFGLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEVBQUU7QUFDaEMsUUFBUSxLQUFLLEdBQUcsQ0FBQyxXQUFXLENBQUM7QUFDN0IsT0FBTztBQUNQLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFdBQVcsRUFBRTtBQUNqQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO0FBQzlCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUU7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtBQUN2QixNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDNUIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQixPQUFPLE1BQU07QUFDYixRQUFRLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0FBQzFCLE9BQU87QUFDUCxNQUFNLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUN2RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsU0FBUztBQUNULE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUM1QixRQUFRLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQzNCLE9BQU8sTUFBTTtBQUNiLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7QUFDMUIsT0FBTztBQUNQLE1BQU0sSUFBSSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7QUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENB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QUFDNUIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUMzQjtBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JELE9BQU8sTUFBTTtBQUNiLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7QUFDMUI7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRCxPQUFPO0FBQ1AsS0FBSyxNQUFNO0FBQ1g7QUFDQSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDNUIsUUFBUSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztBQUM1QztBQUNBO0FBQ0EsUUFBUSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3JELE9BQU8sTUFBTTtBQUNiLFFBQVEsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDM0M7QUFDQTtBQUNBLFFBQVEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRCxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLHFCQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUU7QUFDcEMsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENB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QyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO0FBQzlFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDUjtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDckYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRixJQUFJLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELElBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEtBQUssR0FBRyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDMUY7QUFDQSxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3ZEO0FBQ0EsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEtB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Q0FBQztBQUMxRCxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7QUFDdEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDbEUsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsSUFBSSxHQUFHO0FBQ1Q7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7QUFDcEMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdkQsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDbkMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRSxLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRTtBQUN2QyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDNUIsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0QsT0FBTyxNQUFNO0FBQ2IsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFB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LEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixLQUFLO0FBQ0w7QUFDQTtBQUNBLElBQUksSUFBSSxDQUFDLENBQUM7QUFDVixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxNQUFNLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxNQUFNLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7QUFDaEQsVUFBVSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUMsU0FBUyxNQUFNO0FBQ2YsVUFBVSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7QUFDekMsY0FBYyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyxDQUFDO0FBQ3pDLEdBQUc7QUFDSCxDQUFDLENBQUM7QUFDRjtBQUNBLElBQUlFLFlBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUs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USxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkUsT0FBTztBQUNQLFdBQVcsSUFBSUEsTUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDakQsUUFBUSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0UsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEYsT0FBTztBQUNQLFdBQVcsSUFBSUEsTUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDaEQsUUFBUSxJQUFJLE1BQU0sR0FBR0EsTUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQyxRQUFRLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzRCxPQUFPO0FBQ1AsS0FBSztBQUNMLFNBQVM7QUFDVCxNQUFNLElBQUksS0FBSyxZQUFZLE1BQU0sRUFBRTtBQUNuQyxRQUFRLElBQUksS0FBSyxDQUFDLENB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LFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDcEQsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxxQkFBcUIsQ0FBQztBQUN0RCxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQztBQUM1QyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hEO0FBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDaEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDL0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDOUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDNUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDN0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakQ7QUFDQSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUM5QyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM3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R0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQixJQUFJLElBQUksQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzVCLElBQUksSUFBSSxHQUFHLEdBQUdBLE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RSxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2QsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLElBQUksSUFBSSxJQUFJLEdBQUdBLE1BQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUM3QixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ3RCO0FBQ0E7QUFDQSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3pLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMs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RyxVQUFVLENBQUMsQ0FBQztBQUNoRCxFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ2pEO0FBQ0EsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUM1RDtBQUNBLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsVUFBVSxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsU0FBUyxHQUFHLFVBQVUsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQy9LLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLFNBQVMsR0FBRyxVQUFVLEVBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNuTDtBQUNBLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO0FBQ2hELElBQUksSUFBSSxhQUFhLEdBQUc7QUFDeEIsTUFBTSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSztBQUMzQyxNQUFNLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNO0FBQzdDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFD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Q0FBQyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLEdBQUcsR0FBRztBQUNkLFlBQVksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDO0FBQ3RGLFlBQVksUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDO0FBQ3RGLFNBQVMsQ0FBQztBQUNWLFFBQVEsR0FBRyxHQUFHO0FBQ2QsWUFBWSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDO0FBQ3RGLFlBQVksUUFBUSxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQztBQUN0RixTQUFTLENBQUM7QUFDVjtBQUNBO0FBQ0EsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNqRCxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDakQsS0FBSztBQUNMO0FBQ0EsSUFBSSxPQUFPLENBQUMsQ0FBQztBQUNiLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzFDLElBQUksSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0FBQ2xELElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDM0MsUUFBUSxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QyxLQUFLO0FBQ0wsU0FBUztBQUNULFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDN0QsUUFBUSxJQUFJLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0FBQzlELFFBQVEsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ25CLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNqRixRQUFRLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDakMsUUFBUSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QztBQUNBLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDekIsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM3QixZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JEO0FBQ0EsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVHLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1RyxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFD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RSxDQUFDO0FBQ2hCLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsSUFBSSxhQUFhLEVBQUU7QUFDN0csTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN4QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQzlDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDakQsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxJQUFJLElBQUksQ0FBQztBQUN6RSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ3pDLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUM7QUFDcEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLEtBQUs7QUFDTCxTQUFTO0FBQ1QsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUN6QyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO0FBQy9DLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNB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USxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDMUQsTUFBTSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDdEQsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDdkQsTUFBTSxLQUFLLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDeEQsTUFBTSxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDMUQsTUFBTSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUM7QUFDdkQsTUFBTSxRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0FBQ2xDLEtBQUs7QUFDTCxJQUFJLFdBQVcsRUFBRTtBQUNqQixNQUFNLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUM5RCxNQUFNLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUN6RCxNQUFNLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUN6RCxNQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUN2RCxNQUFNLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUMxRCxNQUFNLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUN0RCxNQUFNLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQztBQUN2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QVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsRUFBRTtBQUN0TCxHQUFHO0FBQ0gsT0FBTztBQUNQLElBQUksT0FBTyxLQUFLLENBQUM7QUFDakIsR0FBRztBQUNILENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxXQUFXO0FBQzVDLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDO0FBQ2pCO0FBQ0E7QUFDQSxFQUFFLEtBQUssSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7QUFDN0MsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsRUFBRTtBQUN2RCxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtBQUMxRCxRQUFRLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2xGLFVBQVUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLFVBQVUsSUFBSSxLQUFLLEdBQUdSLE1BQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM3RCxVQUFVLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDaEUsVUFBVSxHQUFHLEdBQUcsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ2hFLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBLEVBQUUsT0FBTztBQUNULElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0FBQzdDLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJO0FBQzdDLEdBQUcsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLENBQUMsU0FBUyxDQUFDLGtCQUFrQixHQUFHLFVBQVUsS0FBSyxFQUFFO0FBQ3hELEVBQUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQzlELEVBQUUsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQzlELEVBQUUsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHQSxNQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbkUsRUFBRSxJQUFJLENBQUMsR0FBRyxPQUFPLEdBQUdBLE1BQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNsRSxFQUFFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0I7QUFDQSxFQUFFLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxRDtBQUNBLEVBQUUsSUFBSSxPQUFPLEdBQUdBLE1BQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDdEMsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7QUFDbEIsRUFBRSxJQUFJQSxNQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMxRixPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSUEsTUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUM7QUFDckcsT0FBTyxJQUFJQSxNQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUM7QUFDL0YsT0FBTyxJQUFJQSxNQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLENBQUM7QUFDL0YsT0FBTyxJQUFJQSxNQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLENBQUM7QUFDNUYsT0FBTyxJQUFJQSxNQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFD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LFVBQVUsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTzRDLGNBQU0sQ0FBQ0EsY0FBTSxDQUFDLFdBQVcsRUFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sVUFBVSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFNLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLHlDQUF5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLE9BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsTUFBTSxTQUFTLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsR0FBRSxDQUFDLENBQUMsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFNLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksYUFBYSxDQUFDLFVBQVUsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU0sVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEtBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQyxNQUFNLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU0sUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLFdBQVcsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLE1BQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxJQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxXQUFXLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsK0NBQStDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLCtDQUErQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxZQUFZLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxLQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsMklBQTJJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzSUFBc0ksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3htaUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxFQUFFLEVBQUUsQ0FBQyxPQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsMkRBQTJELENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxPQUFPLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLHVDQUF1QyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMscUNBQXFDLENBQUMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsT0FBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxPQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEdBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLDJDQUEyQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsdUlBQXVJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUUsQ0FBQyxHQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFVLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEdBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFNLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEdBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxZQUFZLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxDQUFDLEtBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxTQUFTLE9BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxHQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLGdEQUFnRCxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLG1CQUFtQixJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU0sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsWUFBWSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEdBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsb0RBQW9ELENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLGNBQWMsQ0FBQywyREFBMkQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLE9BQU8sTUFBTSxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsV0FBVyxFQUFFLE9BQU8sUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLFFBQVEsQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDBHQUEwRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMscUhBQXFILENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsdUlBQXVJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsdUlBQXVJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsV0FBVyxFQUFFLE9BQU8sT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUUsT0FBTyxLQUFLLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsa0RBQWtELENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQyxPQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsS0FBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxHQUFHLENBQUMsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksU0FBUyxDQUFDLHVJQUF1SSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFdBQVcsRUFBRSxPQUFPLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLE9BQU8sS0FBSyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLDhDQUE4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDOzs7O0FDaEM3ODdELElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFD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